Fossil SCM

Faster and more accurate method for computing file-age. Also add the showid query parameter to /fileage and extend showid on /timeline to show the RIDs for individual files when the "v" query parameter is used.

drh 2015-02-07 15:59 trunk
Commit dd51f09a390e556968d2e6871e338af55b2bd24d
2 files changed +24 -23 +11 -5
+24 -23
--- src/browse.c
+++ src/browse.c
@@ -885,38 +885,33 @@
885885
@ mid INTEGER,
886886
@ mtime DATETIME,
887887
@ pathname TEXT
888888
@ );
889889
@ CREATE VIRTUAL TABLE IF NOT EXISTS temp.foci USING files_of_checkin;
890
-@ CREATE TEMP TABLE descendents(x INTEGER PRIMARY KEY);
891890
;
892891
893
-static const char zComputeFileAgeRun1[] =
892
+static const char zComputeFileAgeRun[] =
894893
@ WITH RECURSIVE
895894
@ ckin(x,m) AS (SELECT objid, mtime FROM event WHERE objid=:ckin
896895
@ UNION
897896
@ SELECT plink.pid, event.mtime
898897
@ FROM ckin, plink, event
899898
@ WHERE plink.cid=ckin.x AND event.objid=plink.pid
900899
@ ORDER BY 2 DESC)
901
-@ INSERT INTO descendents SELECT x FROM ckin;
902
-;
903
-static const char zComputeFileAgeRun2[] =
904900
@ INSERT OR IGNORE INTO fileage(fnid, fid, mid, mtime, pathname)
905
-@ SELECT mlink.fnid, mlink.fid, x, event.mtime, filename.name
906
-@ FROM descendents, mlink, event, filename
907
-@ WHERE mlink.mid=descendents.x
908
-@ AND mlink.fnid IN (SELECT fnid FROM foci, filename
909
-@ WHERE foci.checkinID=:ckin
910
-@ AND filename.name=foci.filename
911
-@ AND filename.name GLOB :glob)
912
-@ AND filename.fnid=mlink.fnid
913
-@ AND event.objid=mlink.mid
901
+@ SELECT filename.fnid, mlink.fid, mlink.mid, event.mtime, filename.name
902
+@ FROM foci, filename, blob, mlink, event
903
+@ WHERE foci.checkinID=:ckin
904
+@ AND foci.filename GLOB :glob
905
+@ AND filename.name=foci.filename
906
+@ AND blob.uuid=foci.uuid
907
+@ AND mlink.fid=blob.rid
914908
@ AND mlink.fid!=mlink.pid
915
-@ ORDER BY event.mtime DESC;
909
+@ AND mlink.mid IN (SELECT x FROM ckin)
910
+@ AND event.objid=mlink.mid
911
+@ ORDER BY event.mtime ASC;
916912
;
917
-
918913
919914
/*
920915
** Look at all file containing in the version "vid". Construct a
921916
** temporary table named "fileage" that contains the file-id for each
922917
** files, the pathname, the check-in where the file was added, and the
@@ -924,15 +919,11 @@
924919
** the given glob are computed.
925920
*/
926921
int compute_fileage(int vid, const char* zGlob){
927922
Stmt q;
928923
db_multi_exec(zComputeFileAgeSetup /*works-like:"constant"*/);
929
- db_prepare(&q, zComputeFileAgeRun1 /*works-like:"constant"*/);
930
- db_bind_int(&q, ":ckin", vid);
931
- db_exec(&q);
932
- db_finalize(&q);
933
- db_prepare(&q, zComputeFileAgeRun2 /*works-like:"constant"*/);
924
+ db_prepare(&q, zComputeFileAgeRun /*works-like:"constant"*/);
934925
db_bind_int(&q, ":ckin", vid);
935926
db_bind_text(&q, ":glob", zGlob && zGlob[0] ? zGlob : "*");
936927
db_exec(&q);
937928
db_finalize(&q);
938929
return 0;
@@ -999,17 +990,19 @@
999990
**
1000991
** Parameters:
1001992
** name=VERSION Selects the checkin version (default=tip).
1002993
** glob=STRING Only shows files matching this glob pattern
1003994
** (e.g. *.c or *.txt).
995
+** showid Show RID values for debugging
1004996
*/
1005997
void fileage_page(void){
1006998
int rid;
1007999
const char *zName;
10081000
const char *zGlob;
10091001
const char *zUuid;
10101002
const char *zNow; /* Time of checkin */
1003
+ int showId = PB("showid");
10111004
Stmt q1, q2;
10121005
double baseTime;
10131006
login_check_credentials();
10141007
if( !g.perm.Read ){ login_needed(); return; }
10151008
zName = P("name");
@@ -1055,11 +1048,11 @@
10551048
" AND blob.rid=event.objid\n"
10561049
" ORDER BY event.mtime DESC;",
10571050
TAG_BRANCH
10581051
);
10591052
db_prepare(&q2,
1060
- "SELECT blob.uuid, filename.name\n"
1053
+ "SELECT blob.uuid, filename.name, fileage.fid\n"
10611054
" FROM fileage, blob, filename\n"
10621055
" WHERE fileage.mid=:mid AND filename.fnid=fileage.fnid"
10631056
" AND blob.rid=fileage.fid;"
10641057
);
10651058
while( db_step(&q1)==SQLITE_ROW ){
@@ -1074,16 +1067,24 @@
10741067
@ <td>
10751068
db_bind_int(&q2, ":mid", mid);
10761069
while( db_step(&q2)==SQLITE_ROW ){
10771070
const char *zFUuid = db_column_text(&q2,0);
10781071
const char *zFile = db_column_text(&q2,1);
1079
- @ %z(href("%R/artifact/%s",zFUuid))%h(zFile)</a><br>
1072
+ int fid = db_column_int(&q2,2);
1073
+ if( showId ){
1074
+ @ %z(href("%R/artifact/%s",zFUuid))%h(zFile)</a> (%d(fid))<br>
1075
+ }else{
1076
+ @ %z(href("%R/artifact/%s",zFUuid))%h(zFile)</a><br>
1077
+ }
10801078
}
10811079
db_reset(&q2);
10821080
@ </td>
10831081
@ <td>
10841082
@ %z(href("%R/info/%s",zUuid))[%S(zUuid)]</a>
1083
+ if( showId ){
1084
+ @ (%d(mid))
1085
+ }
10851086
@ %W(zComment) (user:
10861087
@ %z(href("%R/timeline?u=%t&c=%t&nd&n=200",zUser,zUuid))%h(zUser)</a>,
10871088
@ branch:
10881089
@ %z(href("%R/timeline?r=%t&c=%t&nd&n=200",zBranch,zUuid))%h(zBranch)</a>)
10891090
@ </td></tr>
10901091
--- src/browse.c
+++ src/browse.c
@@ -885,38 +885,33 @@
885 @ mid INTEGER,
886 @ mtime DATETIME,
887 @ pathname TEXT
888 @ );
889 @ CREATE VIRTUAL TABLE IF NOT EXISTS temp.foci USING files_of_checkin;
890 @ CREATE TEMP TABLE descendents(x INTEGER PRIMARY KEY);
891 ;
892
893 static const char zComputeFileAgeRun1[] =
894 @ WITH RECURSIVE
895 @ ckin(x,m) AS (SELECT objid, mtime FROM event WHERE objid=:ckin
896 @ UNION
897 @ SELECT plink.pid, event.mtime
898 @ FROM ckin, plink, event
899 @ WHERE plink.cid=ckin.x AND event.objid=plink.pid
900 @ ORDER BY 2 DESC)
901 @ INSERT INTO descendents SELECT x FROM ckin;
902 ;
903 static const char zComputeFileAgeRun2[] =
904 @ INSERT OR IGNORE INTO fileage(fnid, fid, mid, mtime, pathname)
905 @ SELECT mlink.fnid, mlink.fid, x, event.mtime, filename.name
906 @ FROM descendents, mlink, event, filename
907 @ WHERE mlink.mid=descendents.x
908 @ AND mlink.fnid IN (SELECT fnid FROM foci, filename
909 @ WHERE foci.checkinID=:ckin
910 @ AND filename.name=foci.filename
911 @ AND filename.name GLOB :glob)
912 @ AND filename.fnid=mlink.fnid
913 @ AND event.objid=mlink.mid
914 @ AND mlink.fid!=mlink.pid
915 @ ORDER BY event.mtime DESC;
 
 
916 ;
917
918
919 /*
920 ** Look at all file containing in the version "vid". Construct a
921 ** temporary table named "fileage" that contains the file-id for each
922 ** files, the pathname, the check-in where the file was added, and the
@@ -924,15 +919,11 @@
924 ** the given glob are computed.
925 */
926 int compute_fileage(int vid, const char* zGlob){
927 Stmt q;
928 db_multi_exec(zComputeFileAgeSetup /*works-like:"constant"*/);
929 db_prepare(&q, zComputeFileAgeRun1 /*works-like:"constant"*/);
930 db_bind_int(&q, ":ckin", vid);
931 db_exec(&q);
932 db_finalize(&q);
933 db_prepare(&q, zComputeFileAgeRun2 /*works-like:"constant"*/);
934 db_bind_int(&q, ":ckin", vid);
935 db_bind_text(&q, ":glob", zGlob && zGlob[0] ? zGlob : "*");
936 db_exec(&q);
937 db_finalize(&q);
938 return 0;
@@ -999,17 +990,19 @@
999 **
1000 ** Parameters:
1001 ** name=VERSION Selects the checkin version (default=tip).
1002 ** glob=STRING Only shows files matching this glob pattern
1003 ** (e.g. *.c or *.txt).
 
1004 */
1005 void fileage_page(void){
1006 int rid;
1007 const char *zName;
1008 const char *zGlob;
1009 const char *zUuid;
1010 const char *zNow; /* Time of checkin */
 
1011 Stmt q1, q2;
1012 double baseTime;
1013 login_check_credentials();
1014 if( !g.perm.Read ){ login_needed(); return; }
1015 zName = P("name");
@@ -1055,11 +1048,11 @@
1055 " AND blob.rid=event.objid\n"
1056 " ORDER BY event.mtime DESC;",
1057 TAG_BRANCH
1058 );
1059 db_prepare(&q2,
1060 "SELECT blob.uuid, filename.name\n"
1061 " FROM fileage, blob, filename\n"
1062 " WHERE fileage.mid=:mid AND filename.fnid=fileage.fnid"
1063 " AND blob.rid=fileage.fid;"
1064 );
1065 while( db_step(&q1)==SQLITE_ROW ){
@@ -1074,16 +1067,24 @@
1074 @ <td>
1075 db_bind_int(&q2, ":mid", mid);
1076 while( db_step(&q2)==SQLITE_ROW ){
1077 const char *zFUuid = db_column_text(&q2,0);
1078 const char *zFile = db_column_text(&q2,1);
1079 @ %z(href("%R/artifact/%s",zFUuid))%h(zFile)</a><br>
 
 
 
 
 
1080 }
1081 db_reset(&q2);
1082 @ </td>
1083 @ <td>
1084 @ %z(href("%R/info/%s",zUuid))[%S(zUuid)]</a>
 
 
 
1085 @ %W(zComment) (user:
1086 @ %z(href("%R/timeline?u=%t&c=%t&nd&n=200",zUser,zUuid))%h(zUser)</a>,
1087 @ branch:
1088 @ %z(href("%R/timeline?r=%t&c=%t&nd&n=200",zBranch,zUuid))%h(zBranch)</a>)
1089 @ </td></tr>
1090
--- src/browse.c
+++ src/browse.c
@@ -885,38 +885,33 @@
885 @ mid INTEGER,
886 @ mtime DATETIME,
887 @ pathname TEXT
888 @ );
889 @ CREATE VIRTUAL TABLE IF NOT EXISTS temp.foci USING files_of_checkin;
 
890 ;
891
892 static const char zComputeFileAgeRun[] =
893 @ WITH RECURSIVE
894 @ ckin(x,m) AS (SELECT objid, mtime FROM event WHERE objid=:ckin
895 @ UNION
896 @ SELECT plink.pid, event.mtime
897 @ FROM ckin, plink, event
898 @ WHERE plink.cid=ckin.x AND event.objid=plink.pid
899 @ ORDER BY 2 DESC)
 
 
 
900 @ INSERT OR IGNORE INTO fileage(fnid, fid, mid, mtime, pathname)
901 @ SELECT filename.fnid, mlink.fid, mlink.mid, event.mtime, filename.name
902 @ FROM foci, filename, blob, mlink, event
903 @ WHERE foci.checkinID=:ckin
904 @ AND foci.filename GLOB :glob
905 @ AND filename.name=foci.filename
906 @ AND blob.uuid=foci.uuid
907 @ AND mlink.fid=blob.rid
 
 
908 @ AND mlink.fid!=mlink.pid
909 @ AND mlink.mid IN (SELECT x FROM ckin)
910 @ AND event.objid=mlink.mid
911 @ ORDER BY event.mtime ASC;
912 ;
 
913
914 /*
915 ** Look at all file containing in the version "vid". Construct a
916 ** temporary table named "fileage" that contains the file-id for each
917 ** files, the pathname, the check-in where the file was added, and the
@@ -924,15 +919,11 @@
919 ** the given glob are computed.
920 */
921 int compute_fileage(int vid, const char* zGlob){
922 Stmt q;
923 db_multi_exec(zComputeFileAgeSetup /*works-like:"constant"*/);
924 db_prepare(&q, zComputeFileAgeRun /*works-like:"constant"*/);
 
 
 
 
925 db_bind_int(&q, ":ckin", vid);
926 db_bind_text(&q, ":glob", zGlob && zGlob[0] ? zGlob : "*");
927 db_exec(&q);
928 db_finalize(&q);
929 return 0;
@@ -999,17 +990,19 @@
990 **
991 ** Parameters:
992 ** name=VERSION Selects the checkin version (default=tip).
993 ** glob=STRING Only shows files matching this glob pattern
994 ** (e.g. *.c or *.txt).
995 ** showid Show RID values for debugging
996 */
997 void fileage_page(void){
998 int rid;
999 const char *zName;
1000 const char *zGlob;
1001 const char *zUuid;
1002 const char *zNow; /* Time of checkin */
1003 int showId = PB("showid");
1004 Stmt q1, q2;
1005 double baseTime;
1006 login_check_credentials();
1007 if( !g.perm.Read ){ login_needed(); return; }
1008 zName = P("name");
@@ -1055,11 +1048,11 @@
1048 " AND blob.rid=event.objid\n"
1049 " ORDER BY event.mtime DESC;",
1050 TAG_BRANCH
1051 );
1052 db_prepare(&q2,
1053 "SELECT blob.uuid, filename.name, fileage.fid\n"
1054 " FROM fileage, blob, filename\n"
1055 " WHERE fileage.mid=:mid AND filename.fnid=fileage.fnid"
1056 " AND blob.rid=fileage.fid;"
1057 );
1058 while( db_step(&q1)==SQLITE_ROW ){
@@ -1074,16 +1067,24 @@
1067 @ <td>
1068 db_bind_int(&q2, ":mid", mid);
1069 while( db_step(&q2)==SQLITE_ROW ){
1070 const char *zFUuid = db_column_text(&q2,0);
1071 const char *zFile = db_column_text(&q2,1);
1072 int fid = db_column_int(&q2,2);
1073 if( showId ){
1074 @ %z(href("%R/artifact/%s",zFUuid))%h(zFile)</a> (%d(fid))<br>
1075 }else{
1076 @ %z(href("%R/artifact/%s",zFUuid))%h(zFile)</a><br>
1077 }
1078 }
1079 db_reset(&q2);
1080 @ </td>
1081 @ <td>
1082 @ %z(href("%R/info/%s",zUuid))[%S(zUuid)]</a>
1083 if( showId ){
1084 @ (%d(mid))
1085 }
1086 @ %W(zComment) (user:
1087 @ %z(href("%R/timeline?u=%t&c=%t&nd&n=200",zUser,zUuid))%h(zUser)</a>,
1088 @ branch:
1089 @ %z(href("%R/timeline?r=%t&c=%t&nd&n=200",zBranch,zUuid))%h(zBranch)</a>)
1090 @ </td></tr>
1091
+11 -5
--- src/timeline.c
+++ src/timeline.c
@@ -509,36 +509,42 @@
509509
int isDel = fid==0;
510510
const char *zOldName = db_column_text(&fchngQuery, 5);
511511
const char *zOld = db_column_text(&fchngQuery, 4);
512512
const char *zNew = db_column_text(&fchngQuery, 3);
513513
const char *zUnpubTag = "";
514
+ char zId[20];
514515
if( !inUl ){
515516
@ <ul class="filelist">
516517
inUl = 1;
518
+ }
519
+ if( tmFlags & TIMELINE_SHOWRID ){
520
+ sqlite3_snprintf(sizeof(zId), zId, " (%d) ", fid);
521
+ }else{
522
+ zId[0] = 0;
517523
}
518524
if( (tmFlags & TIMELINE_FRENAMES)!=0 ){
519525
if( !isNew && !isDel && zOldName!=0 ){
520
- @ <li> %h(zOldName) &rarr; %h(zFilename)
526
+ @ <li> %h(zOldName) &rarr; %h(zFilename)%s(zId)
521527
}
522528
continue;
523529
}
524530
if( content_is_private(fid) ){
525531
zUnpubTag = UNPUB_TAG;
526532
}
527533
if( isNew ){
528
- @ <li> %h(zFilename) %s(zUnpubTag) (new file) &nbsp;
534
+ @ <li> %h(zFilename)%s(zId) %s(zUnpubTag) (new file) &nbsp;
529535
@ %z(href("%R/artifact/%s",zNew))[view]</a></li>
530536
}else if( isDel ){
531537
@ <li> %h(zFilename) (deleted)</li>
532538
}else if( fossil_strcmp(zOld,zNew)==0 && zOldName!=0 ){
533
- @ <li> %h(zOldName) &rarr; %h(zFilename) %s(zUnpubTag)
539
+ @ <li> %h(zOldName) &rarr; %h(zFilename)%s(zId) %s(zUnpubTag)
534540
@ %z(href("%R/artifact/%s",zNew))[view]</a></li>
535541
}else{
536542
if( zOldName!=0 ){
537
- @ <li> %h(zOldName) &rarr; %h(zFilename) %s(zUnpubTag)
543
+ @ <li> %h(zOldName) &rarr; %h(zFilename)%s(zId) %s(zUnpubTag)
538544
}else{
539
- @ <li> %h(zFilename) &nbsp; %s(zUnpubTag)
545
+ @ <li> %h(zFilename)%s(zId) &nbsp; %s(zUnpubTag)
540546
}
541547
@ %z(href("%R/fdiff?sbs=1&v1=%s&v2=%s",zOld,zNew))[diff]</a></li>
542548
}
543549
}
544550
db_reset(&fchngQuery);
545551
--- src/timeline.c
+++ src/timeline.c
@@ -509,36 +509,42 @@
509 int isDel = fid==0;
510 const char *zOldName = db_column_text(&fchngQuery, 5);
511 const char *zOld = db_column_text(&fchngQuery, 4);
512 const char *zNew = db_column_text(&fchngQuery, 3);
513 const char *zUnpubTag = "";
 
514 if( !inUl ){
515 @ <ul class="filelist">
516 inUl = 1;
 
 
 
 
 
517 }
518 if( (tmFlags & TIMELINE_FRENAMES)!=0 ){
519 if( !isNew && !isDel && zOldName!=0 ){
520 @ <li> %h(zOldName) &rarr; %h(zFilename)
521 }
522 continue;
523 }
524 if( content_is_private(fid) ){
525 zUnpubTag = UNPUB_TAG;
526 }
527 if( isNew ){
528 @ <li> %h(zFilename) %s(zUnpubTag) (new file) &nbsp;
529 @ %z(href("%R/artifact/%s",zNew))[view]</a></li>
530 }else if( isDel ){
531 @ <li> %h(zFilename) (deleted)</li>
532 }else if( fossil_strcmp(zOld,zNew)==0 && zOldName!=0 ){
533 @ <li> %h(zOldName) &rarr; %h(zFilename) %s(zUnpubTag)
534 @ %z(href("%R/artifact/%s",zNew))[view]</a></li>
535 }else{
536 if( zOldName!=0 ){
537 @ <li> %h(zOldName) &rarr; %h(zFilename) %s(zUnpubTag)
538 }else{
539 @ <li> %h(zFilename) &nbsp; %s(zUnpubTag)
540 }
541 @ %z(href("%R/fdiff?sbs=1&v1=%s&v2=%s",zOld,zNew))[diff]</a></li>
542 }
543 }
544 db_reset(&fchngQuery);
545
--- src/timeline.c
+++ src/timeline.c
@@ -509,36 +509,42 @@
509 int isDel = fid==0;
510 const char *zOldName = db_column_text(&fchngQuery, 5);
511 const char *zOld = db_column_text(&fchngQuery, 4);
512 const char *zNew = db_column_text(&fchngQuery, 3);
513 const char *zUnpubTag = "";
514 char zId[20];
515 if( !inUl ){
516 @ <ul class="filelist">
517 inUl = 1;
518 }
519 if( tmFlags & TIMELINE_SHOWRID ){
520 sqlite3_snprintf(sizeof(zId), zId, " (%d) ", fid);
521 }else{
522 zId[0] = 0;
523 }
524 if( (tmFlags & TIMELINE_FRENAMES)!=0 ){
525 if( !isNew && !isDel && zOldName!=0 ){
526 @ <li> %h(zOldName) &rarr; %h(zFilename)%s(zId)
527 }
528 continue;
529 }
530 if( content_is_private(fid) ){
531 zUnpubTag = UNPUB_TAG;
532 }
533 if( isNew ){
534 @ <li> %h(zFilename)%s(zId) %s(zUnpubTag) (new file) &nbsp;
535 @ %z(href("%R/artifact/%s",zNew))[view]</a></li>
536 }else if( isDel ){
537 @ <li> %h(zFilename) (deleted)</li>
538 }else if( fossil_strcmp(zOld,zNew)==0 && zOldName!=0 ){
539 @ <li> %h(zOldName) &rarr; %h(zFilename)%s(zId) %s(zUnpubTag)
540 @ %z(href("%R/artifact/%s",zNew))[view]</a></li>
541 }else{
542 if( zOldName!=0 ){
543 @ <li> %h(zOldName) &rarr; %h(zFilename)%s(zId) %s(zUnpubTag)
544 }else{
545 @ <li> %h(zFilename)%s(zId) &nbsp; %s(zUnpubTag)
546 }
547 @ %z(href("%R/fdiff?sbs=1&v1=%s&v2=%s",zOld,zNew))[diff]</a></li>
548 }
549 }
550 db_reset(&fchngQuery);
551

Keyboard Shortcuts

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