Check-in [1a9c6dbfb7]
Not logged in
Overview

SHA1 Hash:1a9c6dbfb7a85fd148c4def82a34c351e5309cfc
Date: 2007-08-01 16:13:49
User: drh
Comment:File differences and file viewer added to the www interface.
Timelines: ancestors | descendants | both | trunk
Other Links: files | ZIP archive | manifest

Tags And Properties
Changes
[hide diffs]

Modified src/info.c from [512979df91] to [ee42d04161].

@@ -278,23 +278,30 @@
   if( !g.okHistory ){ login_needed(); return; }
   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"
+    "SELECT a.uuid, substr(b.uuid,1,10), datetime(event.mtime,'localtime'),"
+    "       event.comment, event.user, mlink.pid, mlink.fid"
+    "  FROM mlink, blob a, blob b, event"
     " WHERE mlink.fnid=(SELECT fnid FROM filename WHERE name=%Q)"
-    "   AND blob.rid=mlink.mid"
+    "   AND a.rid=mlink.mid"
+    "   AND b.rid=mlink.fid"
     "   AND event.objid=mlink.mid"
     " ORDER BY event.mtime DESC",
     g.zExtra
   );
   @ <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);
+    const char *zVers = db_column_text(&q, 0);
+    const char *zUuid = db_column_text(&q, 1);
+    const char *zDate = db_column_text(&q, 2);
+    const char *zCom = db_column_text(&q, 3);
+    const char *zUser = db_column_text(&q, 4);
+    int fpid = db_column_int(&q, 5);
+    int frid = db_column_int(&q, 6);
     if( memcmp(zDate, zPrevDate, 10) ){
       sprintf(zPrevDate, "%.10s", zDate);
       @ <tr><td colspan=3>
       @ <table cellpadding=2 border=0>
       @ <tr><td bgcolor="#a0b5f4" class="border1">
@@ -305,12 +312,16 @@
       @ </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>
+    hyperlink_to_uuid(zVers);
+    @ %h(zCom) (By: %h(zUser))
+    @ Id: %s(zUuid)/%d(frid)
+    @ <a href="%s(g.zBaseURL)/fview/%d(frid)">[view]</a>
+    @ <a href="%s(g.zBaseURL)/fdiff?v1=%d(fpid)&amp;v2=%d(frid)">[diff]</a>
+    @ </td>
   }
   db_finalize(&q);
   @ </table>
   style_footer();
 }
@@ -335,14 +346,12 @@
 ** WEBPAGE: vdiff
 **
 ** Show all differences for a particular check-in specified by g.zExtra
 */
 void vdiff_page(void){
-  int rid, i;
-  Stmt q;
-  Manifest m;
-  Blob mfile, file;
+  int rid;
+  Stmt q;
   char *zUuid;
 
   login_check_credentials();
   if( !g.okHistory ){ login_needed(); return; }
   style_header("Version Diff");
@@ -375,59 +384,134 @@
   db_finalize(&q);
   style_footer();
 }
 
 
-
-#if 0
 /*
-** WEB PAGE: diff
+** Write a description of an object to the www reply.
+**
+** If the object is a file then mention:
+**
+**     * It's uuid
+**     * All its filenames
+**     * The versions it was checked-in on, with times and users
+**
+** If the object is a manifest, then mention:
 **
-** Display the difference between two files determined by the v1 and v2
-** query parameters.  If only v2 is given compute v1 as the parent of v2.
-** If v2 has no parent, then show the complete text of v2.
+**     * It's uuid
+**     * date of check-in
+**     * Comment & user
 */
