Fossil SCM

Do a better job of showing when a file is added, deleted, or renamed in the /finfo page.

drh 2020-10-19 20:09 trunk
Commit a0bca48147b3ff1dca048b0e1d9fff2878e03b2f45fda8b1c7a86d57862929ad
1 file changed +36 -31
+36 -31
--- src/finfo.c
+++ src/finfo.c
@@ -401,11 +401,13 @@
401401
" SELECT mlink.fid, mlink.fnid\n"
402402
" FROM clade, mlink\n"
403403
" WHERE clade.fid=mlink.pid\n"
404404
" AND ((mlink.pfnid=0 AND mlink.fnid=clade.fnid)\n"
405405
" 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"
407409
" UNION\n"
408410
" SELECT mlink.pid,"
409411
" CASE WHEN mlink.pfnid>0 THEN mlink.pfnid ELSE mlink.fnid END\n"
410412
" FROM clade, mlink\n"
411413
" WHERE mlink.pid>0\n"
@@ -445,15 +447,15 @@
445447
" mlink.mid,\n" /* check-in ID */
446448
" mlink.pfnid,\n" /* Previous filename */
447449
" blob.size,\n" /* File size */
448450
" mlink.fnid,\n" /* Current filename */
449451
" 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"
451455
"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",
455457
TAG_BRANCH
456458
);
457459
if( (zA = P("a"))!=0 ){
458460
blob_append_sql(&sql, " AND event.mtime>=%.16g\n",
459461
symbolic_name_to_mtime(zA,0));
@@ -622,10 +624,35 @@
622624
}
623625
if( tmFlags & TIMELINE_COMPACT ){
624626
@ <span class='timelineCompactComment' data-id='%d(frid)'>
625627
}else{
626628
@ <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) &rarr; %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
+ }
627654
if( (tmFlags & TIMELINE_VERBOSE)!=0 && zUuid ){
628655
hyperlink_to_version(zUuid);
629656
@ part of check-in \
630657
hyperlink_to_version(zCkin);
631658
}
@@ -645,16 +672,10 @@
645672
}
646673
if( tmFlags & TIMELINE_COMPACT ){
647674
cgi_printf("<span class='clutter' id='detail-%d'>",frid);
648675
}
649676
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) &rarr; %h(zFName).
654
- fossil_free(zPrevName);
655
- }
656677
if( tmFlags & (TIMELINE_COMPACT|TIMELINE_VERBOSE) ) cgi_printf("(");
657678
if( zUuid && (tmFlags & TIMELINE_VERBOSE)==0 ){
658679
@ file:&nbsp;%z(href("%R/file?name=%T&ci=%!S",zFName,zCkin))\
659680
@ [%S(zUuid)]</a>
660681
if( fShowId ){
@@ -677,29 +698,10 @@
677698
if( tmFlags & (TIMELINE_COMPACT|TIMELINE_VERBOSE) ){
678699
@ size:&nbsp;%d(szFile))
679700
}else{
680701
@ size:&nbsp;%d(szFile)
681702
}
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
- }
701703
if( g.perm.Hyperlink && zUuid ){
702704
const char *z = zFName;
703705
@ <span id='links-%d(frid)'><span class='timelineExtraLinks'>
704706
@ %z(href("%R/annotate?filename=%h&checkin=%s",z,zCkin))
705707
@ [annotate]</a>
@@ -716,11 +718,14 @@
716718
@ </span></span>
717719
}
718720
if( fDebug & FINFO_DEBUG_MLINK ){
719721
int ii;
720722
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)
722727
if( nParent>0 ){
723728
@ parents=%d(aParent[0])
724729
for(ii=1; ii<nParent; ii++){
725730
@ %d(aParent[ii])
726731
}
727732
--- 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) &rarr; %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:&nbsp;%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:&nbsp;%d(szFile))
679 }else{
680 @ size:&nbsp;%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) &rarr; %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:&nbsp;%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:&nbsp;%d(szFile))
700 }else{
701 @ size:&nbsp;%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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button