Fossil SCM

Add the new colorized diff logic to file and wiki diffs in addition to version diffs.

drh 2012-02-04 21:38 trunk
Commit 96f1975ce22236d8984e51b82629846fedb76e84
2 files changed +10 -7 +6 -4
+10 -7
--- src/info.c
+++ src/info.c
@@ -352,11 +352,11 @@
352352
353353
/*
354354
** Construct an appropriate diffFlag for text_diff() based on query
355355
** parameters and the to boolean arguments.
356356
*/
357
-static int construct_diff_flags(int showDiff, int sideBySide){
357
+int construct_diff_flags(int showDiff, int sideBySide){
358358
int diffFlags;
359359
if( showDiff==0 ){
360360
diffFlags = 0; /* Zero means do not show any diff */
361361
}else{
362362
int x;
@@ -1074,10 +1074,11 @@
10741074
int sideBySide;
10751075
Blob c1, c2, diff, *pOut;
10761076
char *zV1;
10771077
char *zV2;
10781078
int diffFlags;
1079
+ const char *zStyle;
10791080
10801081
login_check_credentials();
10811082
if( !g.perm.Read ){ login_needed(); return; }
10821083
v1 = name_to_rid_www("v1");
10831084
v2 = name_to_rid_www("v2");
@@ -1091,19 +1092,21 @@
10911092
cgi_set_content_type("text/plain");
10921093
diffFlags = 4;
10931094
}else{
10941095
blob_zero(&diff);
10951096
pOut = &diff;
1097
+ diffFlags = construct_diff_flags(1, sideBySide);
10961098
if( sideBySide ){
1097
- diffFlags = DIFF_IGNORE_EOLWS | DIFF_SIDEBYSIDE | 7;
1099
+ zStyle = "sbsdiff";
10981100
}else{
1099
- diffFlags = DIFF_IGNORE_EOLWS | 7;
1101
+ diffFlags |= DIFF_LINENO;
1102
+ zStyle = "udiff";
11001103
}
11011104
}
11021105
content_get(v1, &c1);
11031106
content_get(v2, &c2);
1104
- text_diff(&c1, &c2, pOut, diffFlags);
1107
+ text_diff(&c1, &c2, pOut, diffFlags | DIFF_HTML );
11051108
blob_reset(&c1);
11061109
blob_reset(&c2);
11071110
if( !isPatch ){
11081111
style_header("Diff");
11091112
style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch",
@@ -1122,13 +1125,13 @@
11221125
@ Artifact <a href="%s(g.zTop)/artifact/%S(zV1)">[%S(zV1)]</a>:</h2>
11231126
object_description(v1, 0, 0);
11241127
@ <h2>To Artifact <a href="%s(g.zTop)/artifact/%S(zV2)">[%S(zV2)]</a>:</h2>
11251128
object_description(v2, 0, 0);
11261129
@ <hr />
1127
- @ <pre style="while-space:pre;">
1128
- @ %h(blob_str(&diff))
1129
- @ </pre>
1130
+ @ <div class="%s(zStyle)">
1131
+ @ %s(blob_str(&diff))
1132
+ @ </div>
11301133
blob_reset(&diff);
11311134
style_footer();
11321135
}
11331136
}
11341137
11351138
--- src/info.c
+++ src/info.c
@@ -352,11 +352,11 @@
352
353 /*
354 ** Construct an appropriate diffFlag for text_diff() based on query
355 ** parameters and the to boolean arguments.
356 */
357 static int construct_diff_flags(int showDiff, int sideBySide){
358 int diffFlags;
359 if( showDiff==0 ){
360 diffFlags = 0; /* Zero means do not show any diff */
361 }else{
362 int x;
@@ -1074,10 +1074,11 @@
1074 int sideBySide;
1075 Blob c1, c2, diff, *pOut;
1076 char *zV1;
1077 char *zV2;
1078 int diffFlags;
 
1079
1080 login_check_credentials();
1081 if( !g.perm.Read ){ login_needed(); return; }
1082 v1 = name_to_rid_www("v1");
1083 v2 = name_to_rid_www("v2");
@@ -1091,19 +1092,21 @@
1091 cgi_set_content_type("text/plain");
1092 diffFlags = 4;
1093 }else{
1094 blob_zero(&diff);
1095 pOut = &diff;
 
1096 if( sideBySide ){
1097 diffFlags = DIFF_IGNORE_EOLWS | DIFF_SIDEBYSIDE | 7;
1098 }else{
1099 diffFlags = DIFF_IGNORE_EOLWS | 7;
 
1100 }
1101 }
1102 content_get(v1, &c1);
1103 content_get(v2, &c2);
1104 text_diff(&c1, &c2, pOut, diffFlags);
1105 blob_reset(&c1);
1106 blob_reset(&c2);
1107 if( !isPatch ){
1108 style_header("Diff");
1109 style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch",
@@ -1122,13 +1125,13 @@
1122 @ Artifact <a href="%s(g.zTop)/artifact/%S(zV1)">[%S(zV1)]</a>:</h2>
1123 object_description(v1, 0, 0);
1124 @ <h2>To Artifact <a href="%s(g.zTop)/artifact/%S(zV2)">[%S(zV2)]</a>:</h2>
1125 object_description(v2, 0, 0);
1126 @ <hr />
1127 @ <pre style="while-space:pre;">
1128 @ %h(blob_str(&diff))
1129 @ </pre>
1130 blob_reset(&diff);
1131 style_footer();
1132 }
1133 }
1134
1135
--- src/info.c
+++ src/info.c
@@ -352,11 +352,11 @@
352
353 /*
354 ** Construct an appropriate diffFlag for text_diff() based on query
355 ** parameters and the to boolean arguments.
356 */
357 int construct_diff_flags(int showDiff, int sideBySide){
358 int diffFlags;
359 if( showDiff==0 ){
360 diffFlags = 0; /* Zero means do not show any diff */
361 }else{
362 int x;
@@ -1074,10 +1074,11 @@
1074 int sideBySide;
1075 Blob c1, c2, diff, *pOut;
1076 char *zV1;
1077 char *zV2;
1078 int diffFlags;
1079 const char *zStyle;
1080
1081 login_check_credentials();
1082 if( !g.perm.Read ){ login_needed(); return; }
1083 v1 = name_to_rid_www("v1");
1084 v2 = name_to_rid_www("v2");
@@ -1091,19 +1092,21 @@
1092 cgi_set_content_type("text/plain");
1093 diffFlags = 4;
1094 }else{
1095 blob_zero(&diff);
1096 pOut = &diff;
1097 diffFlags = construct_diff_flags(1, sideBySide);
1098 if( sideBySide ){
1099 zStyle = "sbsdiff";
1100 }else{
1101 diffFlags |= DIFF_LINENO;
1102 zStyle = "udiff";
1103 }
1104 }
1105 content_get(v1, &c1);
1106 content_get(v2, &c2);
1107 text_diff(&c1, &c2, pOut, diffFlags | DIFF_HTML );
1108 blob_reset(&c1);
1109 blob_reset(&c2);
1110 if( !isPatch ){
1111 style_header("Diff");
1112 style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch",
@@ -1122,13 +1125,13 @@
1125 @ Artifact <a href="%s(g.zTop)/artifact/%S(zV1)">[%S(zV1)]</a>:</h2>
1126 object_description(v1, 0, 0);
1127 @ <h2>To Artifact <a href="%s(g.zTop)/artifact/%S(zV2)">[%S(zV2)]</a>:</h2>
1128 object_description(v2, 0, 0);
1129 @ <hr />
1130 @ <div class="%s(zStyle)">
1131 @ %s(blob_str(&diff))
1132 @ </div>
1133 blob_reset(&diff);
1134 style_footer();
1135 }
1136 }
1137
1138
+6 -4
--- src/wiki.c
+++ src/wiki.c
@@ -593,10 +593,11 @@
593593
char *zTitle;
594594
int rid1, rid2;
595595
const char *zPageName;
596596
Manifest *pW1, *pW2 = 0;
597597
Blob w1, w2, d;
598
+ int diffFlags;
598599
599600
login_check_credentials();
600601
rid1 = atoi(PD("a","0"));
601602
if( !g.perm.History ){ login_needed(); return; }
602603
if( rid1==0 ) fossil_redirect_home();
@@ -621,14 +622,15 @@
621622
blob_zero(&w2);
622623
if( rid2 && (pW2 = manifest_get(rid2, CFTYPE_WIKI))!=0 ){
623624
blob_init(&w2, pW2->zWiki, -1);
624625
}
625626
blob_zero(&d);
626
- text_diff(&w2, &w1, &d, 5 | DIFF_IGNORE_EOLWS);
627
- @ <pre>
628
- @ %h(blob_str(&d))
629
- @ </pre>
627
+ diffFlags = construct_diff_flags(1,0);
628
+ text_diff(&w2, &w1, &d, diffFlags | DIFF_HTML | DIFF_LINENO);
629
+ @ <div class="udiff">
630
+ @ %s(blob_str(&d))
631
+ @ </div>
630632
manifest_destroy(pW1);
631633
manifest_destroy(pW2);
632634
style_footer();
633635
}
634636
635637
--- src/wiki.c
+++ src/wiki.c
@@ -593,10 +593,11 @@
593 char *zTitle;
594 int rid1, rid2;
595 const char *zPageName;
596 Manifest *pW1, *pW2 = 0;
597 Blob w1, w2, d;
 