-void diff_page(void){
-  const char *zV1 = P("v1");
-  const char *zV2 = P("v2");
-  int vid1, vid2;
-  Blob out;
-  Record *p1, *p2;
-
-  if( zV2==0 ){
-    cgi_redirect("index");
+static void object_description(int rid, int linkToView){
+  Stmt q;
+  int cnt = 0;
+  db_prepare(&q,
+    "SELECT filename.name, datetime(event.mtime), substr(a.uuid,1,10),"
+    "       event.comment, event.user, b.uuid"
+    "  FROM mlink, filename, event, blob a, blob b"
+    " WHERE filename.fnid=mlink.fnid"
+    "   AND event.objid=mlink.mid"
+    "   AND a.rid=mlink.fid"
+    "   AND b.rid=mlink.mid"
+    "   AND mlink.fid=%d",
+    rid
+  );
+  while( db_step(&q)==SQLITE_ROW ){
+    const char *zName = db_column_text(&q, 0);
+    const char *zDate = db_column_text(&q, 1);
+    const char *zFuuid = db_column_text(&q, 2);
+    const char *zCom = db_column_text(&q, 3);
+    const char *zUser = db_column_text(&q, 4);
+    const char *zVers = db_column_text(&q, 5);
+    @ File <a href="%s(g.zBaseURL)/finfo/%T(zName)">%h(zName)</a>
+    @ uuid %s(zFuuid) part of check-in
+    hyperlink_to_uuid(zVers);
+    @ %s(zCom) by %s(zUser) on %s(zDate).
+    cnt++;
   }
-  vid2 = uuid_to_rid(zV2, 0);
-  p2 = record_from_rid(vid2);
-  style_header("File Diff");
-  if( zV1==0 ){
-    zV1 = db_text(0,
-       "SELECT uuid FROM record WHERE rid="
-       "  (SELECT a FROM link WHERE typecode='P' AND b=%d)", vid2);
+  db_finalize(&q);
+  db_prepare(&q,
+    "SELECT datetime(mtime), user, comment, uuid"
+    "  FROM event, blob"
+    " WHERE event.objid=%d"
+    "   AND blob.rid=%d",
+    rid, rid
+  );
+  while( db_step(&q)==SQLITE_ROW ){
+    const char *zDate = db_column_text(&q, 0);
+    const char *zUuid = db_column_text(&q, 3);
+    const char *zCom = db_column_text(&q, 2);
+    const char *zUser = db_column_text(&q, 1);
+    @ Version
+    hyperlink_to_uuid(zUuid);
+    @ %s(zCom) by %s(zUser) on %s(zDate).
+    cnt++;
   }
-  if( zV1==0 ){
-    @ <p>Content of
-    hyperlink_to_uuid(zV2);
-    @ </p>
-    @ <pre>
-    @ %h(blob_str(record_get_content(p2)))
-    @ </pre>
-  }else{
-    vid1 = uuid_to_rid(zV1, 0);
-    p1 = record_from_rid(vid1);
-    blob_zero(&out);
-    unified_diff(record_get_content(p1), record_get_content(p2), 4, &out);
-    @ <p>Differences between
-    hyperlink_to_uuid(zV1);
-    @ and
-    hyperlink_to_uuid(zV2);
-    @ </p>
-    @ <pre>
-    @ %h(blob_str(&out))
-    @ </pre>
-    record_destroy(p1);
-    blob_reset(&out);
+  db_finalize(&q);
+  if( cnt==0 ){
+    @ Empty file
+  }else if( linkToView ){
+    @ <a href="%s(g.zBaseURL)/fview/%d(rid)">[view]</a>
   }
-  record_destroy(p2);
+}
+
+/*
+** WEBPAGE: fdiff
+**
+** Two arguments, v1 and v2, are integers.  Show the difference between
+** the two records.
+*/
+void diff_page(void){
+  int v1 = atoi(PD("v1","0"));
+  int v2 = atoi(PD("v2","0"));
+  Blob c1, c2, diff;
+
+  login_check_credentials();
+  if( !g.okHistory ){ login_needed(); return; }
+  style_header("Diff");
+  @ <h2>Differences From:</h2>
+  @ <blockquote>
+  object_description(v1, 1);
+  @ </blockquote>
+  @ <h2>To:</h2>
+  @ <blockquote>
+  object_description(v2, 1);
+  @ </blockquote>
+  @ <hr>
+  @ <blockquote><pre>
+  content_get(v1, &c1);
+  content_get(v2, &c2);
+  blob_zero(&diff);
+  unified_diff(&c1, &c2, 4, &diff);
+  blob_reset(&c1);
+  blob_reset(&c2);
+  @ %h(blob_str(&diff))
+  @ </pre></blockquote>
+  blob_reset(&diff);
   style_footer();
 }
-#endif
+
+/*
+** WEBPAGE: fview
+**
+** Show the complete content of a file identified by g.zExtra
+*/
+void fview_page(void){
+  int rid;
+  Blob content;
+
+  rid = name_to_rid(g.zExtra);
+  login_check_credentials();
+  if( !g.okHistory ){ login_needed(); return; }
+  style_header("File Content");
+  @ <h2>Content Of:</h2>
+  @ <blockquote>
+  object_description(rid, 0);
+  @ </blockquote>
+  @ <hr>
+  @ <blockquote><pre>
+  content_get(rid, &content);
+  @ %h(blob_str(&content))
+  @ </pre></blockquote>
+  blob_reset(&content);
+  style_footer();
+}