@@ -112,9 +112,9 @@
static int showDescendents(int pid, int depth){
Stmt q;
int cnt = 0;
db_prepare(&q,
- "SELECT plink.cid, blob.uuid, datetime(plink.mtime),"
+ "SELECT plink.cid, blob.uuid, datetime(plink.mtime, 'localtime'),"
" event.user, event.comment"
" FROM plink, blob, event"
" WHERE plink.pid=%d"
" AND blob.rid=plink.cid"
@@ -158,9 +158,9 @@
static int showAncestors(int pid, int depth){
Stmt q;
int cnt = 0;
db_prepare(&q,
- "SELECT plink.pid, blob.uuid, datetime(event.mtime),"
+ "SELECT plink.pid, blob.uuid, datetime(event.mtime, 'localtime'),"
" event.user, event.comment"
" FROM plink, blob, event"
" WHERE plink.cid=%d"
" AND blob.rid=plink.pid"
@@ -169,9 +169,8 @@
pid
);
@ <ul>
while( db_step(&q)==SQLITE_ROW ){
- int n;
int cid = db_column_int(&q, 0);
const char *zUuid = db_column_text(&q, 1);
const char *zDate = db_column_text(&q, 2);
const char *zUser = db_column_text(&q, 3);
@@ -197,9 +196,9 @@
void vinfo_page(void){
Stmt q;
int rid;
int isLeaf;
- int cid, pid, n;
+ int n;
login_check_credentials();
if( !g.okHistory ){ login_needed(); return; }
style_header("Version Information");
@@ -210,9 +209,9 @@
return;
}
isLeaf = !db_exists("SELECT 1 FROM plink WHERE pid=%d", rid);
db_prepare(&q,
- "SELECT uuid, datetime(mtime), user, comment"
+ "SELECT uuid, datetime(mtime, 'localtime'), user, comment"
" FROM blob, event"
" WHERE blob.rid=%d"
" AND event.objid=%d",
rid, rid
@@ -256,185 +255,65 @@
@ <b>Added:</b>
}else{
@ <b>Deleted:</b>
}
- @ %h(zName)</li>
+ @ <a href="%s(g.zBaseURL)/finfo/%T(zName)">%h(zName)</a></li>
}
@ </ul>
style_footer();
}
-
-#if 0
/*
-** WEB PAGE: vinfo
+** WEBPAGE: finfo
**
-** Return information about a version. The version number is contained
-** in g.zExtra.
+** Show the complete change history for a single file. The name
+** of the file is in g.zExtra
*/
-void vinfo_page(void){
+void finfo_page(void){
Stmt q;
- int rid;
- char cType;
- char *zType;
-
+ char zPrevDate[20];
login_check_credentials();
if( !g.okHistory ){ login_needed(); return; }
- style_header("Version Information");
- rid = name_to_rid(g.zExtra);
- if( rid==0 ){
- @ No such object: %h(g.argv[2])
- style_footer();
- return;
- }
- db_row_to_table("SELECT "
- " blob.uuid AS \"UUID\""
- ", datetime(rcvfrom.mtime) AS \"Created\""
- ", rcvfrom.uid AS \"User Id\""
- ", blob.size AS \"Size\""
- "FROM blob, rcvfrom "
- "WHERE rid=%d", rid
+ style_header("File History");
+
+ zPrevDate[0] = 0;
+ db_prepare(&q,
+ "SELECT blob.uuid, datetime(event.mtime,'localtime'),"
+ " event.comment, event.user"
+ " FROM mlink, blob, event"
+ " WHERE mlink.fnid=(SELECT fnid FROM filename WHERE name=%Q)"
+ " AND blob.rid=mlink.mid"
+ " AND event.objid=mlink.mid"
+ " ORDER BY event.mtime DESC",
+ g.zExtra
);
- style_footer();
- return;
-
- db_prepare(&q,
- "SELECT "
- "uuid, " /* 0 */
- "datetime(mtime,'unixepoch')," /* 1 */
- "datetime(ctime,'unixepoch')," /* 2 */
- "uid, size, cksum, branch, comment, type" /* 3..8 */
- "FROM record WHERE rid=%d", rid
- );
- if( db_step(&q)==SQLITE_ROW ){
- const char *z;
- const char *zSignedBy = db_text("unknown",
- "SELECT login FROM repuser WHERE uid=%d",
- db_column_int(&q, 3));
- cType = db_column_text(&q,8)[0];
- switch( cType ){
- case 'f': zType = "file"; break;
- case 'v': zType = "version"; break;
- case 'c': zType = "control"; break;
- case 'w': zType = "wiki"; break;
- case 'a': zType = "attachment"; break;
- case 't': zType = "ticket"; break;
+ @ <h2>History of %h(g.zExtra)</h2>
+ @ <table cellspacing=0 border=0 cellpadding=0>
+ while( db_step(&q)==SQLITE_ROW ){
+ const char *zDate = db_column_text(&q, 1);
+ if( memcmp(zDate, zPrevDate, 10) ){
+ sprintf(zPrevDate, "%.10s", zDate);
+ @ <tr><td colspan=3>
+ @ <table cellpadding=2 border=0>
+ @ <tr><td bgcolor="#a0b5f4" class="border1">
+ @ <table cellpadding=2 cellspacing=0 border=0><tr>
+ @ <td bgcolor="#d0d9f4" class="bkgnd1">%s(zPrevDate)</td>
+ @ </tr></table>
+ @ </td></tr></table>
+ @ </td></tr>
}
- @ <table border="0" cellpadding="0" cellspacing="0">
- @ <tr><td align="right">%s(zType) UUID:</td><td width="10"></td>
- @ <td>%s(db_column_text(&q,0))</td></tr>
- z = db_column_text(&q, 7);
- if( z ){
- @ <tr><td align="right" valign="top">comment:</td><td></td>
- @ <td valign="top">%h(z)</td></tr>
- }
- @ <tr><td align="right">created:</td><td></td>
- @ <td>%s(db_column_text(&q,2))</td></tr>
- @ <tr><td align="right">received:</td><td></td>
- @ <td>%s(db_column_text(&q,1))</td></tr>
- @ <tr><td align="right">signed by:</td><td></td>
- @ <td>%h(zSignedBy)</td></tr>
- z = db_column_text(&q, 4);
- if( z && z[0] && (z[0]!='0' || z[1]!=0) ){
- @ <tr><td align="right">size:</td><td></td>
- @ <td>%s(z)</td></tr>
- }
- z = db_column_text(&q, 5);
- if( z ){
- @ <tr><td align="right">MD5 checksum:</td><td></td>
- @ <td>%s(z)</td></tr>
- }
- z = db_column_text(&q, 6);
- if( z ){
- @ <tr><td align="right">branch:</td><td></td>
- @ <td>%h(z)</td></tr>
- }
+ @ <tr><td valign="top">%s(&zDate[11])</td>
+ @ <td width="20"></td>
+ @ <td valign="top" align="left">
+ hyperlink_to_uuid(db_column_text(&q,0));
+ @ %h(db_column_text(&q,2)) (by %h(db_column_text(&q,3)))</td>
}
db_finalize(&q);
- db_prepare(&q, "SELECT uuid, typecode FROM link JOIN record ON a=rid "
- " WHERE b=%d", rid);
- while( db_step(&q)==SQLITE_ROW ){
- const char *zType = db_column_text(&q, 1);
- const char *zUuid = db_column_text(&q, 0);
- if( zType[0]=='P' ){
- @ <tr><td align="right">parent:</td><td></td><td>
- hyperlink_to_uuid(zUuid);
- if( cType=='f' || cType=='w' ){
- hyperlink_to_diff(zUuid, g.zExtra);
- }
- @ </td></tr>
- }else if( zType[0]=='M' ){
- @ <tr><td align="right">merge parent:</td><td></td><td>
- hyperlink_to_uuid(zUuid);
- if( cType=='f' || cType=='w' ){
- hyperlink_to_diff(zUuid, g.zExtra);
- }
- @ </td></tr>
- }
- }
- db_finalize(&q);
- db_prepare(&q, "SELECT uuid, typecode FROM link JOIN record ON b=rid "
- " WHERE a=%d ORDER BY typecode DESC", rid);
- while( db_step(&q)==SQLITE_ROW ){
- const char *zType = db_column_text(&q, 1);
- const char *zUuid = db_column_text(&q, 0);
- if( zType[0]=='P' ){
- @ <tr><td align="right">child:</td><td></td><td>
- hyperlink_to_uuid(zUuid);
- if( cType=='f' || cType=='w' ){
- hyperlink_to_diff(g.zExtra, zUuid);
- }
- @ </td></tr>
- }else if( zType[0]=='M' ){
- @ <tr><td align="right">merge child:</td><td></td><td>
- hyperlink_to_uuid(zUuid);
- if( cType=='f' || cType=='w' ){
- hyperlink_to_diff(g.zExtra, zUuid);
- }
- @ </td></tr>
- }
- }
- db_finalize(&q);
- if( cType=='v' ){
- db_prepare(&q, "SELECT uuid, typecode, name "
- " FROM link, record, fname"
- " WHERE a=%d AND typecode IN ('D','E','I')"
- " AND b=record.rid AND fname.fnid=record.fnid"
- " ORDER BY name", rid);
- while( db_step(&q)==SQLITE_ROW ){
- const char *zUuid = db_column_text(&q, 0);
- const char *zType = db_column_text(&q, 1);
- const char *zName = db_column_text(&q, 2);
- if( zType[0]=='D' ){
- @ <tr><td align="right">deleted file:</td><td></td><td>
- hyperlink_to_uuid(zUuid);
- }else if( zType[0]=='E' ){
- @ <tr><td align="right">changed file:</td><td></td><td>
- hyperlink_to_uuid(zUuid);
- hyperlink_to_diff(zUuid, 0);
- }else if( zType[0]=='I' ){
- @ <tr><td align="right">added file:</td><td></td><td>
- hyperlink_to_uuid(zUuid);
- }
- @ %h(zName)</td></tr>
- }
- db_finalize(&q);
- }else if( cType=='f' ){
- db_prepare(&q, "SELECT uuid"
- " FROM link, record"
- " WHERE b=%d AND typecode IN ('E','I')"
- " AND a=record.rid", rid);
- while( db_step(&q)==SQLITE_ROW ){
- const char *zUuid = db_column_text(&q, 0);
- @ <tr><td align="right">associated version:</td><td></td><td>
- hyperlink_to_uuid(zUuid);
- @ </td></tr>
- }
- db_finalize(&q);
- }
+ @ </table>
style_footer();
}
-#endif
+
+
#if 0
/*
** WEB PAGE: diff