Fossil SCM
Do a better job of showing when a file is added, deleted, or renamed in the /finfo page.
Commit
a0bca48147b3ff1dca048b0e1d9fff2878e03b2f45fda8b1c7a86d57862929ad
Parent
8c598d7232c227e…
1 file changed
+36
-31
+36
-31
| --- src/finfo.c | ||
| +++ src/finfo.c | ||
| @@ -401,11 +401,13 @@ | ||
| 401 | 401 | " SELECT mlink.fid, mlink.fnid\n" |
| 402 | 402 | " FROM clade, mlink\n" |
| 403 | 403 | " WHERE clade.fid=mlink.pid\n" |
| 404 | 404 | " AND ((mlink.pfnid=0 AND mlink.fnid=clade.fnid)\n" |
| 405 | 405 | " OR mlink.pfnid=clade.fnid)\n" |
| 406 | - " AND mlink.fid>0" | |
| 406 | + " AND (mlink.fid>0 OR NOT EXISTS(SELECT 1 FROM mlink AS mx" | |
| 407 | + " WHERE mx.mid=mlink.mid AND mx.pid=mlink.pid" | |
| 408 | + " AND mx.fid>0 AND mx.pfnid=mlink.fnid))\n" | |
| 407 | 409 | " UNION\n" |
| 408 | 410 | " SELECT mlink.pid," |
| 409 | 411 | " CASE WHEN mlink.pfnid>0 THEN mlink.pfnid ELSE mlink.fnid END\n" |
| 410 | 412 | " FROM clade, mlink\n" |
| 411 | 413 | " WHERE mlink.pid>0\n" |
| @@ -445,15 +447,15 @@ | ||
| 445 | 447 | " mlink.mid,\n" /* check-in ID */ |
| 446 | 448 | " mlink.pfnid,\n" /* Previous filename */ |
| 447 | 449 | " blob.size,\n" /* File size */ |
| 448 | 450 | " mlink.fnid,\n" /* Current filename */ |
| 449 | 451 | " filename.name\n" /* Current filename */ |
| 450 | - "FROM clade CROSS JOIN mlink, event, blob, filename\n" | |
| 452 | + "FROM clade CROSS JOIN mlink, event" | |
| 453 | + " LEFT JOIN blob ON blob.rid=clade.fid" | |
| 454 | + " LEFT JOIN filename ON filename.fnid=clade.fnid\n" | |
| 451 | 455 | "WHERE mlink.fnid=clade.fnid AND mlink.fid=clade.fid\n" |
| 452 | - " AND event.objid=mlink.mid\n" | |
| 453 | - " AND blob.rid=clade.fid\n" | |
| 454 | - " AND filename.fnid=clade.fnid\n", | |
| 456 | + " AND event.objid=mlink.mid\n", | |
| 455 | 457 | TAG_BRANCH |
| 456 | 458 | ); |
| 457 | 459 | if( (zA = P("a"))!=0 ){ |
| 458 | 460 | blob_append_sql(&sql, " AND event.mtime>=%.16g\n", |
| 459 | 461 | symbolic_name_to_mtime(zA,0)); |
| @@ -622,10 +624,35 @@ | ||
| 622 | 624 | } |
| 623 | 625 | if( tmFlags & TIMELINE_COMPACT ){ |
| 624 | 626 | @ <span class='timelineCompactComment' data-id='%d(frid)'> |
| 625 | 627 | }else{ |
| 626 | 628 | @ <span class='timeline%s(zStyle)Comment'> |
| 629 | + if( pfnid ){ | |
| 630 | + char *zPrevName = db_text(0,"SELECT name FROM filename WHERE fnid=%d", | |
| 631 | + pfnid); | |
| 632 | + @ <b>Renamed</b> %h(zPrevName) → %h(zFName). | |
| 633 | + fossil_free(zPrevName); | |
| 634 | + } | |
| 635 | + if( zUuid && ridTo==0 && nParent==0 ){ | |
| 636 | + @ <b>Added:</b> | |
| 637 | + } | |
| 638 | + if( zUuid==0 ){ | |
| 639 | + char *zNewName; | |
| 640 | + zNewName = db_text(0, | |
| 641 | + "SELECT name FROM filename WHERE fnid = " | |
| 642 | + " (SELECT fnid FROM mlink" | |
| 643 | + " WHERE mid=%d" | |
| 644 | + " AND pfnid IN (SELECT fnid FROM filename WHERE name=%Q))", | |
| 645 | + fmid, zFName); | |
| 646 | + if( zNewName ){ | |
| 647 | + @ <b>Renamed</b> to | |
| 648 | + @ %z(href("%R/finfo?name=%t",zNewName))%h(zNewName)</a>. | |
| 649 | + fossil_free(zNewName); | |
| 650 | + }else{ | |
| 651 | + @ <b>Deleted:</b> | |
| 652 | + } | |
| 653 | + } | |
| 627 | 654 | if( (tmFlags & TIMELINE_VERBOSE)!=0 && zUuid ){ |
| 628 | 655 | hyperlink_to_version(zUuid); |
| 629 | 656 | @ part of check-in \ |
| 630 | 657 | hyperlink_to_version(zCkin); |
| 631 | 658 | } |
| @@ -645,16 +672,10 @@ | ||
| 645 | 672 | } |
| 646 | 673 | if( tmFlags & TIMELINE_COMPACT ){ |
| 647 | 674 | cgi_printf("<span class='clutter' id='detail-%d'>",frid); |
| 648 | 675 | } |
| 649 | 676 | cgi_printf("<span class='timeline%sDetail'>", zStyle); |
| 650 | - if( pfnid ){ | |
| 651 | - char *zPrevName = db_text(0,"SELECT name FROM filename WHERE fnid=%d", | |
| 652 | - pfnid); | |
| 653 | - @ <b>Renamed</b> %h(zPrevName) → %h(zFName). | |
| 654 | - fossil_free(zPrevName); | |
| 655 | - } | |
| 656 | 677 | if( tmFlags & (TIMELINE_COMPACT|TIMELINE_VERBOSE) ) cgi_printf("("); |
| 657 | 678 | if( zUuid && (tmFlags & TIMELINE_VERBOSE)==0 ){ |
| 658 | 679 | @ file: %z(href("%R/file?name=%T&ci=%!S",zFName,zCkin))\ |
| 659 | 680 | @ [%S(zUuid)]</a> |
| 660 | 681 | if( fShowId ){ |
| @@ -677,29 +698,10 @@ | ||
| 677 | 698 | if( tmFlags & (TIMELINE_COMPACT|TIMELINE_VERBOSE) ){ |
| 678 | 699 | @ size: %d(szFile)) |
| 679 | 700 | }else{ |
| 680 | 701 | @ size: %d(szFile) |
| 681 | 702 | } |
| 682 | - if( zUuid && ridTo==0 && nParent==0 ){ | |
| 683 | - @ <b>Added</b> | |
| 684 | - } | |
| 685 | - if( zUuid==0 ){ | |
| 686 | - char *zNewName; | |
| 687 | - zNewName = db_text(0, | |
| 688 | - "SELECT name FROM filename WHERE fnid = " | |
| 689 | - " (SELECT fnid FROM mlink" | |
| 690 | - " WHERE mid=%d" | |
| 691 | - " AND pfnid IN (SELECT fnid FROM filename WHERE name=%Q))", | |
| 692 | - fmid, zFName); | |
| 693 | - if( zNewName ){ | |
| 694 | - @ <b>Renamed</b> to | |
| 695 | - @ %z(href("%R/finfo?name=%t",zNewName))%h(zNewName)</a> | |
| 696 | - fossil_free(zNewName); | |
| 697 | - }else{ | |
| 698 | - @ <b>Deleted</b> | |
| 699 | - } | |
| 700 | - } | |
| 701 | 703 | if( g.perm.Hyperlink && zUuid ){ |
| 702 | 704 | const char *z = zFName; |
| 703 | 705 | @ <span id='links-%d(frid)'><span class='timelineExtraLinks'> |
| 704 | 706 | @ %z(href("%R/annotate?filename=%h&checkin=%s",z,zCkin)) |
| 705 | 707 | @ [annotate]</a> |
| @@ -716,11 +718,14 @@ | ||
| 716 | 718 | @ </span></span> |
| 717 | 719 | } |
| 718 | 720 | if( fDebug & FINFO_DEBUG_MLINK ){ |
| 719 | 721 | int ii; |
| 720 | 722 | char *zAncLink; |
| 721 | - @ <br />fid=%d(frid) pid=%d(fpid) mid=%d(fmid) | |
| 723 | + @ <br />fid=%d(frid) \ | |
| 724 | + @ graph-id=%d(frid>0 ? frid*(mxfnid+1)+fnid : fpid+1000000000) \ | |
| 725 | + @ pid=%d(fpid) mid=%d(fmid) fnid=%d(fnid) \ | |
| 726 | + @ pfnid=%d(pfnid) mxfnid=%d(mxfnid) | |
| 722 | 727 | if( nParent>0 ){ |
| 723 | 728 | @ parents=%d(aParent[0]) |
| 724 | 729 | for(ii=1; ii<nParent; ii++){ |
| 725 | 730 | @ %d(aParent[ii]) |
| 726 | 731 | } |
| 727 | 732 |
| --- src/finfo.c | |
| +++ src/finfo.c | |
| @@ -401,11 +401,13 @@ | |
| 401 | " SELECT mlink.fid, mlink.fnid\n" |
| 402 | " FROM clade, mlink\n" |
| 403 | " WHERE clade.fid=mlink.pid\n" |
| 404 | " AND ((mlink.pfnid=0 AND mlink.fnid=clade.fnid)\n" |
| 405 | " OR mlink.pfnid=clade.fnid)\n" |
| 406 | " AND mlink.fid>0" |
| 407 | " UNION\n" |
| 408 | " SELECT mlink.pid," |
| 409 | " CASE WHEN mlink.pfnid>0 THEN mlink.pfnid ELSE mlink.fnid END\n" |
| 410 | " FROM clade, mlink\n" |
| 411 | " WHERE mlink.pid>0\n" |
| @@ -445,15 +447,15 @@ | |
| 445 | " mlink.mid,\n" /* check-in ID */ |
| 446 | " mlink.pfnid,\n" /* Previous filename */ |
| 447 | " blob.size,\n" /* File size */ |
| 448 | " mlink.fnid,\n" /* Current filename */ |
| 449 | " filename.name\n" /* Current filename */ |
| 450 | "FROM clade CROSS JOIN mlink, event, blob, filename\n" |
| 451 | "WHERE mlink.fnid=clade.fnid AND mlink.fid=clade.fid\n" |
| 452 | " AND event.objid=mlink.mid\n" |
| 453 | " AND blob.rid=clade.fid\n" |
| 454 | " AND filename.fnid=clade.fnid\n", |
| 455 | TAG_BRANCH |
| 456 | ); |
| 457 | if( (zA = P("a"))!=0 ){ |
| 458 | blob_append_sql(&sql, " AND event.mtime>=%.16g\n", |
| 459 | symbolic_name_to_mtime(zA,0)); |
| @@ -622,10 +624,35 @@ | |
| 622 | } |
| 623 | if( tmFlags & TIMELINE_COMPACT ){ |
| 624 | @ <span class='timelineCompactComment' data-id='%d(frid)'> |
| 625 | }else{ |
| 626 | @ <span class='timeline%s(zStyle)Comment'> |
| 627 | if( (tmFlags & TIMELINE_VERBOSE)!=0 && zUuid ){ |
| 628 | hyperlink_to_version(zUuid); |
| 629 | @ part of check-in \ |
| 630 | hyperlink_to_version(zCkin); |
| 631 | } |
| @@ -645,16 +672,10 @@ | |
| 645 | } |
| 646 | if( tmFlags & TIMELINE_COMPACT ){ |
| 647 | cgi_printf("<span class='clutter' id='detail-%d'>",frid); |
| 648 | } |
| 649 | cgi_printf("<span class='timeline%sDetail'>", zStyle); |
| 650 | if( pfnid ){ |
| 651 | char *zPrevName = db_text(0,"SELECT name FROM filename WHERE fnid=%d", |
| 652 | pfnid); |
| 653 | @ <b>Renamed</b> %h(zPrevName) → %h(zFName). |
| 654 | fossil_free(zPrevName); |
| 655 | } |
| 656 | if( tmFlags & (TIMELINE_COMPACT|TIMELINE_VERBOSE) ) cgi_printf("("); |
| 657 | if( zUuid && (tmFlags & TIMELINE_VERBOSE)==0 ){ |
| 658 | @ file: %z(href("%R/file?name=%T&ci=%!S",zFName,zCkin))\ |
| 659 | @ [%S(zUuid)]</a> |
| 660 | if( fShowId ){ |
| @@ -677,29 +698,10 @@ | |
| 677 | if( tmFlags & (TIMELINE_COMPACT|TIMELINE_VERBOSE) ){ |
| 678 | @ size: %d(szFile)) |
| 679 | }else{ |
| 680 | @ size: %d(szFile) |
| 681 | } |
| 682 | if( zUuid && ridTo==0 && nParent==0 ){ |
| 683 | @ <b>Added</b> |
| 684 | } |
| 685 | if( zUuid==0 ){ |
| 686 | char *zNewName; |
| 687 | zNewName = db_text(0, |
| 688 | "SELECT name FROM filename WHERE fnid = " |
| 689 | " (SELECT fnid FROM mlink" |
| 690 | " WHERE mid=%d" |
| 691 | " AND pfnid IN (SELECT fnid FROM filename WHERE name=%Q))", |
| 692 | fmid, zFName); |
| 693 | if( zNewName ){ |
| 694 | @ <b>Renamed</b> to |
| 695 | @ %z(href("%R/finfo?name=%t",zNewName))%h(zNewName)</a> |
| 696 | fossil_free(zNewName); |
| 697 | }else{ |
| 698 | @ <b>Deleted</b> |
| 699 | } |
| 700 | } |
| 701 | if( g.perm.Hyperlink && zUuid ){ |
| 702 | const char *z = zFName; |
| 703 | @ <span id='links-%d(frid)'><span class='timelineExtraLinks'> |
| 704 | @ %z(href("%R/annotate?filename=%h&checkin=%s",z,zCkin)) |
| 705 | @ [annotate]</a> |
| @@ -716,11 +718,14 @@ | |
| 716 | @ </span></span> |
| 717 | } |
| 718 | if( fDebug & FINFO_DEBUG_MLINK ){ |
| 719 | int ii; |
| 720 | char *zAncLink; |
| 721 | @ <br />fid=%d(frid) pid=%d(fpid) mid=%d(fmid) |
| 722 | if( nParent>0 ){ |
| 723 | @ parents=%d(aParent[0]) |
| 724 | for(ii=1; ii<nParent; ii++){ |
| 725 | @ %d(aParent[ii]) |
| 726 | } |
| 727 |
| --- src/finfo.c | |
| +++ src/finfo.c | |
| @@ -401,11 +401,13 @@ | |
| 401 | " SELECT mlink.fid, mlink.fnid\n" |
| 402 | " FROM clade, mlink\n" |
| 403 | " WHERE clade.fid=mlink.pid\n" |
| 404 | " AND ((mlink.pfnid=0 AND mlink.fnid=clade.fnid)\n" |
| 405 | " OR mlink.pfnid=clade.fnid)\n" |
| 406 | " AND (mlink.fid>0 OR NOT EXISTS(SELECT 1 FROM mlink AS mx" |
| 407 | " WHERE mx.mid=mlink.mid AND mx.pid=mlink.pid" |
| 408 | " AND mx.fid>0 AND mx.pfnid=mlink.fnid))\n" |
| 409 | " UNION\n" |
| 410 | " SELECT mlink.pid," |
| 411 | " CASE WHEN mlink.pfnid>0 THEN mlink.pfnid ELSE mlink.fnid END\n" |
| 412 | " FROM clade, mlink\n" |
| 413 | " WHERE mlink.pid>0\n" |
| @@ -445,15 +447,15 @@ | |
| 447 | " mlink.mid,\n" /* check-in ID */ |
| 448 | " mlink.pfnid,\n" /* Previous filename */ |
| 449 | " blob.size,\n" /* File size */ |
| 450 | " mlink.fnid,\n" /* Current filename */ |
| 451 | " filename.name\n" /* Current filename */ |
| 452 | "FROM clade CROSS JOIN mlink, event" |
| 453 | " LEFT JOIN blob ON blob.rid=clade.fid" |
| 454 | " LEFT JOIN filename ON filename.fnid=clade.fnid\n" |
| 455 | "WHERE mlink.fnid=clade.fnid AND mlink.fid=clade.fid\n" |
| 456 | " AND event.objid=mlink.mid\n", |
| 457 | TAG_BRANCH |
| 458 | ); |
| 459 | if( (zA = P("a"))!=0 ){ |
| 460 | blob_append_sql(&sql, " AND event.mtime>=%.16g\n", |
| 461 | symbolic_name_to_mtime(zA,0)); |
| @@ -622,10 +624,35 @@ | |
| 624 | } |
| 625 | if( tmFlags & TIMELINE_COMPACT ){ |
| 626 | @ <span class='timelineCompactComment' data-id='%d(frid)'> |
| 627 | }else{ |
| 628 | @ <span class='timeline%s(zStyle)Comment'> |
| 629 | if( pfnid ){ |
| 630 | char *zPrevName = db_text(0,"SELECT name FROM filename WHERE fnid=%d", |
| 631 | pfnid); |
| 632 | @ <b>Renamed</b> %h(zPrevName) → %h(zFName). |
| 633 | fossil_free(zPrevName); |
| 634 | } |
| 635 | if( zUuid && ridTo==0 && nParent==0 ){ |
| 636 | @ <b>Added:</b> |
| 637 | } |
| 638 | if( zUuid==0 ){ |
| 639 | char *zNewName; |
| 640 | zNewName = db_text(0, |
| 641 | "SELECT name FROM filename WHERE fnid = " |
| 642 | " (SELECT fnid FROM mlink" |
| 643 | " WHERE mid=%d" |
| 644 | " AND pfnid IN (SELECT fnid FROM filename WHERE name=%Q))", |
| 645 | fmid, zFName); |
| 646 | if( zNewName ){ |
| 647 | @ <b>Renamed</b> to |
| 648 | @ %z(href("%R/finfo?name=%t",zNewName))%h(zNewName)</a>. |
| 649 | fossil_free(zNewName); |
| 650 | }else{ |
| 651 | @ <b>Deleted:</b> |
| 652 | } |
| 653 | } |
| 654 | if( (tmFlags & TIMELINE_VERBOSE)!=0 && zUuid ){ |
| 655 | hyperlink_to_version(zUuid); |
| 656 | @ part of check-in \ |
| 657 | hyperlink_to_version(zCkin); |
| 658 | } |
| @@ -645,16 +672,10 @@ | |
| 672 | } |
| 673 | if( tmFlags & TIMELINE_COMPACT ){ |
| 674 | cgi_printf("<span class='clutter' id='detail-%d'>",frid); |
| 675 | } |
| 676 | cgi_printf("<span class='timeline%sDetail'>", zStyle); |
| 677 | if( tmFlags & (TIMELINE_COMPACT|TIMELINE_VERBOSE) ) cgi_printf("("); |
| 678 | if( zUuid && (tmFlags & TIMELINE_VERBOSE)==0 ){ |
| 679 | @ file: %z(href("%R/file?name=%T&ci=%!S",zFName,zCkin))\ |
| 680 | @ [%S(zUuid)]</a> |
| 681 | if( fShowId ){ |
| @@ -677,29 +698,10 @@ | |
| 698 | if( tmFlags & (TIMELINE_COMPACT|TIMELINE_VERBOSE) ){ |
| 699 | @ size: %d(szFile)) |
| 700 | }else{ |
| 701 | @ size: %d(szFile) |
| 702 | } |
| 703 | if( g.perm.Hyperlink && zUuid ){ |
| 704 | const char *z = zFName; |
| 705 | @ <span id='links-%d(frid)'><span class='timelineExtraLinks'> |
| 706 | @ %z(href("%R/annotate?filename=%h&checkin=%s",z,zCkin)) |
| 707 | @ [annotate]</a> |
| @@ -716,11 +718,14 @@ | |
| 718 | @ </span></span> |
| 719 | } |
| 720 | if( fDebug & FINFO_DEBUG_MLINK ){ |
| 721 | int ii; |
| 722 | char *zAncLink; |
| 723 | @ <br />fid=%d(frid) \ |
| 724 | @ graph-id=%d(frid>0 ? frid*(mxfnid+1)+fnid : fpid+1000000000) \ |
| 725 | @ pid=%d(fpid) mid=%d(fmid) fnid=%d(fnid) \ |
| 726 | @ pfnid=%d(pfnid) mxfnid=%d(mxfnid) |
| 727 | if( nParent>0 ){ |
| 728 | @ parents=%d(aParent[0]) |
| 729 | for(ii=1; ii<nParent; ii++){ |
| 730 | @ %d(aParent[ii]) |
| 731 | } |
| 732 |