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 ){