Index: src/info.c
==================================================================
--- src/info.c
+++ src/info.c
@@ -776,53 +776,74 @@
   Stmt q;
   int cnt = 0;
   int nWiki = 0;
   char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid);
 
+  char *prevName = 0;
+
   db_prepare(&q,
     "SELECT filename.name, datetime(event.mtime),"
     "       coalesce(event.ecomment,event.comment),"
     "       coalesce(event.euser,event.user),"
-    "       b.uuid"
+    "       b.uuid,"
+    "       coalesce((SELECT value FROM tagxref"
+                    "  WHERE tagid=%d AND tagtype>0 AND rid=mlink.mid),'trunk')"
     "  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
+    "   AND mlink.fid=%d"
+    "   ORDER BY filename.name, event.mtime",
+    TAG_BRANCH, rid
   );
+  @ <ul>
   while( db_step(&q)==SQLITE_ROW ){
     const char *zName = db_column_text(&q, 0);
     const char *zDate = db_column_text(&q, 1);
     const char *zCom = db_column_text(&q, 2);
     const char *zUser = db_column_text(&q, 3);
     const char *zVers = db_column_text(&q, 4);
-    if( cnt>0 ){
-      @ Also file
-    }else{
-      @ File
+    const char *zBr = db_column_text(&q, 5);
+    if( !prevName || fossil_strcmp(zName, prevName) ) {
+      if( prevName ) {
+        @ </ul>
+      }
+      @ <li>File
+      if( g.okHistory ){
+        @ <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a>
+      }else{
+        @ %h(zName)
+      }
+      @ <ul>
+      prevName = fossil_strdup(zName);
     }
-    if( g.okHistory ){
-      @ <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a>
-    }else{
-      @ %h(zName)
-    }
-    @ part of check-in
+    @ <li>
+    hyperlink_to_date(zDate,"");
+    @ - part of checkin
     hyperlink_to_uuid(zVers);
-    @ - %w(zCom) by 
-    hyperlink_to_user(zUser,zDate," on");
-    hyperlink_to_date(zDate,".");
+    if( zBr && zBr[0] ){
+      if( g.okHistory ){
+        @ on branch <a href="%s(g.zTop)/timeline?r=%T(zBr)">%h(zBr)</a>
+      }else{
+        @ on branch %h(zBr)
+      }
+    }
+    @ - %w(zCom) (user:
+    hyperlink_to_user(zUser,zDate,"");
+    @ )
     if( g.okHistory ){
       @ <a href="%s(g.zTop)/annotate?checkin=%S(zVers)&filename=%T(zName)">
       @ [annotate]</a>
     }
     cnt++;
     if( pDownloadName && blob_size(pDownloadName)==0 ){
       blob_append(pDownloadName, zName, -1);
     }
   }
+  @ </ul></ul>
+  free(prevName);
   db_finalize(&q);
   db_prepare(&q, 
     "SELECT substr(tagname, 6, 10000), datetime(event.mtime),"
     "       coalesce(event.euser, event.user)"
     "  FROM tagxref, tag, event"
@@ -988,17 +1009,13 @@
     style_header("Diff");
     style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch",
                           g.zTop, P("v1"), P("v2"));
     @ <h2>Differences From
     @ Artifact <a href="%s(g.zTop)/artifact/%S(zV1)">[%S(zV1)]</a>:</h2>
-    @ <blockquote><p>
-    object_description(v1, 1, 0);
-    @ </p></blockquote>
+    object_description(v1, 0, 0);
     @ <h2>To Artifact <a href="%s(g.zTop)/artifact/%S(zV2)">[%S(zV2)]</a>:</h2>
-    @ <blockquote><p>
-    object_description(v2, 1, 0);
-    @ </p></blockquote>
+    object_description(v2, 0, 0);
     @ <hr />
     @ <blockquote><pre>
     @ %h(blob_str(&diff))
     @ </pre></blockquote>
     blob_reset(&diff);
@@ -1107,16 +1124,14 @@
     }
   }
   style_header("Hex Artifact Content");
   zUuid = db_text("?","SELECT uuid FROM blob WHERE rid=%d", rid);
   @ <h2>Artifact %s(zUuid):</h2>
-  @ <blockquote><p>
   blob_zero(&downloadName);
   object_description(rid, 0, &downloadName);
   style_submenu_element("Download", "Download", 
         "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid);
-  @ </p></blockquote>
   @ <hr />
   content_get(rid, &content);
   @ <blockquote><pre>
   hexdump(&content);
   @ </pre></blockquote>
@@ -1256,11 +1271,10 @@
     }
   }
   style_header("Artifact Content");
   zUuid = db_text("?", "SELECT uuid FROM blob WHERE rid=%d", rid);
   @ <h2>Artifact %s(zUuid)</h2>
-  @ <blockquote><p>
   blob_zero(&downloadName);
   object_description(rid, 0, &downloadName);
   style_submenu_element("Download", "Download", 
           "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid);
   zMime = mimetype_from_name(blob_str(&downloadName));
@@ -1283,11 +1297,10 @@
         style_submenu_element("Text", "Text",
                               "%s/artifact/%s?txt=1", g.zTop, zUuid);
       }
     }
   }
-  @ </p></blockquote>
   @ <hr />
   content_get(rid, &content);
   if( renderAsWiki ){
     wiki_convert(&content, 0, 0);
   }else if( renderAsHtml ){