Fossil SCM
Add the new colorized diff logic to file and wiki diffs in addition to version diffs.
Commit
96f1975ce22236d8984e51b82629846fedb76e84
Parent
72c0183ac898fab…
2 files changed
+10
-7
+6
-4
+10
-7
| --- src/info.c | ||
| +++ src/info.c | ||
| @@ -352,11 +352,11 @@ | ||
| 352 | 352 | |
| 353 | 353 | /* |
| 354 | 354 | ** Construct an appropriate diffFlag for text_diff() based on query |
| 355 | 355 | ** parameters and the to boolean arguments. |
| 356 | 356 | */ |
| 357 | -static int construct_diff_flags(int showDiff, int sideBySide){ | |
| 357 | +int construct_diff_flags(int showDiff, int sideBySide){ | |
| 358 | 358 | int diffFlags; |
| 359 | 359 | if( showDiff==0 ){ |
| 360 | 360 | diffFlags = 0; /* Zero means do not show any diff */ |
| 361 | 361 | }else{ |
| 362 | 362 | int x; |
| @@ -1074,10 +1074,11 @@ | ||
| 1074 | 1074 | int sideBySide; |
| 1075 | 1075 | Blob c1, c2, diff, *pOut; |
| 1076 | 1076 | char *zV1; |
| 1077 | 1077 | char *zV2; |
| 1078 | 1078 | int diffFlags; |
| 1079 | + const char *zStyle; | |
| 1079 | 1080 | |
| 1080 | 1081 | login_check_credentials(); |
| 1081 | 1082 | if( !g.perm.Read ){ login_needed(); return; } |
| 1082 | 1083 | v1 = name_to_rid_www("v1"); |
| 1083 | 1084 | v2 = name_to_rid_www("v2"); |
| @@ -1091,19 +1092,21 @@ | ||
| 1091 | 1092 | cgi_set_content_type("text/plain"); |
| 1092 | 1093 | diffFlags = 4; |
| 1093 | 1094 | }else{ |
| 1094 | 1095 | blob_zero(&diff); |
| 1095 | 1096 | pOut = &diff; |
| 1097 | + diffFlags = construct_diff_flags(1, sideBySide); | |
| 1096 | 1098 | if( sideBySide ){ |
| 1097 | - diffFlags = DIFF_IGNORE_EOLWS | DIFF_SIDEBYSIDE | 7; | |
| 1099 | + zStyle = "sbsdiff"; | |
| 1098 | 1100 | }else{ |
| 1099 | - diffFlags = DIFF_IGNORE_EOLWS | 7; | |
| 1101 | + diffFlags |= DIFF_LINENO; | |
| 1102 | + zStyle = "udiff"; | |
| 1100 | 1103 | } |
| 1101 | 1104 | } |
| 1102 | 1105 | content_get(v1, &c1); |
| 1103 | 1106 | content_get(v2, &c2); |
| 1104 | - text_diff(&c1, &c2, pOut, diffFlags); | |
| 1107 | + text_diff(&c1, &c2, pOut, diffFlags | DIFF_HTML ); | |
| 1105 | 1108 | blob_reset(&c1); |
| 1106 | 1109 | blob_reset(&c2); |
| 1107 | 1110 | if( !isPatch ){ |
| 1108 | 1111 | style_header("Diff"); |
| 1109 | 1112 | style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch", |
| @@ -1122,13 +1125,13 @@ | ||
| 1122 | 1125 | @ Artifact <a href="%s(g.zTop)/artifact/%S(zV1)">[%S(zV1)]</a>:</h2> |
| 1123 | 1126 | object_description(v1, 0, 0); |
| 1124 | 1127 | @ <h2>To Artifact <a href="%s(g.zTop)/artifact/%S(zV2)">[%S(zV2)]</a>:</h2> |
| 1125 | 1128 | object_description(v2, 0, 0); |
| 1126 | 1129 | @ <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> | |
| 1130 | 1133 | blob_reset(&diff); |
| 1131 | 1134 | style_footer(); |
| 1132 | 1135 | } |
| 1133 | 1136 | } |
| 1134 | 1137 | |
| 1135 | 1138 |
| --- 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 @@ | ||
| 593 | 593 | char *zTitle; |
| 594 | 594 | int rid1, rid2; |
| 595 | 595 | const char *zPageName; |
| 596 | 596 | Manifest *pW1, *pW2 = 0; |
| 597 | 597 | Blob w1, w2, d; |
| 598 | + int diffFlags; | |
| 598 | 599 | |
| 599 | 600 | login_check_credentials(); |
| 600 | 601 | rid1 = atoi(PD("a","0")); |
| 601 | 602 | if( !g.perm.History ){ login_needed(); return; } |
| 602 | 603 | if( rid1==0 ) fossil_redirect_home(); |
| @@ -621,14 +622,15 @@ | ||
| 621 | 622 | blob_zero(&w2); |
| 622 | 623 | if( rid2 && (pW2 = manifest_get(rid2, CFTYPE_WIKI))!=0 ){ |
| 623 | 624 | blob_init(&w2, pW2->zWiki, -1); |
| 624 | 625 | } |
| 625 | 626 | 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> | |
| 630 | 632 | manifest_destroy(pW1); |
| 631 | 633 | manifest_destroy(pW2); |
| 632 | 634 | style_footer(); |
| 633 | 635 | } |
| 634 | 636 | |
| 635 | 637 |
| --- 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 |