Fossil SCM
Make sure sbsdiff lines are escaped properly.
Commit
ff41d4be8a2a3c3b35e897029269cceb83346c50
Parent
9b7955b5a43492c…
2 files changed
+7
-7
+20
-8
+7
-7
| --- src/diff.c | ||
| +++ src/diff.c | ||
| @@ -682,16 +682,16 @@ | ||
| 682 | 682 | continue; |
| 683 | 683 | @ <tr style="display:none;"> |
| 684 | 684 | } |
| 685 | 685 | |
| 686 | 686 | copylimline(linebuf, &c.aFrom[iFrom+j], collim); |
| 687 | - @ <td class="lineno">%d(iFrom+j+1)</td><td>%s(linebuf)</td> | |
| 687 | + @ <td class="lineno">%d(iFrom+j+1)</td><td>%h(linebuf)</td> | |
| 688 | 688 | |
| 689 | 689 | @ <td> </td> |
| 690 | 690 | |
| 691 | 691 | copylimline(linebuf, &c.aTo[iTo+j], collim); |
| 692 | - @ <td class="lineno">%d(iTo+j+1)</td><td>%s(linebuf)</td> | |
| 692 | + @ <td class="lineno">%d(iTo+j+1)</td><td>%h(linebuf)</td> | |
| 693 | 693 | |
| 694 | 694 | @ </tr> |
| 695 | 695 | } |
| 696 | 696 | iFrom+=c.aEdit[i]; |
| 697 | 697 | iTo+=c.aEdit[i]; |
| @@ -706,21 +706,21 @@ | ||
| 706 | 706 | @ <tr> |
| 707 | 707 | |
| 708 | 708 | if( j<c.aEdit[i+1] ){ |
| 709 | 709 | copylimline(linebuf, &c.aFrom[iFrom+j], collim); |
| 710 | 710 | @ <td class="changed lineno">%d(iFrom+j+1)</td> |
| 711 | - @ <td class="changed">%s(linebuf)</td> | |
| 711 | + @ <td class="changed">%h(linebuf)</td> | |
| 712 | 712 | }else{ |
| 713 | - @ <td colspan="2"/> | |
| 713 | + @ <td colspan="2"/> | |
| 714 | 714 | } |
| 715 | 715 | |
| 716 | 716 | @ <td class="changed">|</td> |
| 717 | 717 | |
| 718 | 718 | if( j<c.aEdit[i+2] ){ |
| 719 | 719 | copylimline(linebuf, &c.aTo[iTo+j], collim); |
| 720 | 720 | @ <td class="changed lineno">%d(iTo+j+1)</td> |
| 721 | - @ <td class="changed">%s(linebuf)</td> | |
| 721 | + @ <td class="changed">%h(linebuf)</td> | |
| 722 | 722 | }else{ |
| 723 | 723 | @ <td colspan="2"/> |
| 724 | 724 | } |
| 725 | 725 | |
| 726 | 726 | @ </tr> |
| @@ -734,11 +734,11 @@ | ||
| 734 | 734 | int len; |
| 735 | 735 | @ <tr> |
| 736 | 736 | |
| 737 | 737 | copylimline(linebuf, &c.aFrom[iFrom+j], collim); |
| 738 | 738 | @ <td class="removed lineno">%d(iFrom+j+1)</td> |
| 739 | - @ <td class="removed">%s(linebuf)</td> | |
| 739 | + @ <td class="removed">%h(linebuf)</td> | |
| 740 | 740 | |
| 741 | 741 | @ <td><</td> |
| 742 | 742 | |
| 743 | 743 | @ <td colspan="2"/> |
| 744 | 744 | |
| @@ -754,11 +754,11 @@ | ||
| 754 | 754 | |
| 755 | 755 | @ <td>></td> |
| 756 | 756 | |
| 757 | 757 | copylimline(linebuf, &c.aTo[iTo+j], collim); |
| 758 | 758 | @ <td class="added lineno">%d(iTo+j+1)</td> |
| 759 | - @ <td class="added">%s(linebuf)</td> | |
| 759 | + @ <td class="added">%h(linebuf)</td> | |
| 760 | 760 | |
| 761 | 761 | @ </tr> |
| 762 | 762 | } |
| 763 | 763 | iTo+=c.aEdit[i+2]; |
| 764 | 764 | } |
| 765 | 765 |
| --- src/diff.c | |
| +++ src/diff.c | |
| @@ -682,16 +682,16 @@ | |
| 682 | continue; |
| 683 | @ <tr style="display:none;"> |
| 684 | } |
| 685 | |
| 686 | copylimline(linebuf, &c.aFrom[iFrom+j], collim); |
| 687 | @ <td class="lineno">%d(iFrom+j+1)</td><td>%s(linebuf)</td> |
| 688 | |
| 689 | @ <td> </td> |
| 690 | |
| 691 | copylimline(linebuf, &c.aTo[iTo+j], collim); |
| 692 | @ <td class="lineno">%d(iTo+j+1)</td><td>%s(linebuf)</td> |
| 693 | |
| 694 | @ </tr> |
| 695 | } |
| 696 | iFrom+=c.aEdit[i]; |
| 697 | iTo+=c.aEdit[i]; |
| @@ -706,21 +706,21 @@ | |
| 706 | @ <tr> |
| 707 | |
| 708 | if( j<c.aEdit[i+1] ){ |
| 709 | copylimline(linebuf, &c.aFrom[iFrom+j], collim); |
| 710 | @ <td class="changed lineno">%d(iFrom+j+1)</td> |
| 711 | @ <td class="changed">%s(linebuf)</td> |
| 712 | }else{ |
| 713 | @ <td colspan="2"/> |
| 714 | } |
| 715 | |
| 716 | @ <td class="changed">|</td> |
| 717 | |
| 718 | if( j<c.aEdit[i+2] ){ |
| 719 | copylimline(linebuf, &c.aTo[iTo+j], collim); |
| 720 | @ <td class="changed lineno">%d(iTo+j+1)</td> |
| 721 | @ <td class="changed">%s(linebuf)</td> |
| 722 | }else{ |
| 723 | @ <td colspan="2"/> |
| 724 | } |
| 725 | |
| 726 | @ </tr> |
| @@ -734,11 +734,11 @@ | |
| 734 | int len; |
| 735 | @ <tr> |
| 736 | |
| 737 | copylimline(linebuf, &c.aFrom[iFrom+j], collim); |
| 738 | @ <td class="removed lineno">%d(iFrom+j+1)</td> |
| 739 | @ <td class="removed">%s(linebuf)</td> |
| 740 | |
| 741 | @ <td><</td> |
| 742 | |
| 743 | @ <td colspan="2"/> |
| 744 | |
| @@ -754,11 +754,11 @@ | |
| 754 | |
| 755 | @ <td>></td> |
| 756 | |
| 757 | copylimline(linebuf, &c.aTo[iTo+j], collim); |
| 758 | @ <td class="added lineno">%d(iTo+j+1)</td> |
| 759 | @ <td class="added">%s(linebuf)</td> |
| 760 | |
| 761 | @ </tr> |
| 762 | } |
| 763 | iTo+=c.aEdit[i+2]; |
| 764 | } |
| 765 |
| --- src/diff.c | |
| +++ src/diff.c | |
| @@ -682,16 +682,16 @@ | |
| 682 | continue; |
| 683 | @ <tr style="display:none;"> |
| 684 | } |
| 685 | |
| 686 | copylimline(linebuf, &c.aFrom[iFrom+j], collim); |
| 687 | @ <td class="lineno">%d(iFrom+j+1)</td><td>%h(linebuf)</td> |
| 688 | |
| 689 | @ <td> </td> |
| 690 | |
| 691 | copylimline(linebuf, &c.aTo[iTo+j], collim); |
| 692 | @ <td class="lineno">%d(iTo+j+1)</td><td>%h(linebuf)</td> |
| 693 | |
| 694 | @ </tr> |
| 695 | } |
| 696 | iFrom+=c.aEdit[i]; |
| 697 | iTo+=c.aEdit[i]; |
| @@ -706,21 +706,21 @@ | |
| 706 | @ <tr> |
| 707 | |
| 708 | if( j<c.aEdit[i+1] ){ |
| 709 | copylimline(linebuf, &c.aFrom[iFrom+j], collim); |
| 710 | @ <td class="changed lineno">%d(iFrom+j+1)</td> |
| 711 | @ <td class="changed">%h(linebuf)</td> |
| 712 | }else{ |
| 713 | @ <td colspan="2"/> |
| 714 | } |
| 715 | |
| 716 | @ <td class="changed">|</td> |
| 717 | |
| 718 | if( j<c.aEdit[i+2] ){ |
| 719 | copylimline(linebuf, &c.aTo[iTo+j], collim); |
| 720 | @ <td class="changed lineno">%d(iTo+j+1)</td> |
| 721 | @ <td class="changed">%h(linebuf)</td> |
| 722 | }else{ |
| 723 | @ <td colspan="2"/> |
| 724 | } |
| 725 | |
| 726 | @ </tr> |
| @@ -734,11 +734,11 @@ | |
| 734 | int len; |
| 735 | @ <tr> |
| 736 | |
| 737 | copylimline(linebuf, &c.aFrom[iFrom+j], collim); |
| 738 | @ <td class="removed lineno">%d(iFrom+j+1)</td> |
| 739 | @ <td class="removed">%h(linebuf)</td> |
| 740 | |
| 741 | @ <td><</td> |
| 742 | |
| 743 | @ <td colspan="2"/> |
| 744 | |
| @@ -754,11 +754,11 @@ | |
| 754 | |
| 755 | @ <td>></td> |
| 756 | |
| 757 | copylimline(linebuf, &c.aTo[iTo+j], collim); |
| 758 | @ <td class="added lineno">%d(iTo+j+1)</td> |
| 759 | @ <td class="added">%h(linebuf)</td> |
| 760 | |
| 761 | @ </tr> |
| 762 | } |
| 763 | iTo+=c.aEdit[i+2]; |
| 764 | } |
| 765 |
+20
-8
| --- src/info.c | ||
| +++ src/info.c | ||
| @@ -1031,19 +1031,21 @@ | ||
| 1031 | 1031 | ** is present. |
| 1032 | 1032 | */ |
| 1033 | 1033 | void diff_page(void){ |
| 1034 | 1034 | int v1, v2; |
| 1035 | 1035 | int isPatch; |
| 1036 | + int sideBySide; | |
| 1036 | 1037 | Blob c1, c2, diff, *pOut; |
| 1037 | 1038 | char *zV1; |
| 1038 | 1039 | char *zV2; |
| 1039 | 1040 | |
| 1040 | 1041 | login_check_credentials(); |
| 1041 | 1042 | if( !g.perm.Read ){ login_needed(); return; } |
| 1042 | 1043 | v1 = name_to_rid_www("v1"); |
| 1043 | 1044 | v2 = name_to_rid_www("v2"); |
| 1044 | 1045 | if( v1==0 || v2==0 ) fossil_redirect_home(); |
| 1046 | + sideBySide = atoi(PD("sbs","1")); | |
| 1045 | 1047 | zV1 = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", v1); |
| 1046 | 1048 | zV2 = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", v2); |
| 1047 | 1049 | isPatch = P("patch")!=0; |
| 1048 | 1050 | if( isPatch ){ |
| 1049 | 1051 | pOut = cgi_output_blob(); |
| @@ -1050,15 +1052,17 @@ | ||
| 1050 | 1052 | cgi_set_content_type("text/plain"); |
| 1051 | 1053 | }else{ |
| 1052 | 1054 | blob_zero(&diff); |
| 1053 | 1055 | pOut = &diff; |
| 1054 | 1056 | } |
| 1055 | - content_get(v1, &c1); | |
| 1056 | - content_get(v2, &c2); | |
| 1057 | - text_diff(&c1, &c2, pOut, 4, 1); | |
| 1058 | - blob_reset(&c1); | |
| 1059 | - blob_reset(&c2); | |
| 1057 | + if( !sideBySide ){ | |
| 1058 | + content_get(v1, &c1); | |
| 1059 | + content_get(v2, &c2); | |
| 1060 | + text_diff(&c1, &c2, pOut, 4, 1); | |
| 1061 | + blob_reset(&c1); | |
| 1062 | + blob_reset(&c2); | |
| 1063 | + } | |
| 1060 | 1064 | if( !isPatch ){ |
| 1061 | 1065 | style_header("Diff"); |
| 1062 | 1066 | style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch", |
| 1063 | 1067 | g.zTop, P("v1"), P("v2")); |
| 1064 | 1068 | @ <h2>Differences From |
| @@ -1065,13 +1069,21 @@ | ||
| 1065 | 1069 | @ Artifact <a href="%s(g.zTop)/artifact/%S(zV1)">[%S(zV1)]</a>:</h2> |
| 1066 | 1070 | object_description(v1, 0, 0); |
| 1067 | 1071 | @ <h2>To Artifact <a href="%s(g.zTop)/artifact/%S(zV2)">[%S(zV2)]</a>:</h2> |
| 1068 | 1072 | object_description(v2, 0, 0); |
| 1069 | 1073 | @ <hr /> |
| 1070 | - @ <blockquote><pre> | |
| 1071 | - @ %h(blob_str(&diff)) | |
| 1072 | - @ </pre></blockquote> | |
| 1074 | + if( sideBySide ){ | |
| 1075 | + @ <table class="sbsdiff"> | |
| 1076 | + @ <tr><th colspan="2" class="diffhdr">Old (%S(zV1))</th><th/> | |
| 1077 | + @ <th colspan="2" class="diffhdr">New (%S(zV2))</th></tr> | |
| 1078 | + generate_sbsdiff(zV1, zV2); | |
| 1079 | + @ </table> | |
| 1080 | + }else{ | |
| 1081 | + @ <blockquote><pre> | |
| 1082 | + @ %h(blob_str(&diff)) | |
| 1083 | + @ </pre></blockquote> | |
| 1084 | + } | |
| 1073 | 1085 | blob_reset(&diff); |
| 1074 | 1086 | style_footer(); |
| 1075 | 1087 | } |
| 1076 | 1088 | } |
| 1077 | 1089 | |
| 1078 | 1090 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -1031,19 +1031,21 @@ | |
| 1031 | ** is present. |
| 1032 | */ |
| 1033 | void diff_page(void){ |
| 1034 | int v1, v2; |
| 1035 | int isPatch; |
| 1036 | Blob c1, c2, diff, *pOut; |
| 1037 | char *zV1; |
| 1038 | char *zV2; |
| 1039 | |
| 1040 | login_check_credentials(); |
| 1041 | if( !g.perm.Read ){ login_needed(); return; } |
| 1042 | v1 = name_to_rid_www("v1"); |
| 1043 | v2 = name_to_rid_www("v2"); |
| 1044 | if( v1==0 || v2==0 ) fossil_redirect_home(); |
| 1045 | zV1 = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", v1); |
| 1046 | zV2 = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", v2); |
| 1047 | isPatch = P("patch")!=0; |
| 1048 | if( isPatch ){ |
| 1049 | pOut = cgi_output_blob(); |
| @@ -1050,15 +1052,17 @@ | |
| 1050 | cgi_set_content_type("text/plain"); |
| 1051 | }else{ |
| 1052 | blob_zero(&diff); |
| 1053 | pOut = &diff; |
| 1054 | } |
| 1055 | content_get(v1, &c1); |
| 1056 | content_get(v2, &c2); |
| 1057 | text_diff(&c1, &c2, pOut, 4, 1); |
| 1058 | blob_reset(&c1); |
| 1059 | blob_reset(&c2); |
| 1060 | if( !isPatch ){ |
| 1061 | style_header("Diff"); |
| 1062 | style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch", |
| 1063 | g.zTop, P("v1"), P("v2")); |
| 1064 | @ <h2>Differences From |
| @@ -1065,13 +1069,21 @@ | |
| 1065 | @ Artifact <a href="%s(g.zTop)/artifact/%S(zV1)">[%S(zV1)]</a>:</h2> |
| 1066 | object_description(v1, 0, 0); |
| 1067 | @ <h2>To Artifact <a href="%s(g.zTop)/artifact/%S(zV2)">[%S(zV2)]</a>:</h2> |
| 1068 | object_description(v2, 0, 0); |
| 1069 | @ <hr /> |
| 1070 | @ <blockquote><pre> |
| 1071 | @ %h(blob_str(&diff)) |
| 1072 | @ </pre></blockquote> |
| 1073 | blob_reset(&diff); |
| 1074 | style_footer(); |
| 1075 | } |
| 1076 | } |
| 1077 | |
| 1078 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -1031,19 +1031,21 @@ | |
| 1031 | ** is present. |
| 1032 | */ |
| 1033 | void diff_page(void){ |
| 1034 | int v1, v2; |
| 1035 | int isPatch; |
| 1036 | int sideBySide; |
| 1037 | Blob c1, c2, diff, *pOut; |
| 1038 | char *zV1; |
| 1039 | char *zV2; |
| 1040 | |
| 1041 | login_check_credentials(); |
| 1042 | if( !g.perm.Read ){ login_needed(); return; } |
| 1043 | v1 = name_to_rid_www("v1"); |
| 1044 | v2 = name_to_rid_www("v2"); |
| 1045 | if( v1==0 || v2==0 ) fossil_redirect_home(); |
| 1046 | sideBySide = atoi(PD("sbs","1")); |
| 1047 | zV1 = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", v1); |
| 1048 | zV2 = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", v2); |
| 1049 | isPatch = P("patch")!=0; |
| 1050 | if( isPatch ){ |
| 1051 | pOut = cgi_output_blob(); |
| @@ -1050,15 +1052,17 @@ | |
| 1052 | cgi_set_content_type("text/plain"); |
| 1053 | }else{ |
| 1054 | blob_zero(&diff); |
| 1055 | pOut = &diff; |
| 1056 | } |
| 1057 | if( !sideBySide ){ |
| 1058 | content_get(v1, &c1); |
| 1059 | content_get(v2, &c2); |
| 1060 | text_diff(&c1, &c2, pOut, 4, 1); |
| 1061 | blob_reset(&c1); |
| 1062 | blob_reset(&c2); |
| 1063 | } |
| 1064 | if( !isPatch ){ |
| 1065 | style_header("Diff"); |
| 1066 | style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch", |
| 1067 | g.zTop, P("v1"), P("v2")); |
| 1068 | @ <h2>Differences From |
| @@ -1065,13 +1069,21 @@ | |
| 1069 | @ Artifact <a href="%s(g.zTop)/artifact/%S(zV1)">[%S(zV1)]</a>:</h2> |
| 1070 | object_description(v1, 0, 0); |
| 1071 | @ <h2>To Artifact <a href="%s(g.zTop)/artifact/%S(zV2)">[%S(zV2)]</a>:</h2> |
| 1072 | object_description(v2, 0, 0); |
| 1073 | @ <hr /> |
| 1074 | if( sideBySide ){ |
| 1075 | @ <table class="sbsdiff"> |
| 1076 | @ <tr><th colspan="2" class="diffhdr">Old (%S(zV1))</th><th/> |
| 1077 | @ <th colspan="2" class="diffhdr">New (%S(zV2))</th></tr> |
| 1078 | generate_sbsdiff(zV1, zV2); |
| 1079 | @ </table> |
| 1080 | }else{ |
| 1081 | @ <blockquote><pre> |
| 1082 | @ %h(blob_str(&diff)) |
| 1083 | @ </pre></blockquote> |
| 1084 | } |
| 1085 | blob_reset(&diff); |
| 1086 | style_footer(); |
| 1087 | } |
| 1088 | } |
| 1089 | |
| 1090 |