598
599 login_check_credentials();
600 rid1 = atoi(PD("a","0"));
601 if( !g.perm.History ){ login_needed(); return; }
602 if( rid1==0 ) fossil_redirect_home();
@@ -621,14 +622,15 @@
621 blob_zero(&w2);
622 if( rid2 && (pW2 = manifest_get(rid2, CFTYPE_WIKI))!=0 ){
623 blob_init(&w2, pW2->zWiki, -1);
624 }
625 blob_zero(&d);
626 text_diff(&w2, &w1, &d, 5 | DIFF_IGNORE_EOLWS);
627 @ <pre>
628 @ %h(blob_str(&d))
629 @ </pre>
 
630 manifest_destroy(pW1);
631 manifest_destroy(pW2);
632 style_footer();
633 }
634
635
--- src/wiki.c
+++ src/wiki.c
@@ -593,10 +593,11 @@
593 char *zTitle;
594 int rid1, rid2;
595 const char *zPageName;
596 Manifest *pW1, *pW2 = 0;
597 Blob w1, w2, d;
598 int diffFlags;
599
600 login_check_credentials();
601 rid1 = atoi(PD("a","0"));
602 if( !g.perm.History ){ login_needed(); return; }
603 if( rid1==0 ) fossil_redirect_home();
@@ -621,14 +622,15 @@
622 blob_zero(&w2);
623 if( rid2 && (pW2 = manifest_get(rid2, CFTYPE_WIKI))!=0 ){
624 blob_init(&w2, pW2->zWiki, -1);
625 }
626 blob_zero(&d);
627 diffFlags = construct_diff_flags(1,0);
628 text_diff(&w2, &w1, &d, diffFlags | DIFF_HTML | DIFF_LINENO);
629 @ <div class="udiff">
630 @ %s(blob_str(&d))
631 @ </div>
632 manifest_destroy(pW1);
633 manifest_destroy(pW2);
634 style_footer();
635 }
636
637

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button