| | @@ -512,11 +512,11 @@ |
| 512 | 512 | } |
| 513 | 513 | if( diffFlags ){ |
| 514 | 514 | append_diff(zOld, zNew, diffFlags, pRe); |
| 515 | 515 | }else if( zOld && zNew && fossil_strcmp(zOld,zNew)!=0 ){ |
| 516 | 516 | @ |
| 517 | | - @ %z(href("%R/fdiff?v1=%!S&v2=%!S&sbs=1",zOld,zNew))[diff]</a> |
| 517 | + @ %z(href("%R/fdiff?v1=%!S&v2=%!S",zOld,zNew))[diff]</a> |
| 518 | 518 | } |
| 519 | 519 | } |
| 520 | 520 | @ </p> |
| 521 | 521 | } |
| 522 | 522 | |
| | @@ -530,15 +530,15 @@ |
| 530 | 530 | |
| 531 | 531 | /* |
| 532 | 532 | ** Construct an appropriate diffFlag for text_diff() based on query |
| 533 | 533 | ** parameters and the to boolean arguments. |
| 534 | 534 | */ |
| 535 | | -u64 construct_diff_flags(int verboseFlag, int sideBySide){ |
| 535 | +u64 construct_diff_flags(int diffType){ |
| 536 | 536 | u64 diffFlags = 0; /* Zero means do not show any diff */ |
| 537 | | - if( verboseFlag!=0 ){ |
| 537 | + if( diffType>0 ){ |
| 538 | 538 | int x; |
| 539 | | - if( sideBySide ){ |
| 539 | + if( diffType==2 ){ |
| 540 | 540 | diffFlags = DIFF_SIDEBYSIDE; |
| 541 | 541 | |
| 542 | 542 | /* "dw" query parameter determines width of each column */ |
| 543 | 543 | x = atoi(PD("dw","80"))*(DIFF_CONTEXT_MASK+1); |
| 544 | 544 | if( x<0 || x>DIFF_WIDTH_MASK ) x = DIFF_WIDTH_MASK; |
| | @@ -568,22 +568,19 @@ |
| 568 | 568 | ** |
| 569 | 569 | ** Display information about a particular check-in. |
| 570 | 570 | ** |
| 571 | 571 | ** We also jump here from /info if the name is a check-in |
| 572 | 572 | ** |
| 573 | | -** If the /ci page is used (instead of /vinfo or /info) then the |
| 574 | | -** default behavior is to show unified diffs of all file changes. |
| 575 | | -** With /vinfo and /info, only a list of the changed files are |
| 576 | | -** shown, without diffs. This behavior is inverted if the |
| 577 | | -** "show-version-diffs" setting is turned on. |
| 573 | +** If the /ci and /vinfo pages used to differ in their default |
| 574 | +** diff settings, but now diff settings persist with a cookie and |
| 575 | +** so /ci and /vinfo behave the same. |
| 578 | 576 | */ |
| 579 | 577 | void ci_page(void){ |
| 580 | 578 | Stmt q1, q2, q3; |
| 581 | 579 | int rid; |
| 582 | 580 | int isLeaf; |
| 583 | | - int verboseFlag; /* True to show diffs */ |
| 584 | | - int sideBySide; /* True for side-by-side diffs */ |
| 581 | + int diffType; /* 0: no diff, 1: unified, 2: side-by-side */ |
| 585 | 582 | u64 diffFlags; /* Flag parameter for text_diff() */ |
| 586 | 583 | const char *zName; /* Name of the check-in to be displayed */ |
| 587 | 584 | const char *zUuid; /* UUID of zName */ |
| 588 | 585 | const char *zParent; /* UUID of the parent check-in (if any) */ |
| 589 | 586 | const char *zRe; /* regex parameter */ |
| | @@ -617,11 +614,13 @@ |
| 617 | 614 | " FROM blob, event" |
| 618 | 615 | " WHERE blob.rid=%d" |
| 619 | 616 | " AND event.objid=%d", |
| 620 | 617 | rid, rid |
| 621 | 618 | ); |
| 622 | | - sideBySide = !is_false(PD("sbs","1")); |
| 619 | + |
| 620 | + cookie_link_parameter("diff","diff","2"); |
| 621 | + diffType = atoi(PD("diff","2")); |
| 623 | 622 | if( db_step(&q1)==SQLITE_ROW ){ |
| 624 | 623 | const char *zUuid = db_column_text(&q1, 0); |
| 625 | 624 | int nUuid = db_column_bytes(&q1, 0); |
| 626 | 625 | char *zEUser, *zEComment; |
| 627 | 626 | const char *zUser; |
| | @@ -731,11 +730,12 @@ |
| 731 | 730 | zPJ, zUuid, zUuid); |
| 732 | 731 | @ </td></tr> |
| 733 | 732 | @ <tr><th>Downloads:</th><td> |
| 734 | 733 | @ %z(href("%s",zUrl))Tarball</a> |
| 735 | 734 | @ | %z(href("%R/zip/%t-%S.zip?uuid=%!S",zPJ,zUuid,zUuid))ZIP archive</a> |
| 736 | | - @ | %z(href("%R/sqlar/%t-%S.sqlar?uuid=%!S",zPJ,zUuid,zUuid))SQL archive</a> |
| 735 | + @ | %z(href("%R/sqlar/%t-%S.sqlar?uuid=%!S",zPJ,zUuid,zUuid))\ |
| 736 | + @ SQL archive</a> |
| 737 | 737 | fossil_free(zUrl); |
| 738 | 738 | } |
| 739 | 739 | @ </td></tr> |
| 740 | 740 | @ <tr><th>Other Links:</th> |
| 741 | 741 | @ <td> |
| | @@ -763,40 +763,32 @@ |
| 763 | 763 | showTags(rid); |
| 764 | 764 | @ <div class="section">Context</div> |
| 765 | 765 | render_checkin_context(rid, 0); |
| 766 | 766 | @ <div class="section">Changes</div> |
| 767 | 767 | @ <div class="sectionmenu"> |
| 768 | | - verboseFlag = g.zPath[0]!='c'; |
| 769 | | - if( db_get_boolean("show-version-diffs", 0)==0 ){ |
| 770 | | - verboseFlag = !verboseFlag; |
| 771 | | - zPage = "ci"; |
| 772 | | - zPageHide = "vinfo"; |
| 773 | | - } |
| 774 | | - diffFlags = construct_diff_flags(verboseFlag, sideBySide); |
| 768 | + diffFlags = construct_diff_flags(diffType); |
| 775 | 769 | zW = (diffFlags&DIFF_IGNORE_ALLWS)?"&w":""; |
| 776 | | - if( verboseFlag ){ |
| 777 | | - @ %z(chref("button","%R/%s/%T",zPageHide,zName)) |
| 770 | + if( diffType!=0 ){ |
| 771 | + @ %z(chref("button","%R/%s/%T?diff=0",zPageHide,zName))\ |
| 778 | 772 | @ Hide Diffs</a> |
| 779 | | - if( sideBySide ){ |
| 780 | | - @ %z(chref("button","%R/%s/%T?sbs=0%s",zPage,zName,zW)) |
| 781 | | - @ Unified Diffs</a> |
| 782 | | - }else{ |
| 783 | | - @ %z(chref("button","%R/%s/%T?sbs=1%s",zPage,zName,zW)) |
| 784 | | - @ Side-by-Side Diffs</a> |
| 785 | | - } |
| 773 | + } |
| 774 | + if( diffType!=1 ){ |
| 775 | + @ %z(chref("button","%R/%s/%T?diff=1%s",zPage,zName,zW))\ |
| 776 | + @ Unified Diffs</a> |
| 777 | + } |
| 778 | + if( diffType!=2 ){ |
| 779 | + @ %z(chref("button","%R/%s/%T?diff=2%s",zPage,zName,zW))\ |
| 780 | + @ Side-by-Side Diffs</a> |
| 781 | + } |
| 782 | + if( diffType!=0 ){ |
| 786 | 783 | if( *zW ){ |
| 787 | | - @ %z(chref("button","%R/%s/%T?sbs=%d",zPage,zName,sideBySide)) |
| 784 | + @ %z(chref("button","%R/%s/%T",zPage,zName)) |
| 788 | 785 | @ Show Whitespace Changes</a> |
| 789 | 786 | }else{ |
| 790 | | - @ %z(chref("button","%R/%s/%T?sbs=%d&w",zPage,zName,sideBySide)) |
| 787 | + @ %z(chref("button","%R/%s/%T?w",zPage,zName)) |
| 791 | 788 | @ Ignore Whitespace</a> |
| 792 | 789 | } |
| 793 | | - }else{ |
| 794 | | - @ %z(chref("button","%R/%s/%T?sbs=0",zPage,zName)) |
| 795 | | - @ Show Unified Diffs</a> |
| 796 | | - @ %z(chref("button","%R/%s/%T?sbs=1",zPage,zName)) |
| 797 | | - @ Show Side-by-Side Diffs</a> |
| 798 | 790 | } |
| 799 | 791 | if( zParent ){ |
| 800 | 792 | @ %z(chref("button","%R/vpatch?from=%!S&to=%!S",zParent,zUuid)) |
| 801 | 793 | @ Patch</a> |
| 802 | 794 | } |
| | @@ -828,11 +820,12 @@ |
| 828 | 820 | const char *zNew = db_column_text(&q3,3); |
| 829 | 821 | const char *zOldName = db_column_text(&q3, 4); |
| 830 | 822 | append_file_change_line(zName, zOld, zNew, zOldName, diffFlags,pRe,mperm); |
| 831 | 823 | } |
| 832 | 824 | db_finalize(&q3); |
| 833 | | - append_diff_javascript(sideBySide); |
| 825 | + append_diff_javascript(diffType==2); |
| 826 | + cookie_render(); |
| 834 | 827 | style_footer(); |
| 835 | 828 | } |
| 836 | 829 | |
| 837 | 830 | /* |
| 838 | 831 | ** WEBPAGE: winfo |
| | @@ -1047,12 +1040,11 @@ |
| 1047 | 1040 | ** Query parameters: |
| 1048 | 1041 | ** |
| 1049 | 1042 | ** from=TAG Left side of the comparison |
| 1050 | 1043 | ** to=TAG Right side of the comparison |
| 1051 | 1044 | ** branch=TAG Show all changes on a particular branch |
| 1052 | | -** v=BOOLEAN Default true. If false, only list files that have changed |
| 1053 | | -** sbs=BOOLEAN Side-by-side diff if true. Unified diff if false |
| 1045 | +** diff=INTEGER 0: none, 1: unified, 2: side-by-side |
| 1054 | 1046 | ** glob=STRING only diff files matching this glob |
| 1055 | 1047 | ** dc=N show N lines of context around each diff |
| 1056 | 1048 | ** w=BOOLEAN ignore whitespace when computing diffs |
| 1057 | 1049 | ** nohdr omit the description at the top of the page |
| 1058 | 1050 | ** |
| | @@ -1059,12 +1051,11 @@ |
| 1059 | 1051 | ** |
| 1060 | 1052 | ** Show all differences between two check-ins. |
| 1061 | 1053 | */ |
| 1062 | 1054 | void vdiff_page(void){ |
| 1063 | 1055 | int ridFrom, ridTo; |
| 1064 | | - int verboseFlag; |
| 1065 | | - int sideBySide; |
| 1056 | + int diffType = 0; /* 0: none, 1: unified, 2: side-by-side */ |
| 1066 | 1057 | u64 diffFlags = 0; |
| 1067 | 1058 | Manifest *pFrom, *pTo; |
| 1068 | 1059 | ManifestFile *pFileFrom, *pFileTo; |
| 1069 | 1060 | const char *zBranch; |
| 1070 | 1061 | const char *zFrom; |
| | @@ -1075,10 +1066,13 @@ |
| 1075 | 1066 | const char *zGlob; |
| 1076 | 1067 | ReCompiled *pRe = 0; |
| 1077 | 1068 | login_check_credentials(); |
| 1078 | 1069 | if( !g.perm.Read ){ login_needed(g.anon.Read); return; } |
| 1079 | 1070 | login_anonymous_available(); |
| 1071 | + cookie_link_parameter("diff","diff","2"); |
| 1072 | + diffType = atoi(PD("diff","2")); |
| 1073 | + cookie_render(); |
| 1080 | 1074 | zRe = P("regex"); |
| 1081 | 1075 | if( zRe ) re_compile(&pRe, zRe, 0); |
| 1082 | 1076 | zBranch = P("branch"); |
| 1083 | 1077 | if( zBranch && zBranch[0] ){ |
| 1084 | 1078 | cgi_replace_parameter("from", mprintf("root:%s", zBranch)); |
| | @@ -1086,58 +1080,46 @@ |
| 1086 | 1080 | } |
| 1087 | 1081 | pTo = vdiff_parse_manifest("to", &ridTo); |
| 1088 | 1082 | if( pTo==0 ) return; |
| 1089 | 1083 | pFrom = vdiff_parse_manifest("from", &ridFrom); |
| 1090 | 1084 | if( pFrom==0 ) return; |
| 1091 | | - sideBySide = !is_false(PD("sbs","1")); |
| 1092 | | - zVerbose = P("v"); |
| 1093 | | - if( !zVerbose ){ |
| 1094 | | - zVerbose = P("verbose"); |
| 1095 | | - } |
| 1096 | | - if( !zVerbose ){ |
| 1097 | | - zVerbose = P("detail"); /* deprecated */ |
| 1098 | | - } |
| 1099 | | - verboseFlag = (zVerbose!=0) && !is_false(zVerbose); |
| 1100 | | - if( !verboseFlag && sideBySide ) verboseFlag = 1; |
| 1101 | 1085 | zGlob = P("glob"); |
| 1102 | 1086 | zFrom = P("from"); |
| 1103 | 1087 | zTo = P("to"); |
| 1104 | 1088 | if(zGlob && !*zGlob){ |
| 1105 | 1089 | zGlob = NULL; |
| 1106 | 1090 | } |
| 1107 | | - diffFlags = construct_diff_flags(verboseFlag, sideBySide); |
| 1091 | + diffFlags = construct_diff_flags(diffType); |
| 1108 | 1092 | zW = (diffFlags&DIFF_IGNORE_ALLWS)?"&w":""; |
| 1109 | 1093 | style_submenu_element("Path", "%R/timeline?me=%T&you=%T", zFrom, zTo); |
| 1110 | | - if( sideBySide || verboseFlag ){ |
| 1111 | | - style_submenu_element("Hide Diff", "%R/vdiff?from=%T&to=%T&sbs=0%s%T%s", |
| 1094 | + if( diffType!=0 ){ |
| 1095 | + style_submenu_element("Hide Diff", "%R/vdiff?from=%T&to=%T&diff=0%s%T%s", |
| 1112 | 1096 | zFrom, zTo, |
| 1113 | 1097 | zGlob ? "&glob=" : "", zGlob ? zGlob : "", zW); |
| 1114 | 1098 | } |
| 1115 | | - if( !sideBySide ){ |
| 1099 | + if( diffType!=2 ){ |
| 1116 | 1100 | style_submenu_element("Side-by-Side Diff", |
| 1117 | | - "%R/vdiff?from=%T&to=%T&sbs=1%s%T%s", |
| 1101 | + "%R/vdiff?from=%T&to=%T&diff=2%s%T%s", |
| 1118 | 1102 | zFrom, zTo, |
| 1119 | 1103 | zGlob ? "&glob=" : "", zGlob ? zGlob : "", zW); |
| 1120 | 1104 | } |
| 1121 | | - if( sideBySide || !verboseFlag ) { |
| 1105 | + if( diffType!=1 ) { |
| 1122 | 1106 | style_submenu_element("Unified Diff", |
| 1123 | | - "%R/vdiff?from=%T&to=%T&sbs=0&v%s%T%s", |
| 1107 | + "%R/vdiff?from=%T&to=%T&diff=1%s%T%s", |
| 1124 | 1108 | zFrom, zTo, |
| 1125 | 1109 | zGlob ? "&glob=" : "", zGlob ? zGlob : "", zW); |
| 1126 | 1110 | } |
| 1127 | 1111 | style_submenu_element("Invert", |
| 1128 | | - "%R/vdiff?from=%T&to=%T&sbs=%d%s%s%T%s", zTo, zFrom, |
| 1129 | | - sideBySide, (verboseFlag && !sideBySide)?"&v":"", |
| 1112 | + "%R/vdiff?from=%T&to=%T&%s%T%s", zTo, zFrom, |
| 1130 | 1113 | zGlob ? "&glob=" : "", zGlob ? zGlob : "", zW); |
| 1131 | 1114 | if( zGlob ){ |
| 1132 | 1115 | style_submenu_element("Clear glob", |
| 1133 | | - "%R/vdiff?from=%T&to=%T&sbs=%d%s%s", zFrom, zTo, |
| 1134 | | - sideBySide, (verboseFlag && !sideBySide)?"&v":"", zW); |
| 1116 | + "%R/vdiff?from=%T&to=%T&%s", zFrom, zTo, zW); |
| 1135 | 1117 | }else{ |
| 1136 | 1118 | style_submenu_element("Patch", "%R/vpatch?from=%T&to=%T%s", zFrom, zTo, zW); |
| 1137 | 1119 | } |
| 1138 | | - if( sideBySide || verboseFlag ){ |
| 1120 | + if( diffType!=0 ){ |
| 1139 | 1121 | style_submenu_checkbox("w", "Ignore Whitespace", 0, 0); |
| 1140 | 1122 | } |
| 1141 | 1123 | style_header("Check-in Differences"); |
| 1142 | 1124 | if( P("nohdr")==0 ){ |
| 1143 | 1125 | @ <h2>Difference From:</h2><blockquote> |
| | @@ -1196,11 +1178,11 @@ |
| 1196 | 1178 | pFileTo = manifest_file_next(pTo, 0); |
| 1197 | 1179 | } |
| 1198 | 1180 | } |
| 1199 | 1181 | manifest_destroy(pFrom); |
| 1200 | 1182 | manifest_destroy(pTo); |
| 1201 | | - append_diff_javascript(sideBySide); |
| 1183 | + append_diff_javascript(diffType==2); |
| 1202 | 1184 | style_footer(); |
| 1203 | 1185 | } |
| 1204 | 1186 | |
| 1205 | 1187 | #if INTERFACE |
| 1206 | 1188 | /* |
| | @@ -1527,21 +1509,24 @@ |
| 1527 | 1509 | ** w=BOOLEAN Ignore whitespace |
| 1528 | 1510 | */ |
| 1529 | 1511 | void diff_page(void){ |
| 1530 | 1512 | int v1, v2; |
| 1531 | 1513 | int isPatch = P("patch")!=0; |
| 1532 | | - int sideBySide = PB("sbs"); |
| 1533 | | - int verbose = PB("verbose"); |
| 1514 | + int diffType; /* 0: none, 1: unified, 2: side-by-side */ |
| 1534 | 1515 | char *zV1; |
| 1535 | 1516 | char *zV2; |
| 1536 | 1517 | const char *zRe; |
| 1537 | 1518 | ReCompiled *pRe = 0; |
| 1538 | 1519 | u64 diffFlags; |
| 1539 | 1520 | u32 objdescFlags = 0; |
| 1521 | + int verbose = PB("verbose"); |
| 1540 | 1522 | |
| 1541 | 1523 | login_check_credentials(); |
| 1542 | 1524 | if( !g.perm.Read ){ login_needed(g.anon.Read); return; } |
| 1525 | + cookie_link_parameter("diff","diff","2"); |
| 1526 | + diffType = atoi(PD("diff","2")); |
| 1527 | + cookie_render(); |
| 1543 | 1528 | if( P("from") && P("to") ){ |
| 1544 | 1529 | v1 = artifact_from_ci_and_filename(0, "from"); |
| 1545 | 1530 | v2 = artifact_from_ci_and_filename(0, "to"); |
| 1546 | 1531 | }else{ |
| 1547 | 1532 | Stmt q; |
| | @@ -1593,18 +1578,24 @@ |
| 1593 | 1578 | return; |
| 1594 | 1579 | } |
| 1595 | 1580 | |
| 1596 | 1581 | zV1 = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", v1); |
| 1597 | 1582 | zV2 = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", v2); |
| 1598 | | - diffFlags = construct_diff_flags(1, sideBySide) | DIFF_HTML; |
| 1583 | + diffFlags = construct_diff_flags(diffType) | DIFF_HTML; |
| 1599 | 1584 | |
| 1600 | 1585 | style_header("Diff"); |
| 1601 | 1586 | style_submenu_checkbox("w", "Ignore Whitespace", 0, 0); |
| 1602 | | - style_submenu_checkbox("sbs", "Side-by-Side Diff", 0, 0); |
| 1587 | + if( diffType==2 ){ |
| 1588 | + style_submenu_element("Unified Diff", "%R/fdiff?v1=%T&v2=%T&diff=1", |
| 1589 | + P("v1"), P("v2")); |
| 1590 | + }else{ |
| 1591 | + style_submenu_element("Side-by-side Diff", "%R/fdiff?v1=%T&v2=%T&diff=2", |
| 1592 | + P("v1"), P("v2")); |
| 1593 | + } |
| 1603 | 1594 | style_submenu_checkbox("verbose", "Verbose", 0, 0); |
| 1604 | | - style_submenu_element("Patch", "%s/fdiff?v1=%T&v2=%T&patch", |
| 1605 | | - g.zTop, P("v1"), P("v2")); |
| 1595 | + style_submenu_element("Patch", "%R/fdiff?v1=%T&v2=%T&patch", |
| 1596 | + P("v1"), P("v2")); |
| 1606 | 1597 | |
| 1607 | 1598 | if( P("smhdr")!=0 ){ |
| 1608 | 1599 | @ <h2>Differences From Artifact |
| 1609 | 1600 | @ %z(href("%R/artifact/%!S",zV1))[%S(zV1)]</a> To |
| 1610 | 1601 | @ %z(href("%R/artifact/%!S",zV2))[%S(zV2)]</a>.</h2> |
| | @@ -1619,11 +1610,11 @@ |
| 1619 | 1610 | @ <b>Only differences that match regular expression "%h(zRe)" |
| 1620 | 1611 | @ are shown.</b> |
| 1621 | 1612 | } |
| 1622 | 1613 | @ <hr /> |
| 1623 | 1614 | append_diff(zV1, zV2, diffFlags, pRe); |
| 1624 | | - append_diff_javascript(sideBySide); |
| 1615 | + append_diff_javascript(diffType); |
| 1625 | 1616 | style_footer(); |
| 1626 | 1617 | } |
| 1627 | 1618 | |
| 1628 | 1619 | /* |
| 1629 | 1620 | ** WEBPAGE: raw |
| 1630 | 1621 | |