| | @@ -622,16 +622,19 @@ |
| 622 | 622 | char *zHostname; |
| 623 | 623 | char *zCwd; |
| 624 | 624 | int diffType; /* 0: no diff, 1: unified, 2: side-by-side */ |
| 625 | 625 | DiffConfig DCfg,*pCfg; /* Diff details */ |
| 626 | 626 | const char *zHome; /* Home directory */ |
| 627 | + const char *zW; /* The "w" query parameter */ |
| 628 | + int nChng; /* Number of changes */ |
| 627 | 629 | Stmt q; |
| 628 | 630 | |
| 629 | 631 | if( !db_open_local(0) || !cgi_is_loopback(g.zIpAddr) ){ |
| 630 | | - cgi_redirect("%R/home"); |
| 632 | + cgi_redirectf("%R/home"); |
| 631 | 633 | return; |
| 632 | 634 | } |
| 635 | + file_chdir(g.zLocalRoot, 0); |
| 633 | 636 | diffType = preferred_diff_type(); |
| 634 | 637 | pCfg = construct_diff_flags(diffType, &DCfg); |
| 635 | 638 | vid = db_lget_int("checkout", 0); |
| 636 | 639 | db_unprotect(PROTECT_ALL); |
| 637 | 640 | vfile_check_signature(vid, CKSIG_ENOTFILE); |
| | @@ -650,11 +653,14 @@ |
| 650 | 653 | style_header("Checkout Status: %h on %h", zCwd, zHostname); |
| 651 | 654 | }else{ |
| 652 | 655 | style_header("Checkout Status: %h", zCwd); |
| 653 | 656 | } |
| 654 | 657 | render_checkin_context(vid, 0, 0, 0); |
| 655 | | - if( pCfg==0 ){ |
| 658 | + nChng = db_int(0, "SELECT count(*) FROM vfile" |
| 659 | + " WHERE vid=%d AND (deleted OR chnged OR rid==0)", vid); |
| 660 | + if( nChng==0 ){ |
| 661 | + @ <p>No uncommitted changes</p> |
| 656 | 662 | style_finish_page(); |
| 657 | 663 | return; |
| 658 | 664 | } |
| 659 | 665 | db_prepare(&q, |
| 660 | 666 | /* 0 1 2 3 4 5 6 */ |
| | @@ -663,17 +669,32 @@ |
| 663 | 669 | " WHERE vid=%d" |
| 664 | 670 | " AND (deleted OR chnged OR rid==0)" |
| 665 | 671 | " ORDER BY pathname /*scan*/", |
| 666 | 672 | vid |
| 667 | 673 | ); |
| 668 | | - if( pCfg->diffFlags & DIFF_SIDEBYSIDE ){ |
| 669 | | - pCfg->diffFlags |= DIFF_HTML | DIFF_NOTTOOBIG; |
| 674 | + if( DCfg.diffFlags & DIFF_SIDEBYSIDE ){ |
| 675 | + DCfg.diffFlags |= DIFF_HTML | DIFF_NOTTOOBIG; |
| 670 | 676 | }else{ |
| 671 | | - pCfg->diffFlags |= DIFF_LINENO | DIFF_HTML | DIFF_NOTTOOBIG; |
| 677 | + DCfg.diffFlags |= DIFF_LINENO | DIFF_HTML | DIFF_NOTTOOBIG; |
| 672 | 678 | } |
| 679 | + @ <hr> |
| 673 | 680 | @ <div class="sectionmenu info-changes-menu"> |
| 674 | | - /* Filled out by JS */ |
| 681 | + zW = (DCfg.diffFlags&DIFF_IGNORE_ALLWS)?"&w":""; |
| 682 | + if( diffType!=1 ){ |
| 683 | + @ %z(chref("button","%R?diff=1%s",zW))Unified Diff</a> |
| 684 | + } |
| 685 | + if( diffType!=2 ){ |
| 686 | + @ %z(chref("button","%R?diff=2%s",zW))Side-by-Side Diff</a> |
| 687 | + } |
| 688 | + if( diffType!=0 ){ |
| 689 | + if( *zW ){ |
| 690 | + @ %z(chref("button","%R?diff=%d",diffType))\ |
| 691 | + @ Show Whitespace Changes</a> |
| 692 | + }else{ |
| 693 | + @ %z(chref("button","%R?diff=%d&w",diffType))Ignore Whitespace</a> |
| 694 | + } |
| 695 | + } |
| 675 | 696 | @ </div> |
| 676 | 697 | while( db_step(&q)==SQLITE_ROW ){ |
| 677 | 698 | const char *zTreename = db_column_text(&q,0); |
| 678 | 699 | int isDeleted = db_column_int(&q, 1); |
| 679 | 700 | int isChnged = db_column_int(&q,2); |
| | @@ -681,39 +702,39 @@ |
| 681 | 702 | int srcid = db_column_int(&q, 4); |
| 682 | 703 | int isLink = db_column_int(&q, 5); |
| 683 | 704 | const char *zUuid = db_column_text(&q, 6); |
| 684 | 705 | int showDiff = 1; |
| 685 | 706 | |
| 686 | | - pCfg->diffFlags &= (~DIFF_FILE_MASK); |
| 707 | + DCfg.diffFlags &= (~DIFF_FILE_MASK); |
| 687 | 708 | @ <div class='file-change-line'><span> |
| 688 | 709 | if( isDeleted ){ |
| 689 | 710 | @ DELETED %h(zTreename) |
| 690 | | - pCfg->diffFlags |= DIFF_FILE_DELETED; |
| 711 | + DCfg.diffFlags |= DIFF_FILE_DELETED; |
| 691 | 712 | showDiff = 0; |
| 692 | 713 | }else if( file_access(zTreename, F_OK) ){ |
| 693 | 714 | @ MISSING %h(zTreename) |
| 694 | 715 | showDiff = 0; |
| 695 | 716 | }else if( isNew ){ |
| 696 | 717 | @ ADDED %h(zTreename) |
| 697 | | - pCfg->diffFlags |= DIFF_FILE_ADDED; |
| 718 | + DCfg.diffFlags |= DIFF_FILE_ADDED; |
| 698 | 719 | srcid = 0; |
| 699 | 720 | showDiff = 0; |
| 700 | 721 | }else if( isChnged==3 ){ |
| 701 | 722 | @ ADDED_BY_MERGE %h(zTreename) |
| 702 | | - pCfg->diffFlags |= DIFF_FILE_ADDED; |
| 723 | + DCfg.diffFlags |= DIFF_FILE_ADDED; |
| 703 | 724 | srcid = 0; |
| 704 | 725 | showDiff = 0; |
| 705 | 726 | }else if( isChnged==5 ){ |
| 706 | 727 | @ ADDED_BY_INTEGRATE %h(zTreename) |
| 707 | | - pCfg->diffFlags |= DIFF_FILE_ADDED; |
| 728 | + DCfg.diffFlags |= DIFF_FILE_ADDED; |
| 708 | 729 | srcid = 0; |
| 709 | 730 | showDiff = 0; |
| 710 | 731 | }else{ |
| 711 | 732 | @ CHANGED %h(zTreename) |
| 712 | 733 | } |
| 713 | 734 | @ </span></div> |
| 714 | | - if( showDiff ){ |
| 735 | + if( showDiff && pCfg ){ |
| 715 | 736 | Blob old, new; |
| 716 | 737 | if( !isLink != !file_islink(zTreename) ){ |
| 717 | 738 | @ %s(DIFF_CANNOT_COMPUTE_SYMLINK) |
| 718 | 739 | continue; |
| 719 | 740 | } |
| | @@ -729,10 +750,11 @@ |
| 729 | 750 | blob_reset(&old); |
| 730 | 751 | blob_reset(&new); |
| 731 | 752 | } |
| 732 | 753 | } |
| 733 | 754 | db_finalize(&q); |
| 755 | + // @ </div> <!-- ap-002 --> |
| 734 | 756 | append_diff_javascript(diffType); |
| 735 | 757 | style_finish_page(); |
| 736 | 758 | } |
| 737 | 759 | |
| 738 | 760 | /* |
| | @@ -758,11 +780,10 @@ |
| 758 | 780 | const char *zParent; /* Hash of the parent check-in (if any) */ |
| 759 | 781 | const char *zRe; /* regex parameter */ |
| 760 | 782 | ReCompiled *pRe = 0; /* regex */ |
| 761 | 783 | const char *zW; /* URL param for ignoring whitespace */ |
| 762 | 784 | const char *zPage = "vinfo"; /* Page that shows diffs */ |
| 763 | | - const char *zPageHide = "ci"; /* Page that hides diffs */ |
| 764 | 785 | const char *zBrName; /* Branch name */ |
| 765 | 786 | DiffConfig DCfg,*pCfg; /* Type of diff */ |
| 766 | 787 | |
| 767 | 788 | login_check_credentials(); |
| 768 | 789 | if( !g.perm.Read ){ login_needed(g.anon.Read); return; } |
| | @@ -1028,21 +1049,17 @@ |
| 1028 | 1049 | @ <div class="sectionmenu info-changes-menu"> |
| 1029 | 1050 | /* ^^^ .info-changes-menu is used by diff scroll sync */ |
| 1030 | 1051 | pCfg = construct_diff_flags(diffType, &DCfg); |
| 1031 | 1052 | DCfg.pRe = pRe; |
| 1032 | 1053 | zW = (DCfg.diffFlags&DIFF_IGNORE_ALLWS)?"&w":""; |
| 1033 | | - if( diffType!=0 ){ |
| 1034 | | - @ %z(chref("button","%R/%s/%T?diff=0",zPageHide,zName))\ |
| 1035 | | - @ Hide Diffs</a> |
| 1036 | | - } |
| 1037 | 1054 | if( diffType!=1 ){ |
| 1038 | 1055 | @ %z(chref("button","%R/%s/%T?diff=1%s",zPage,zName,zW))\ |
| 1039 | | - @ Unified Diffs</a> |
| 1056 | + @ Unified Diff</a> |
| 1040 | 1057 | } |
| 1041 | 1058 | if( diffType!=2 ){ |
| 1042 | 1059 | @ %z(chref("button","%R/%s/%T?diff=2%s",zPage,zName,zW))\ |
| 1043 | | - @ Side-by-Side Diffs</a> |
| 1060 | + @ Side-by-Side Diff</a> |
| 1044 | 1061 | } |
| 1045 | 1062 | if( diffType!=0 ){ |
| 1046 | 1063 | if( *zW ){ |
| 1047 | 1064 | @ %z(chref("button","%R/%s/%T",zPage,zName)) |
| 1048 | 1065 | @ Show Whitespace Changes</a> |
| | @@ -1398,13 +1415,10 @@ |
| 1398 | 1415 | cgi_check_for_malice(); |
| 1399 | 1416 | style_set_current_feature("vdiff"); |
| 1400 | 1417 | if( zBranch==0 ){ |
| 1401 | 1418 | style_submenu_element("Path", "%R/timeline?me=%T&you=%T", zFrom, zTo); |
| 1402 | 1419 | } |
| 1403 | | - if( diffType!=0 ){ |
| 1404 | | - style_submenu_element("Hide Diff", "%R/vdiff?diff=0&%b%b", &qp, &qpGlob); |
| 1405 | | - } |
| 1406 | 1420 | if( diffType!=2 ){ |
| 1407 | 1421 | style_submenu_element("Side-by-Side Diff", "%R/vdiff?diff=2&%b%b", &qp, |
| 1408 | 1422 | &qpGlob); |
| 1409 | 1423 | } |
| 1410 | 1424 | if( diffType!=1 ) { |
| 1411 | 1425 | |