Fossil SCM
Improvements to artifact descriptions merged into trunk.
Commit
49402fc72296cc555f0467a42808b327a83f0ce5
Parent
b120bc8b262ac00…
1 file changed
+40
-27
+40
-27
| --- src/info.c | ||
| +++ src/info.c | ||
| @@ -776,53 +776,74 @@ | ||
| 776 | 776 | Stmt q; |
| 777 | 777 | int cnt = 0; |
| 778 | 778 | int nWiki = 0; |
| 779 | 779 | char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 780 | 780 | |
| 781 | + char *prevName = 0; | |
| 782 | + | |
| 781 | 783 | db_prepare(&q, |
| 782 | 784 | "SELECT filename.name, datetime(event.mtime)," |
| 783 | 785 | " coalesce(event.ecomment,event.comment)," |
| 784 | 786 | " coalesce(event.euser,event.user)," |
| 785 | - " b.uuid" | |
| 787 | + " b.uuid," | |
| 788 | + " coalesce((SELECT value FROM tagxref" | |
| 789 | + " WHERE tagid=%d AND tagtype>0 AND rid=mlink.mid),'trunk')" | |
| 786 | 790 | " FROM mlink, filename, event, blob a, blob b" |
| 787 | 791 | " WHERE filename.fnid=mlink.fnid" |
| 788 | 792 | " AND event.objid=mlink.mid" |
| 789 | 793 | " AND a.rid=mlink.fid" |
| 790 | 794 | " AND b.rid=mlink.mid" |
| 791 | - " AND mlink.fid=%d", | |
| 792 | - rid | |
| 795 | + " AND mlink.fid=%d" | |
| 796 | + " ORDER BY filename.name, event.mtime", | |
| 797 | + TAG_BRANCH, rid | |
| 793 | 798 | ); |
| 799 | + @ <ul> | |
| 794 | 800 | while( db_step(&q)==SQLITE_ROW ){ |
| 795 | 801 | const char *zName = db_column_text(&q, 0); |
| 796 | 802 | const char *zDate = db_column_text(&q, 1); |
| 797 | 803 | const char *zCom = db_column_text(&q, 2); |
| 798 | 804 | const char *zUser = db_column_text(&q, 3); |
| 799 | 805 | const char *zVers = db_column_text(&q, 4); |
| 800 | - if( cnt>0 ){ | |
| 801 | - @ Also file | |
| 802 | - }else{ | |
| 803 | - @ File | |
| 804 | - } | |
| 805 | - if( g.okHistory ){ | |
| 806 | - @ <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a> | |
| 807 | - }else{ | |
| 808 | - @ %h(zName) | |
| 809 | - } | |
| 810 | - @ part of check-in | |
| 806 | + const char *zBr = db_column_text(&q, 5); | |
| 807 | + if( !prevName || fossil_strcmp(zName, prevName) ) { | |
| 808 | + if( prevName ) { | |
| 809 | + @ </ul> | |
| 810 | + } | |
| 811 | + @ <li>File | |
| 812 | + if( g.okHistory ){ | |
| 813 | + @ <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a> | |
| 814 | + }else{ | |
| 815 | + @ %h(zName) | |
| 816 | + } | |
| 817 | + @ <ul> | |
| 818 | + prevName = fossil_strdup(zName); | |
| 819 | + } | |
| 820 | + @ <li> | |
| 821 | + hyperlink_to_date(zDate,""); | |
| 822 | + @ - part of checkin | |
| 811 | 823 | hyperlink_to_uuid(zVers); |
| 812 | - @ - %w(zCom) by | |
| 813 | - hyperlink_to_user(zUser,zDate," on"); | |
| 814 | - hyperlink_to_date(zDate,"."); | |
| 824 | + if( zBr && zBr[0] ){ | |
| 825 | + if( g.okHistory ){ | |
| 826 | + @ on branch <a href="%s(g.zTop)/timeline?r=%T(zBr)">%h(zBr)</a> | |
| 827 | + }else{ | |
| 828 | + @ on branch %h(zBr) | |
| 829 | + } | |
| 830 | + } | |
| 831 | + @ - %w(zCom) (user: | |
| 832 | + hyperlink_to_user(zUser,zDate,""); | |
| 833 | + @ ) | |
| 815 | 834 | if( g.okHistory ){ |
| 816 | 835 | @ <a href="%s(g.zTop)/annotate?checkin=%S(zVers)&filename=%T(zName)"> |
| 817 | 836 | @ [annotate]</a> |
| 818 | 837 | } |
| 819 | 838 | cnt++; |
| 820 | 839 | if( pDownloadName && blob_size(pDownloadName)==0 ){ |
| 821 | 840 | blob_append(pDownloadName, zName, -1); |
| 822 | 841 | } |
| 823 | 842 | } |
| 843 | + @ </ul></ul> | |
| 844 | + free(prevName); | |
| 824 | 845 | db_finalize(&q); |
| 825 | 846 | db_prepare(&q, |
| 826 | 847 | "SELECT substr(tagname, 6, 10000), datetime(event.mtime)," |
| 827 | 848 | " coalesce(event.euser, event.user)" |
| 828 | 849 | " FROM tagxref, tag, event" |
| @@ -988,17 +1009,13 @@ | ||
| 988 | 1009 | style_header("Diff"); |
| 989 | 1010 | style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch", |
| 990 | 1011 | g.zTop, P("v1"), P("v2")); |
| 991 | 1012 | @ <h2>Differences From |
| 992 | 1013 | @ Artifact <a href="%s(g.zTop)/artifact/%S(zV1)">[%S(zV1)]</a>:</h2> |
| 993 | - @ <blockquote><p> | |
| 994 | - object_description(v1, 1, 0); | |
| 995 | - @ </p></blockquote> | |
| 1014 | + object_description(v1, 0, 0); | |
| 996 | 1015 | @ <h2>To Artifact <a href="%s(g.zTop)/artifact/%S(zV2)">[%S(zV2)]</a>:</h2> |
| 997 | - @ <blockquote><p> | |
| 998 | - object_description(v2, 1, 0); | |
| 999 | - @ </p></blockquote> | |
| 1016 | + object_description(v2, 0, 0); | |
| 1000 | 1017 | @ <hr /> |
| 1001 | 1018 | @ <blockquote><pre> |
| 1002 | 1019 | @ %h(blob_str(&diff)) |
| 1003 | 1020 | @ </pre></blockquote> |
| 1004 | 1021 | blob_reset(&diff); |
| @@ -1107,16 +1124,14 @@ | ||
| 1107 | 1124 | } |
| 1108 | 1125 | } |
| 1109 | 1126 | style_header("Hex Artifact Content"); |
| 1110 | 1127 | zUuid = db_text("?","SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1111 | 1128 | @ <h2>Artifact %s(zUuid):</h2> |
| 1112 | - @ <blockquote><p> | |
| 1113 | 1129 | blob_zero(&downloadName); |
| 1114 | 1130 | object_description(rid, 0, &downloadName); |
| 1115 | 1131 | style_submenu_element("Download", "Download", |
| 1116 | 1132 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1117 | - @ </p></blockquote> | |
| 1118 | 1133 | @ <hr /> |
| 1119 | 1134 | content_get(rid, &content); |
| 1120 | 1135 | @ <blockquote><pre> |
| 1121 | 1136 | hexdump(&content); |
| 1122 | 1137 | @ </pre></blockquote> |
| @@ -1256,11 +1271,10 @@ | ||
| 1256 | 1271 | } |
| 1257 | 1272 | } |
| 1258 | 1273 | style_header("Artifact Content"); |
| 1259 | 1274 | zUuid = db_text("?", "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1260 | 1275 | @ <h2>Artifact %s(zUuid)</h2> |
| 1261 | - @ <blockquote><p> | |
| 1262 | 1276 | blob_zero(&downloadName); |
| 1263 | 1277 | object_description(rid, 0, &downloadName); |
| 1264 | 1278 | style_submenu_element("Download", "Download", |
| 1265 | 1279 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1266 | 1280 | zMime = mimetype_from_name(blob_str(&downloadName)); |
| @@ -1283,11 +1297,10 @@ | ||
| 1283 | 1297 | style_submenu_element("Text", "Text", |
| 1284 | 1298 | "%s/artifact/%s?txt=1", g.zTop, zUuid); |
| 1285 | 1299 | } |
| 1286 | 1300 | } |
| 1287 | 1301 | } |
| 1288 | - @ </p></blockquote> | |
| 1289 | 1302 | @ <hr /> |
| 1290 | 1303 | content_get(rid, &content); |
| 1291 | 1304 | if( renderAsWiki ){ |
| 1292 | 1305 | wiki_convert(&content, 0, 0); |
| 1293 | 1306 | }else if( renderAsHtml ){ |
| 1294 | 1307 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -776,53 +776,74 @@ | |
| 776 | Stmt q; |
| 777 | int cnt = 0; |
| 778 | int nWiki = 0; |
| 779 | char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 780 | |
| 781 | db_prepare(&q, |
| 782 | "SELECT filename.name, datetime(event.mtime)," |
| 783 | " coalesce(event.ecomment,event.comment)," |
| 784 | " coalesce(event.euser,event.user)," |
| 785 | " b.uuid" |
| 786 | " FROM mlink, filename, event, blob a, blob b" |
| 787 | " WHERE filename.fnid=mlink.fnid" |
| 788 | " AND event.objid=mlink.mid" |
| 789 | " AND a.rid=mlink.fid" |
| 790 | " AND b.rid=mlink.mid" |
| 791 | " AND mlink.fid=%d", |
| 792 | rid |
| 793 | ); |
| 794 | while( db_step(&q)==SQLITE_ROW ){ |
| 795 | const char *zName = db_column_text(&q, 0); |
| 796 | const char *zDate = db_column_text(&q, 1); |
| 797 | const char *zCom = db_column_text(&q, 2); |
| 798 | const char *zUser = db_column_text(&q, 3); |
| 799 | const char *zVers = db_column_text(&q, 4); |
| 800 | if( cnt>0 ){ |
| 801 | @ Also file |
| 802 | }else{ |
| 803 | @ File |
| 804 | } |
| 805 | if( g.okHistory ){ |
| 806 | @ <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a> |
| 807 | }else{ |
| 808 | @ %h(zName) |
| 809 | } |
| 810 | @ part of check-in |
| 811 | hyperlink_to_uuid(zVers); |
| 812 | @ - %w(zCom) by |
| 813 | hyperlink_to_user(zUser,zDate," on"); |
| 814 | hyperlink_to_date(zDate,"."); |
| 815 | if( g.okHistory ){ |
| 816 | @ <a href="%s(g.zTop)/annotate?checkin=%S(zVers)&filename=%T(zName)"> |
| 817 | @ [annotate]</a> |
| 818 | } |
| 819 | cnt++; |
| 820 | if( pDownloadName && blob_size(pDownloadName)==0 ){ |
| 821 | blob_append(pDownloadName, zName, -1); |
| 822 | } |
| 823 | } |
| 824 | db_finalize(&q); |
| 825 | db_prepare(&q, |
| 826 | "SELECT substr(tagname, 6, 10000), datetime(event.mtime)," |
| 827 | " coalesce(event.euser, event.user)" |
| 828 | " FROM tagxref, tag, event" |
| @@ -988,17 +1009,13 @@ | |
| 988 | style_header("Diff"); |
| 989 | style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch", |
| 990 | g.zTop, P("v1"), P("v2")); |
| 991 | @ <h2>Differences From |
| 992 | @ Artifact <a href="%s(g.zTop)/artifact/%S(zV1)">[%S(zV1)]</a>:</h2> |
| 993 | @ <blockquote><p> |
| 994 | object_description(v1, 1, 0); |
| 995 | @ </p></blockquote> |
| 996 | @ <h2>To Artifact <a href="%s(g.zTop)/artifact/%S(zV2)">[%S(zV2)]</a>:</h2> |
| 997 | @ <blockquote><p> |
| 998 | object_description(v2, 1, 0); |
| 999 | @ </p></blockquote> |
| 1000 | @ <hr /> |
| 1001 | @ <blockquote><pre> |
| 1002 | @ %h(blob_str(&diff)) |
| 1003 | @ </pre></blockquote> |
| 1004 | blob_reset(&diff); |
| @@ -1107,16 +1124,14 @@ | |
| 1107 | } |
| 1108 | } |
| 1109 | style_header("Hex Artifact Content"); |
| 1110 | zUuid = db_text("?","SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1111 | @ <h2>Artifact %s(zUuid):</h2> |
| 1112 | @ <blockquote><p> |
| 1113 | blob_zero(&downloadName); |
| 1114 | object_description(rid, 0, &downloadName); |
| 1115 | style_submenu_element("Download", "Download", |
| 1116 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1117 | @ </p></blockquote> |
| 1118 | @ <hr /> |
| 1119 | content_get(rid, &content); |
| 1120 | @ <blockquote><pre> |
| 1121 | hexdump(&content); |
| 1122 | @ </pre></blockquote> |
| @@ -1256,11 +1271,10 @@ | |
| 1256 | } |
| 1257 | } |
| 1258 | style_header("Artifact Content"); |
| 1259 | zUuid = db_text("?", "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1260 | @ <h2>Artifact %s(zUuid)</h2> |
| 1261 | @ <blockquote><p> |
| 1262 | blob_zero(&downloadName); |
| 1263 | object_description(rid, 0, &downloadName); |
| 1264 | style_submenu_element("Download", "Download", |
| 1265 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1266 | zMime = mimetype_from_name(blob_str(&downloadName)); |
| @@ -1283,11 +1297,10 @@ | |
| 1283 | style_submenu_element("Text", "Text", |
| 1284 | "%s/artifact/%s?txt=1", g.zTop, zUuid); |
| 1285 | } |
| 1286 | } |
| 1287 | } |
| 1288 | @ </p></blockquote> |
| 1289 | @ <hr /> |
| 1290 | content_get(rid, &content); |
| 1291 | if( renderAsWiki ){ |
| 1292 | wiki_convert(&content, 0, 0); |
| 1293 | }else if( renderAsHtml ){ |
| 1294 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -776,53 +776,74 @@ | |
| 776 | Stmt q; |
| 777 | int cnt = 0; |
| 778 | int nWiki = 0; |
| 779 | char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 780 | |
| 781 | char *prevName = 0; |
| 782 | |
| 783 | db_prepare(&q, |
| 784 | "SELECT filename.name, datetime(event.mtime)," |
| 785 | " coalesce(event.ecomment,event.comment)," |
| 786 | " coalesce(event.euser,event.user)," |
| 787 | " b.uuid," |
| 788 | " coalesce((SELECT value FROM tagxref" |
| 789 | " WHERE tagid=%d AND tagtype>0 AND rid=mlink.mid),'trunk')" |
| 790 | " FROM mlink, filename, event, blob a, blob b" |
| 791 | " WHERE filename.fnid=mlink.fnid" |
| 792 | " AND event.objid=mlink.mid" |
| 793 | " AND a.rid=mlink.fid" |
| 794 | " AND b.rid=mlink.mid" |
| 795 | " AND mlink.fid=%d" |
| 796 | " ORDER BY filename.name, event.mtime", |
| 797 | TAG_BRANCH, rid |
| 798 | ); |
| 799 | @ <ul> |
| 800 | while( db_step(&q)==SQLITE_ROW ){ |
| 801 | const char *zName = db_column_text(&q, 0); |
| 802 | const char *zDate = db_column_text(&q, 1); |
| 803 | const char *zCom = db_column_text(&q, 2); |
| 804 | const char *zUser = db_column_text(&q, 3); |
| 805 | const char *zVers = db_column_text(&q, 4); |
| 806 | const char *zBr = db_column_text(&q, 5); |
| 807 | if( !prevName || fossil_strcmp(zName, prevName) ) { |
| 808 | if( prevName ) { |
| 809 | @ </ul> |
| 810 | } |
| 811 | @ <li>File |
| 812 | if( g.okHistory ){ |
| 813 | @ <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a> |
| 814 | }else{ |
| 815 | @ %h(zName) |
| 816 | } |
| 817 | @ <ul> |
| 818 | prevName = fossil_strdup(zName); |
| 819 | } |
| 820 | @ <li> |
| 821 | hyperlink_to_date(zDate,""); |
| 822 | @ - part of checkin |
| 823 | hyperlink_to_uuid(zVers); |
| 824 | if( zBr && zBr[0] ){ |
| 825 | if( g.okHistory ){ |
| 826 | @ on branch <a href="%s(g.zTop)/timeline?r=%T(zBr)">%h(zBr)</a> |
| 827 | }else{ |
| 828 | @ on branch %h(zBr) |
| 829 | } |
| 830 | } |
| 831 | @ - %w(zCom) (user: |
| 832 | hyperlink_to_user(zUser,zDate,""); |
| 833 | @ ) |
| 834 | if( g.okHistory ){ |
| 835 | @ <a href="%s(g.zTop)/annotate?checkin=%S(zVers)&filename=%T(zName)"> |
| 836 | @ [annotate]</a> |
| 837 | } |
| 838 | cnt++; |
| 839 | if( pDownloadName && blob_size(pDownloadName)==0 ){ |
| 840 | blob_append(pDownloadName, zName, -1); |
| 841 | } |
| 842 | } |
| 843 | @ </ul></ul> |
| 844 | free(prevName); |
| 845 | db_finalize(&q); |
| 846 | db_prepare(&q, |
| 847 | "SELECT substr(tagname, 6, 10000), datetime(event.mtime)," |
| 848 | " coalesce(event.euser, event.user)" |
| 849 | " FROM tagxref, tag, event" |
| @@ -988,17 +1009,13 @@ | |
| 1009 | style_header("Diff"); |
| 1010 | style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch", |
| 1011 | g.zTop, P("v1"), P("v2")); |
| 1012 | @ <h2>Differences From |
| 1013 | @ Artifact <a href="%s(g.zTop)/artifact/%S(zV1)">[%S(zV1)]</a>:</h2> |
| 1014 | object_description(v1, 0, 0); |
| 1015 | @ <h2>To Artifact <a href="%s(g.zTop)/artifact/%S(zV2)">[%S(zV2)]</a>:</h2> |
| 1016 | object_description(v2, 0, 0); |
| 1017 | @ <hr /> |
| 1018 | @ <blockquote><pre> |
| 1019 | @ %h(blob_str(&diff)) |
| 1020 | @ </pre></blockquote> |
| 1021 | blob_reset(&diff); |
| @@ -1107,16 +1124,14 @@ | |
| 1124 | } |
| 1125 | } |
| 1126 | style_header("Hex Artifact Content"); |
| 1127 | zUuid = db_text("?","SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1128 | @ <h2>Artifact %s(zUuid):</h2> |
| 1129 | blob_zero(&downloadName); |
| 1130 | object_description(rid, 0, &downloadName); |
| 1131 | style_submenu_element("Download", "Download", |
| 1132 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1133 | @ <hr /> |
| 1134 | content_get(rid, &content); |
| 1135 | @ <blockquote><pre> |
| 1136 | hexdump(&content); |
| 1137 | @ </pre></blockquote> |
| @@ -1256,11 +1271,10 @@ | |
| 1271 | } |
| 1272 | } |
| 1273 | style_header("Artifact Content"); |
| 1274 | zUuid = db_text("?", "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1275 | @ <h2>Artifact %s(zUuid)</h2> |
| 1276 | blob_zero(&downloadName); |
| 1277 | object_description(rid, 0, &downloadName); |
| 1278 | style_submenu_element("Download", "Download", |
| 1279 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1280 | zMime = mimetype_from_name(blob_str(&downloadName)); |
| @@ -1283,11 +1297,10 @@ | |
| 1297 | style_submenu_element("Text", "Text", |
| 1298 | "%s/artifact/%s?txt=1", g.zTop, zUuid); |
| 1299 | } |
| 1300 | } |
| 1301 | } |
| 1302 | @ <hr /> |
| 1303 | content_get(rid, &content); |
| 1304 | if( renderAsWiki ){ |
| 1305 | wiki_convert(&content, 0, 0); |
| 1306 | }else if( renderAsHtml ){ |
| 1307 |