Fossil SCM
Merge improvements to artifact descriptions into symlinks branch. Also modify displaying of permissions: now web UI shows "File", "Executable file", or "Symbolic link" in file artifact description.
Commit
3115774ffe6e82d30f452eade3c6465c2e14b4ec
Parent
40ed431ca59e0a1…
2 files changed
+46
-32
+46
-32
+46
-32
| --- src/info.c | ||
| +++ src/info.c | ||
| @@ -777,59 +777,81 @@ | ||
| 777 | 777 | Stmt q; |
| 778 | 778 | int cnt = 0; |
| 779 | 779 | int nWiki = 0; |
| 780 | 780 | char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 781 | 781 | |
| 782 | + char *prevName = 0; | |
| 783 | + | |
| 782 | 784 | db_prepare(&q, |
| 783 | 785 | "SELECT filename.name, datetime(event.mtime)," |
| 784 | 786 | " coalesce(event.ecomment,event.comment)," |
| 785 | 787 | " coalesce(event.euser,event.user)," |
| 786 | - " b.uuid, mlink.mperm" | |
| 788 | + " b.uuid, mlink.mperm," | |
| 789 | + " coalesce((SELECT value FROM tagxref" | |
| 790 | + " WHERE tagid=%d AND tagtype>0 AND rid=mlink.mid),'trunk')" | |
| 787 | 791 | " FROM mlink, filename, event, blob a, blob b" |
| 788 | 792 | " WHERE filename.fnid=mlink.fnid" |
| 789 | 793 | " AND event.objid=mlink.mid" |
| 790 | 794 | " AND a.rid=mlink.fid" |
| 791 | 795 | " AND b.rid=mlink.mid" |
| 792 | - " AND mlink.fid=%d", | |
| 793 | - rid | |
| 796 | + " AND mlink.fid=%d" | |
| 797 | + " ORDER BY filename.name, event.mtime", | |
| 798 | + TAG_BRANCH, rid | |
| 794 | 799 | ); |
| 800 | + @ <ul> | |
| 795 | 801 | while( db_step(&q)==SQLITE_ROW ){ |
| 796 | 802 | const char *zName = db_column_text(&q, 0); |
| 797 | 803 | const char *zDate = db_column_text(&q, 1); |
| 798 | 804 | const char *zCom = db_column_text(&q, 2); |
| 799 | 805 | const char *zUser = db_column_text(&q, 3); |
| 800 | 806 | const char *zVers = db_column_text(&q, 4); |
| 801 | 807 | int mPerm = db_column_int(&q, 5); |
| 802 | - if( cnt>0 ){ | |
| 803 | - @ Also file | |
| 804 | - }else{ | |
| 805 | - @ File | |
| 806 | - } | |
| 807 | - if( g.okHistory ){ | |
| 808 | - @ <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a> | |
| 809 | - }else{ | |
| 810 | - @ %h(zName) | |
| 811 | - } | |
| 812 | - if( mPerm==PERM_LNK ){ | |
| 813 | - @ (symbolic link) | |
| 814 | - }else if( mPerm==PERM_EXE ){ | |
| 815 | - @ (executable) | |
| 816 | - } | |
| 817 | - @ part of check-in | |
| 808 | + const char *zBr = db_column_text(&q, 6); | |
| 809 | + if( !prevName || fossil_strcmp(zName, prevName) ) { | |
| 810 | + if( prevName ) { | |
| 811 | + @ </ul> | |
| 812 | + } | |
| 813 | + if( mPerm==PERM_LNK ){ | |
| 814 | + @ <li>Symbolic link | |
| 815 | + }else if( mPerm==PERM_EXE ){ | |
| 816 | + @ <li>Executable file | |
| 817 | + }else{ | |
| 818 | + @ <li>File | |
| 819 | + } | |
| 820 | + if( g.okHistory ){ | |
| 821 | + @ <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a> | |
| 822 | + }else{ | |
| 823 | + @ %h(zName) | |
| 824 | + } | |
| 825 | + @ <ul> | |
| 826 | + prevName = fossil_strdup(zName); | |
| 827 | + } | |
| 828 | + @ <li> | |
| 829 | + hyperlink_to_date(zDate,""); | |
| 830 | + @ - part of checkin | |
| 818 | 831 | hyperlink_to_uuid(zVers); |
| 819 | - @ - %w(zCom) by | |
| 820 | - hyperlink_to_user(zUser,zDate," on"); | |
| 821 | - hyperlink_to_date(zDate,"."); | |
| 832 | + if( zBr && zBr[0] ){ | |
| 833 | + if( g.okHistory ){ | |
| 834 | + @ on branch <a href="%s(g.zTop)/timeline?r=%T(zBr)">%h(zBr)</a> | |
| 835 | + }else{ | |
| 836 | + @ on branch %h(zBr) | |
| 837 | + } | |
| 838 | + } | |
| 839 | + @ - %w(zCom) (user: | |
| 840 | + hyperlink_to_user(zUser,zDate,""); | |
| 841 | + @ ) | |
| 822 | 842 | if( g.okHistory ){ |
| 823 | 843 | @ <a href="%s(g.zTop)/annotate?checkin=%S(zVers)&filename=%T(zName)"> |
| 824 | 844 | @ [annotate]</a> |
| 825 | 845 | } |
| 826 | 846 | cnt++; |
| 827 | 847 | if( pDownloadName && blob_size(pDownloadName)==0 ){ |
| 828 | 848 | blob_append(pDownloadName, zName, -1); |
| 829 | 849 | } |
| 830 | 850 | } |
| 851 | + @ </ul></ul> | |
| 852 | + free(prevName); | |
| 831 | 853 | db_finalize(&q); |
| 832 | 854 | db_prepare(&q, |
| 833 | 855 | "SELECT substr(tagname, 6, 10000), datetime(event.mtime)," |
| 834 | 856 | " coalesce(event.euser, event.user)" |
| 835 | 857 | " FROM tagxref, tag, event" |
| @@ -995,17 +1017,13 @@ | ||
| 995 | 1017 | style_header("Diff"); |
| 996 | 1018 | style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch", |
| 997 | 1019 | g.zTop, P("v1"), P("v2")); |
| 998 | 1020 | @ <h2>Differences From |
| 999 | 1021 | @ Artifact <a href="%s(g.zTop)/artifact/%S(zV1)">[%S(zV1)]</a>:</h2> |
| 1000 | - @ <blockquote><p> | |
| 1001 | - object_description(v1, 1, 0); | |
| 1002 | - @ </p></blockquote> | |
| 1022 | + object_description(v1, 0, 0); | |
| 1003 | 1023 | @ <h2>To Artifact <a href="%s(g.zTop)/artifact/%S(zV2)">[%S(zV2)]</a>:</h2> |
| 1004 | - @ <blockquote><p> | |
| 1005 | - object_description(v2, 1, 0); | |
| 1006 | - @ </p></blockquote> | |
| 1024 | + object_description(v2, 0, 0); | |
| 1007 | 1025 | @ <hr /> |
| 1008 | 1026 | @ <blockquote><pre> |
| 1009 | 1027 | @ %h(blob_str(&diff)) |
| 1010 | 1028 | @ </pre></blockquote> |
| 1011 | 1029 | blob_reset(&diff); |
| @@ -1114,16 +1132,14 @@ | ||
| 1114 | 1132 | } |
| 1115 | 1133 | } |
| 1116 | 1134 | style_header("Hex Artifact Content"); |
| 1117 | 1135 | zUuid = db_text("?","SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1118 | 1136 | @ <h2>Artifact %s(zUuid):</h2> |
| 1119 | - @ <blockquote><p> | |
| 1120 | 1137 | blob_zero(&downloadName); |
| 1121 | 1138 | object_description(rid, 0, &downloadName); |
| 1122 | 1139 | style_submenu_element("Download", "Download", |
| 1123 | 1140 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1124 | - @ </p></blockquote> | |
| 1125 | 1141 | @ <hr /> |
| 1126 | 1142 | content_get(rid, &content); |
| 1127 | 1143 | @ <blockquote><pre> |
| 1128 | 1144 | hexdump(&content); |
| 1129 | 1145 | @ </pre></blockquote> |
| @@ -1263,11 +1279,10 @@ | ||
| 1263 | 1279 | } |
| 1264 | 1280 | } |
| 1265 | 1281 | style_header("Artifact Content"); |
| 1266 | 1282 | zUuid = db_text("?", "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1267 | 1283 | @ <h2>Artifact %s(zUuid)</h2> |
| 1268 | - @ <blockquote><p> | |
| 1269 | 1284 | blob_zero(&downloadName); |
| 1270 | 1285 | object_description(rid, 0, &downloadName); |
| 1271 | 1286 | style_submenu_element("Download", "Download", |
| 1272 | 1287 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1273 | 1288 | zMime = mimetype_from_name(blob_str(&downloadName)); |
| @@ -1290,11 +1305,10 @@ | ||
| 1290 | 1305 | style_submenu_element("Text", "Text", |
| 1291 | 1306 | "%s/artifact/%s?txt=1", g.zTop, zUuid); |
| 1292 | 1307 | } |
| 1293 | 1308 | } |
| 1294 | 1309 | } |
| 1295 | - @ </p></blockquote> | |
| 1296 | 1310 | @ <hr /> |
| 1297 | 1311 | content_get(rid, &content); |
| 1298 | 1312 | if( renderAsWiki ){ |
| 1299 | 1313 | wiki_convert(&content, 0, 0); |
| 1300 | 1314 | }else if( renderAsHtml ){ |
| 1301 | 1315 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -777,59 +777,81 @@ | |
| 777 | Stmt q; |
| 778 | int cnt = 0; |
| 779 | int nWiki = 0; |
| 780 | char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 781 | |
| 782 | db_prepare(&q, |
| 783 | "SELECT filename.name, datetime(event.mtime)," |
| 784 | " coalesce(event.ecomment,event.comment)," |
| 785 | " coalesce(event.euser,event.user)," |
| 786 | " b.uuid, mlink.mperm" |
| 787 | " FROM mlink, filename, event, blob a, blob b" |
| 788 | " WHERE filename.fnid=mlink.fnid" |
| 789 | " AND event.objid=mlink.mid" |
| 790 | " AND a.rid=mlink.fid" |
| 791 | " AND b.rid=mlink.mid" |
| 792 | " AND mlink.fid=%d", |
| 793 | rid |
| 794 | ); |
| 795 | while( db_step(&q)==SQLITE_ROW ){ |
| 796 | const char *zName = db_column_text(&q, 0); |
| 797 | const char *zDate = db_column_text(&q, 1); |
| 798 | const char *zCom = db_column_text(&q, 2); |
| 799 | const char *zUser = db_column_text(&q, 3); |
| 800 | const char *zVers = db_column_text(&q, 4); |
| 801 | int mPerm = db_column_int(&q, 5); |
| 802 | if( cnt>0 ){ |
| 803 | @ Also file |
| 804 | }else{ |
| 805 | @ File |
| 806 | } |
| 807 | if( g.okHistory ){ |
| 808 | @ <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a> |
| 809 | }else{ |
| 810 | @ %h(zName) |
| 811 | } |
| 812 | if( mPerm==PERM_LNK ){ |
| 813 | @ (symbolic link) |
| 814 | }else if( mPerm==PERM_EXE ){ |
| 815 | @ (executable) |
| 816 | } |
| 817 | @ part of check-in |
| 818 | hyperlink_to_uuid(zVers); |
| 819 | @ - %w(zCom) by |
| 820 | hyperlink_to_user(zUser,zDate," on"); |
| 821 | hyperlink_to_date(zDate,"."); |
| 822 | if( g.okHistory ){ |
| 823 | @ <a href="%s(g.zTop)/annotate?checkin=%S(zVers)&filename=%T(zName)"> |
| 824 | @ [annotate]</a> |
| 825 | } |
| 826 | cnt++; |
| 827 | if( pDownloadName && blob_size(pDownloadName)==0 ){ |
| 828 | blob_append(pDownloadName, zName, -1); |
| 829 | } |
| 830 | } |
| 831 | db_finalize(&q); |
| 832 | db_prepare(&q, |
| 833 | "SELECT substr(tagname, 6, 10000), datetime(event.mtime)," |
| 834 | " coalesce(event.euser, event.user)" |
| 835 | " FROM tagxref, tag, event" |
| @@ -995,17 +1017,13 @@ | |
| 995 | style_header("Diff"); |
| 996 | style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch", |
| 997 | g.zTop, P("v1"), P("v2")); |
| 998 | @ <h2>Differences From |
| 999 | @ Artifact <a href="%s(g.zTop)/artifact/%S(zV1)">[%S(zV1)]</a>:</h2> |
| 1000 | @ <blockquote><p> |
| 1001 | object_description(v1, 1, 0); |
| 1002 | @ </p></blockquote> |
| 1003 | @ <h2>To Artifact <a href="%s(g.zTop)/artifact/%S(zV2)">[%S(zV2)]</a>:</h2> |
| 1004 | @ <blockquote><p> |
| 1005 | object_description(v2, 1, 0); |
| 1006 | @ </p></blockquote> |
| 1007 | @ <hr /> |
| 1008 | @ <blockquote><pre> |
| 1009 | @ %h(blob_str(&diff)) |
| 1010 | @ </pre></blockquote> |
| 1011 | blob_reset(&diff); |
| @@ -1114,16 +1132,14 @@ | |
| 1114 | } |
| 1115 | } |
| 1116 | style_header("Hex Artifact Content"); |
| 1117 | zUuid = db_text("?","SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1118 | @ <h2>Artifact %s(zUuid):</h2> |
| 1119 | @ <blockquote><p> |
| 1120 | blob_zero(&downloadName); |
| 1121 | object_description(rid, 0, &downloadName); |
| 1122 | style_submenu_element("Download", "Download", |
| 1123 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1124 | @ </p></blockquote> |
| 1125 | @ <hr /> |
| 1126 | content_get(rid, &content); |
| 1127 | @ <blockquote><pre> |
| 1128 | hexdump(&content); |
| 1129 | @ </pre></blockquote> |
| @@ -1263,11 +1279,10 @@ | |
| 1263 | } |
| 1264 | } |
| 1265 | style_header("Artifact Content"); |
| 1266 | zUuid = db_text("?", "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1267 | @ <h2>Artifact %s(zUuid)</h2> |
| 1268 | @ <blockquote><p> |
| 1269 | blob_zero(&downloadName); |
| 1270 | object_description(rid, 0, &downloadName); |
| 1271 | style_submenu_element("Download", "Download", |
| 1272 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1273 | zMime = mimetype_from_name(blob_str(&downloadName)); |
| @@ -1290,11 +1305,10 @@ | |
| 1290 | style_submenu_element("Text", "Text", |
| 1291 | "%s/artifact/%s?txt=1", g.zTop, zUuid); |
| 1292 | } |
| 1293 | } |
| 1294 | } |
| 1295 | @ </p></blockquote> |
| 1296 | @ <hr /> |
| 1297 | content_get(rid, &content); |
| 1298 | if( renderAsWiki ){ |
| 1299 | wiki_convert(&content, 0, 0); |
| 1300 | }else if( renderAsHtml ){ |
| 1301 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -777,59 +777,81 @@ | |
| 777 | Stmt q; |
| 778 | int cnt = 0; |
| 779 | int nWiki = 0; |
| 780 | char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 781 | |
| 782 | char *prevName = 0; |
| 783 | |
| 784 | db_prepare(&q, |
| 785 | "SELECT filename.name, datetime(event.mtime)," |
| 786 | " coalesce(event.ecomment,event.comment)," |
| 787 | " coalesce(event.euser,event.user)," |
| 788 | " b.uuid, mlink.mperm," |
| 789 | " coalesce((SELECT value FROM tagxref" |
| 790 | " WHERE tagid=%d AND tagtype>0 AND rid=mlink.mid),'trunk')" |
| 791 | " FROM mlink, filename, event, blob a, blob b" |
| 792 | " WHERE filename.fnid=mlink.fnid" |
| 793 | " AND event.objid=mlink.mid" |
| 794 | " AND a.rid=mlink.fid" |
| 795 | " AND b.rid=mlink.mid" |
| 796 | " AND mlink.fid=%d" |
| 797 | " ORDER BY filename.name, event.mtime", |
| 798 | TAG_BRANCH, rid |
| 799 | ); |
| 800 | @ <ul> |
| 801 | while( db_step(&q)==SQLITE_ROW ){ |
| 802 | const char *zName = db_column_text(&q, 0); |
| 803 | const char *zDate = db_column_text(&q, 1); |
| 804 | const char *zCom = db_column_text(&q, 2); |
| 805 | const char *zUser = db_column_text(&q, 3); |
| 806 | const char *zVers = db_column_text(&q, 4); |
| 807 | int mPerm = db_column_int(&q, 5); |
| 808 | const char *zBr = db_column_text(&q, 6); |
| 809 | if( !prevName || fossil_strcmp(zName, prevName) ) { |
| 810 | if( prevName ) { |
| 811 | @ </ul> |
| 812 | } |
| 813 | if( mPerm==PERM_LNK ){ |
| 814 | @ <li>Symbolic link |
| 815 | }else if( mPerm==PERM_EXE ){ |
| 816 | @ <li>Executable file |
| 817 | }else{ |
| 818 | @ <li>File |
| 819 | } |
| 820 | if( g.okHistory ){ |
| 821 | @ <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a> |
| 822 | }else{ |
| 823 | @ %h(zName) |
| 824 | } |
| 825 | @ <ul> |
| 826 | prevName = fossil_strdup(zName); |
| 827 | } |
| 828 | @ <li> |
| 829 | hyperlink_to_date(zDate,""); |
| 830 | @ - part of checkin |
| 831 | hyperlink_to_uuid(zVers); |
| 832 | if( zBr && zBr[0] ){ |
| 833 | if( g.okHistory ){ |
| 834 | @ on branch <a href="%s(g.zTop)/timeline?r=%T(zBr)">%h(zBr)</a> |
| 835 | }else{ |
| 836 | @ on branch %h(zBr) |
| 837 | } |
| 838 | } |
| 839 | @ - %w(zCom) (user: |
| 840 | hyperlink_to_user(zUser,zDate,""); |
| 841 | @ ) |
| 842 | if( g.okHistory ){ |
| 843 | @ <a href="%s(g.zTop)/annotate?checkin=%S(zVers)&filename=%T(zName)"> |
| 844 | @ [annotate]</a> |
| 845 | } |
| 846 | cnt++; |
| 847 | if( pDownloadName && blob_size(pDownloadName)==0 ){ |
| 848 | blob_append(pDownloadName, zName, -1); |
| 849 | } |
| 850 | } |
| 851 | @ </ul></ul> |
| 852 | free(prevName); |
| 853 | db_finalize(&q); |
| 854 | db_prepare(&q, |
| 855 | "SELECT substr(tagname, 6, 10000), datetime(event.mtime)," |
| 856 | " coalesce(event.euser, event.user)" |
| 857 | " FROM tagxref, tag, event" |
| @@ -995,17 +1017,13 @@ | |
| 1017 | style_header("Diff"); |
| 1018 | style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch", |
| 1019 | g.zTop, P("v1"), P("v2")); |
| 1020 | @ <h2>Differences From |
| 1021 | @ Artifact <a href="%s(g.zTop)/artifact/%S(zV1)">[%S(zV1)]</a>:</h2> |
| 1022 | object_description(v1, 0, 0); |
| 1023 | @ <h2>To Artifact <a href="%s(g.zTop)/artifact/%S(zV2)">[%S(zV2)]</a>:</h2> |
| 1024 | object_description(v2, 0, 0); |
| 1025 | @ <hr /> |
| 1026 | @ <blockquote><pre> |
| 1027 | @ %h(blob_str(&diff)) |
| 1028 | @ </pre></blockquote> |
| 1029 | blob_reset(&diff); |
| @@ -1114,16 +1132,14 @@ | |
| 1132 | } |
| 1133 | } |
| 1134 | style_header("Hex Artifact Content"); |
| 1135 | zUuid = db_text("?","SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1136 | @ <h2>Artifact %s(zUuid):</h2> |
| 1137 | blob_zero(&downloadName); |
| 1138 | object_description(rid, 0, &downloadName); |
| 1139 | style_submenu_element("Download", "Download", |
| 1140 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1141 | @ <hr /> |
| 1142 | content_get(rid, &content); |
| 1143 | @ <blockquote><pre> |
| 1144 | hexdump(&content); |
| 1145 | @ </pre></blockquote> |
| @@ -1263,11 +1279,10 @@ | |
| 1279 | } |
| 1280 | } |
| 1281 | style_header("Artifact Content"); |
| 1282 | zUuid = db_text("?", "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1283 | @ <h2>Artifact %s(zUuid)</h2> |
| 1284 | blob_zero(&downloadName); |
| 1285 | object_description(rid, 0, &downloadName); |
| 1286 | style_submenu_element("Download", "Download", |
| 1287 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1288 | zMime = mimetype_from_name(blob_str(&downloadName)); |
| @@ -1290,11 +1305,10 @@ | |
| 1305 | style_submenu_element("Text", "Text", |
| 1306 | "%s/artifact/%s?txt=1", g.zTop, zUuid); |
| 1307 | } |
| 1308 | } |
| 1309 | } |
| 1310 | @ <hr /> |
| 1311 | content_get(rid, &content); |
| 1312 | if( renderAsWiki ){ |
| 1313 | wiki_convert(&content, 0, 0); |
| 1314 | }else if( renderAsHtml ){ |
| 1315 |
+46
-32
| --- src/info.c | ||
| +++ src/info.c | ||
| @@ -777,59 +777,81 @@ | ||
| 777 | 777 | Stmt q; |
| 778 | 778 | int cnt = 0; |
| 779 | 779 | int nWiki = 0; |
| 780 | 780 | char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 781 | 781 | |
| 782 | + char *prevName = 0; | |
| 783 | + | |
| 782 | 784 | db_prepare(&q, |
| 783 | 785 | "SELECT filename.name, datetime(event.mtime)," |
| 784 | 786 | " coalesce(event.ecomment,event.comment)," |
| 785 | 787 | " coalesce(event.euser,event.user)," |
| 786 | - " b.uuid, mlink.mperm" | |
| 788 | + " b.uuid, mlink.mperm," | |
| 789 | + " coalesce((SELECT value FROM tagxref" | |
| 790 | + " WHERE tagid=%d AND tagtype>0 AND rid=mlink.mid),'trunk')" | |
| 787 | 791 | " FROM mlink, filename, event, blob a, blob b" |
| 788 | 792 | " WHERE filename.fnid=mlink.fnid" |
| 789 | 793 | " AND event.objid=mlink.mid" |
| 790 | 794 | " AND a.rid=mlink.fid" |
| 791 | 795 | " AND b.rid=mlink.mid" |
| 792 | - " AND mlink.fid=%d", | |
| 793 | - rid | |
| 796 | + " AND mlink.fid=%d" | |
| 797 | + " ORDER BY filename.name, event.mtime", | |
| 798 | + TAG_BRANCH, rid | |
| 794 | 799 | ); |
| 800 | + @ <ul> | |
| 795 | 801 | while( db_step(&q)==SQLITE_ROW ){ |
| 796 | 802 | const char *zName = db_column_text(&q, 0); |
| 797 | 803 | const char *zDate = db_column_text(&q, 1); |
| 798 | 804 | const char *zCom = db_column_text(&q, 2); |
| 799 | 805 | const char *zUser = db_column_text(&q, 3); |
| 800 | 806 | const char *zVers = db_column_text(&q, 4); |
| 801 | 807 | int mPerm = db_column_int(&q, 5); |
| 802 | - if( cnt>0 ){ | |
| 803 | - @ Also file | |
| 804 | - }else{ | |
| 805 | - @ File | |
| 806 | - } | |
| 807 | - if( g.okHistory ){ | |
| 808 | - @ <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a> | |
| 809 | - }else{ | |
| 810 | - @ %h(zName) | |
| 811 | - } | |
| 812 | - if( mPerm==PERM_LNK ){ | |
| 813 | - @ (symbolic link) | |
| 814 | - }else if( mPerm==PERM_EXE ){ | |
| 815 | - @ (executable) | |
| 816 | - } | |
| 817 | - @ part of check-in | |
| 808 | + const char *zBr = db_column_text(&q, 6); | |
| 809 | + if( !prevName || fossil_strcmp(zName, prevName) ) { | |
| 810 | + if( prevName ) { | |
| 811 | + @ </ul> | |
| 812 | + } | |
| 813 | + if( mPerm==PERM_LNK ){ | |
| 814 | + @ <li>Symbolic link | |
| 815 | + }else if( mPerm==PERM_EXE ){ | |
| 816 | + @ <li>Executable file | |
| 817 | + }else{ | |
| 818 | + @ <li>File | |
| 819 | + } | |
| 820 | + if( g.okHistory ){ | |
| 821 | + @ <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a> | |
| 822 | + }else{ | |
| 823 | + @ %h(zName) | |
| 824 | + } | |
| 825 | + @ <ul> | |
| 826 | + prevName = fossil_strdup(zName); | |
| 827 | + } | |
| 828 | + @ <li> | |
| 829 | + hyperlink_to_date(zDate,""); | |
| 830 | + @ - part of checkin | |
| 818 | 831 | hyperlink_to_uuid(zVers); |
| 819 | - @ - %w(zCom) by | |
| 820 | - hyperlink_to_user(zUser,zDate," on"); | |
| 821 | - hyperlink_to_date(zDate,"."); | |
| 832 | + if( zBr && zBr[0] ){ | |
| 833 | + if( g.okHistory ){ | |
| 834 | + @ on branch <a href="%s(g.zTop)/timeline?r=%T(zBr)">%h(zBr)</a> | |
| 835 | + }else{ | |
| 836 | + @ on branch %h(zBr) | |
| 837 | + } | |
| 838 | + } | |
| 839 | + @ - %w(zCom) (user: | |
| 840 | + hyperlink_to_user(zUser,zDate,""); | |
| 841 | + @ ) | |
| 822 | 842 | if( g.okHistory ){ |
| 823 | 843 | @ <a href="%s(g.zTop)/annotate?checkin=%S(zVers)&filename=%T(zName)"> |
| 824 | 844 | @ [annotate]</a> |
| 825 | 845 | } |
| 826 | 846 | cnt++; |
| 827 | 847 | if( pDownloadName && blob_size(pDownloadName)==0 ){ |
| 828 | 848 | blob_append(pDownloadName, zName, -1); |
| 829 | 849 | } |
| 830 | 850 | } |
| 851 | + @ </ul></ul> | |
| 852 | + free(prevName); | |
| 831 | 853 | db_finalize(&q); |
| 832 | 854 | db_prepare(&q, |
| 833 | 855 | "SELECT substr(tagname, 6, 10000), datetime(event.mtime)," |
| 834 | 856 | " coalesce(event.euser, event.user)" |
| 835 | 857 | " FROM tagxref, tag, event" |
| @@ -995,17 +1017,13 @@ | ||
| 995 | 1017 | style_header("Diff"); |
| 996 | 1018 | style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch", |
| 997 | 1019 | g.zTop, P("v1"), P("v2")); |
| 998 | 1020 | @ <h2>Differences From |
| 999 | 1021 | @ Artifact <a href="%s(g.zTop)/artifact/%S(zV1)">[%S(zV1)]</a>:</h2> |
| 1000 | - @ <blockquote><p> | |
| 1001 | - object_description(v1, 1, 0); | |
| 1002 | - @ </p></blockquote> | |
| 1022 | + object_description(v1, 0, 0); | |
| 1003 | 1023 | @ <h2>To Artifact <a href="%s(g.zTop)/artifact/%S(zV2)">[%S(zV2)]</a>:</h2> |
| 1004 | - @ <blockquote><p> | |
| 1005 | - object_description(v2, 1, 0); | |
| 1006 | - @ </p></blockquote> | |
| 1024 | + object_description(v2, 0, 0); | |
| 1007 | 1025 | @ <hr /> |
| 1008 | 1026 | @ <blockquote><pre> |
| 1009 | 1027 | @ %h(blob_str(&diff)) |
| 1010 | 1028 | @ </pre></blockquote> |
| 1011 | 1029 | blob_reset(&diff); |
| @@ -1114,16 +1132,14 @@ | ||
| 1114 | 1132 | } |
| 1115 | 1133 | } |
| 1116 | 1134 | style_header("Hex Artifact Content"); |
| 1117 | 1135 | zUuid = db_text("?","SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1118 | 1136 | @ <h2>Artifact %s(zUuid):</h2> |
| 1119 | - @ <blockquote><p> | |
| 1120 | 1137 | blob_zero(&downloadName); |
| 1121 | 1138 | object_description(rid, 0, &downloadName); |
| 1122 | 1139 | style_submenu_element("Download", "Download", |
| 1123 | 1140 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1124 | - @ </p></blockquote> | |
| 1125 | 1141 | @ <hr /> |
| 1126 | 1142 | content_get(rid, &content); |
| 1127 | 1143 | @ <blockquote><pre> |
| 1128 | 1144 | hexdump(&content); |
| 1129 | 1145 | @ </pre></blockquote> |
| @@ -1263,11 +1279,10 @@ | ||
| 1263 | 1279 | } |
| 1264 | 1280 | } |
| 1265 | 1281 | style_header("Artifact Content"); |
| 1266 | 1282 | zUuid = db_text("?", "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1267 | 1283 | @ <h2>Artifact %s(zUuid)</h2> |
| 1268 | - @ <blockquote><p> | |
| 1269 | 1284 | blob_zero(&downloadName); |
| 1270 | 1285 | object_description(rid, 0, &downloadName); |
| 1271 | 1286 | style_submenu_element("Download", "Download", |
| 1272 | 1287 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1273 | 1288 | zMime = mimetype_from_name(blob_str(&downloadName)); |
| @@ -1290,11 +1305,10 @@ | ||
| 1290 | 1305 | style_submenu_element("Text", "Text", |
| 1291 | 1306 | "%s/artifact/%s?txt=1", g.zTop, zUuid); |
| 1292 | 1307 | } |
| 1293 | 1308 | } |
| 1294 | 1309 | } |
| 1295 | - @ </p></blockquote> | |
| 1296 | 1310 | @ <hr /> |
| 1297 | 1311 | content_get(rid, &content); |
| 1298 | 1312 | if( renderAsWiki ){ |
| 1299 | 1313 | wiki_convert(&content, 0, 0); |
| 1300 | 1314 | }else if( renderAsHtml ){ |
| 1301 | 1315 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -777,59 +777,81 @@ | |
| 777 | Stmt q; |
| 778 | int cnt = 0; |
| 779 | int nWiki = 0; |
| 780 | char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 781 | |
| 782 | db_prepare(&q, |
| 783 | "SELECT filename.name, datetime(event.mtime)," |
| 784 | " coalesce(event.ecomment,event.comment)," |
| 785 | " coalesce(event.euser,event.user)," |
| 786 | " b.uuid, mlink.mperm" |
| 787 | " FROM mlink, filename, event, blob a, blob b" |
| 788 | " WHERE filename.fnid=mlink.fnid" |
| 789 | " AND event.objid=mlink.mid" |
| 790 | " AND a.rid=mlink.fid" |
| 791 | " AND b.rid=mlink.mid" |
| 792 | " AND mlink.fid=%d", |
| 793 | rid |
| 794 | ); |
| 795 | while( db_step(&q)==SQLITE_ROW ){ |
| 796 | const char *zName = db_column_text(&q, 0); |
| 797 | const char *zDate = db_column_text(&q, 1); |
| 798 | const char *zCom = db_column_text(&q, 2); |
| 799 | const char *zUser = db_column_text(&q, 3); |
| 800 | const char *zVers = db_column_text(&q, 4); |
| 801 | int mPerm = db_column_int(&q, 5); |
| 802 | if( cnt>0 ){ |
| 803 | @ Also file |
| 804 | }else{ |
| 805 | @ File |
| 806 | } |
| 807 | if( g.okHistory ){ |
| 808 | @ <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a> |
| 809 | }else{ |
| 810 | @ %h(zName) |
| 811 | } |
| 812 | if( mPerm==PERM_LNK ){ |
| 813 | @ (symbolic link) |
| 814 | }else if( mPerm==PERM_EXE ){ |
| 815 | @ (executable) |
| 816 | } |
| 817 | @ part of check-in |
| 818 | hyperlink_to_uuid(zVers); |
| 819 | @ - %w(zCom) by |
| 820 | hyperlink_to_user(zUser,zDate," on"); |
| 821 | hyperlink_to_date(zDate,"."); |
| 822 | if( g.okHistory ){ |
| 823 | @ <a href="%s(g.zTop)/annotate?checkin=%S(zVers)&filename=%T(zName)"> |
| 824 | @ [annotate]</a> |
| 825 | } |
| 826 | cnt++; |
| 827 | if( pDownloadName && blob_size(pDownloadName)==0 ){ |
| 828 | blob_append(pDownloadName, zName, -1); |
| 829 | } |
| 830 | } |
| 831 | db_finalize(&q); |
| 832 | db_prepare(&q, |
| 833 | "SELECT substr(tagname, 6, 10000), datetime(event.mtime)," |
| 834 | " coalesce(event.euser, event.user)" |
| 835 | " FROM tagxref, tag, event" |
| @@ -995,17 +1017,13 @@ | |
| 995 | style_header("Diff"); |
| 996 | style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch", |
| 997 | g.zTop, P("v1"), P("v2")); |
| 998 | @ <h2>Differences From |
| 999 | @ Artifact <a href="%s(g.zTop)/artifact/%S(zV1)">[%S(zV1)]</a>:</h2> |
| 1000 | @ <blockquote><p> |
| 1001 | object_description(v1, 1, 0); |
| 1002 | @ </p></blockquote> |
| 1003 | @ <h2>To Artifact <a href="%s(g.zTop)/artifact/%S(zV2)">[%S(zV2)]</a>:</h2> |
| 1004 | @ <blockquote><p> |
| 1005 | object_description(v2, 1, 0); |
| 1006 | @ </p></blockquote> |
| 1007 | @ <hr /> |
| 1008 | @ <blockquote><pre> |
| 1009 | @ %h(blob_str(&diff)) |
| 1010 | @ </pre></blockquote> |
| 1011 | blob_reset(&diff); |
| @@ -1114,16 +1132,14 @@ | |
| 1114 | } |
| 1115 | } |
| 1116 | style_header("Hex Artifact Content"); |
| 1117 | zUuid = db_text("?","SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1118 | @ <h2>Artifact %s(zUuid):</h2> |
| 1119 | @ <blockquote><p> |
| 1120 | blob_zero(&downloadName); |
| 1121 | object_description(rid, 0, &downloadName); |
| 1122 | style_submenu_element("Download", "Download", |
| 1123 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1124 | @ </p></blockquote> |
| 1125 | @ <hr /> |
| 1126 | content_get(rid, &content); |
| 1127 | @ <blockquote><pre> |
| 1128 | hexdump(&content); |
| 1129 | @ </pre></blockquote> |
| @@ -1263,11 +1279,10 @@ | |
| 1263 | } |
| 1264 | } |
| 1265 | style_header("Artifact Content"); |
| 1266 | zUuid = db_text("?", "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1267 | @ <h2>Artifact %s(zUuid)</h2> |
| 1268 | @ <blockquote><p> |
| 1269 | blob_zero(&downloadName); |
| 1270 | object_description(rid, 0, &downloadName); |
| 1271 | style_submenu_element("Download", "Download", |
| 1272 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1273 | zMime = mimetype_from_name(blob_str(&downloadName)); |
| @@ -1290,11 +1305,10 @@ | |
| 1290 | style_submenu_element("Text", "Text", |
| 1291 | "%s/artifact/%s?txt=1", g.zTop, zUuid); |
| 1292 | } |
| 1293 | } |
| 1294 | } |
| 1295 | @ </p></blockquote> |
| 1296 | @ <hr /> |
| 1297 | content_get(rid, &content); |
| 1298 | if( renderAsWiki ){ |
| 1299 | wiki_convert(&content, 0, 0); |
| 1300 | }else if( renderAsHtml ){ |
| 1301 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -777,59 +777,81 @@ | |
| 777 | Stmt q; |
| 778 | int cnt = 0; |
| 779 | int nWiki = 0; |
| 780 | char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 781 | |
| 782 | char *prevName = 0; |
| 783 | |
| 784 | db_prepare(&q, |
| 785 | "SELECT filename.name, datetime(event.mtime)," |
| 786 | " coalesce(event.ecomment,event.comment)," |
| 787 | " coalesce(event.euser,event.user)," |
| 788 | " b.uuid, mlink.mperm," |
| 789 | " coalesce((SELECT value FROM tagxref" |
| 790 | " WHERE tagid=%d AND tagtype>0 AND rid=mlink.mid),'trunk')" |
| 791 | " FROM mlink, filename, event, blob a, blob b" |
| 792 | " WHERE filename.fnid=mlink.fnid" |
| 793 | " AND event.objid=mlink.mid" |
| 794 | " AND a.rid=mlink.fid" |
| 795 | " AND b.rid=mlink.mid" |
| 796 | " AND mlink.fid=%d" |
| 797 | " ORDER BY filename.name, event.mtime", |
| 798 | TAG_BRANCH, rid |
| 799 | ); |
| 800 | @ <ul> |
| 801 | while( db_step(&q)==SQLITE_ROW ){ |
| 802 | const char *zName = db_column_text(&q, 0); |
| 803 | const char *zDate = db_column_text(&q, 1); |
| 804 | const char *zCom = db_column_text(&q, 2); |
| 805 | const char *zUser = db_column_text(&q, 3); |
| 806 | const char *zVers = db_column_text(&q, 4); |
| 807 | int mPerm = db_column_int(&q, 5); |
| 808 | const char *zBr = db_column_text(&q, 6); |
| 809 | if( !prevName || fossil_strcmp(zName, prevName) ) { |
| 810 | if( prevName ) { |
| 811 | @ </ul> |
| 812 | } |
| 813 | if( mPerm==PERM_LNK ){ |
| 814 | @ <li>Symbolic link |
| 815 | }else if( mPerm==PERM_EXE ){ |
| 816 | @ <li>Executable file |
| 817 | }else{ |
| 818 | @ <li>File |
| 819 | } |
| 820 | if( g.okHistory ){ |
| 821 | @ <a href="%s(g.zTop)/finfo?name=%T(zName)">%h(zName)</a> |
| 822 | }else{ |
| 823 | @ %h(zName) |
| 824 | } |
| 825 | @ <ul> |
| 826 | prevName = fossil_strdup(zName); |
| 827 | } |
| 828 | @ <li> |
| 829 | hyperlink_to_date(zDate,""); |
| 830 | @ - part of checkin |
| 831 | hyperlink_to_uuid(zVers); |
| 832 | if( zBr && zBr[0] ){ |
| 833 | if( g.okHistory ){ |
| 834 | @ on branch <a href="%s(g.zTop)/timeline?r=%T(zBr)">%h(zBr)</a> |
| 835 | }else{ |
| 836 | @ on branch %h(zBr) |
| 837 | } |
| 838 | } |
| 839 | @ - %w(zCom) (user: |
| 840 | hyperlink_to_user(zUser,zDate,""); |
| 841 | @ ) |
| 842 | if( g.okHistory ){ |
| 843 | @ <a href="%s(g.zTop)/annotate?checkin=%S(zVers)&filename=%T(zName)"> |
| 844 | @ [annotate]</a> |
| 845 | } |
| 846 | cnt++; |
| 847 | if( pDownloadName && blob_size(pDownloadName)==0 ){ |
| 848 | blob_append(pDownloadName, zName, -1); |
| 849 | } |
| 850 | } |
| 851 | @ </ul></ul> |
| 852 | free(prevName); |
| 853 | db_finalize(&q); |
| 854 | db_prepare(&q, |
| 855 | "SELECT substr(tagname, 6, 10000), datetime(event.mtime)," |
| 856 | " coalesce(event.euser, event.user)" |
| 857 | " FROM tagxref, tag, event" |
| @@ -995,17 +1017,13 @@ | |
| 1017 | style_header("Diff"); |
| 1018 | style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch", |
| 1019 | g.zTop, P("v1"), P("v2")); |
| 1020 | @ <h2>Differences From |
| 1021 | @ Artifact <a href="%s(g.zTop)/artifact/%S(zV1)">[%S(zV1)]</a>:</h2> |
| 1022 | object_description(v1, 0, 0); |
| 1023 | @ <h2>To Artifact <a href="%s(g.zTop)/artifact/%S(zV2)">[%S(zV2)]</a>:</h2> |
| 1024 | object_description(v2, 0, 0); |
| 1025 | @ <hr /> |
| 1026 | @ <blockquote><pre> |
| 1027 | @ %h(blob_str(&diff)) |
| 1028 | @ </pre></blockquote> |
| 1029 | blob_reset(&diff); |
| @@ -1114,16 +1132,14 @@ | |
| 1132 | } |
| 1133 | } |
| 1134 | style_header("Hex Artifact Content"); |
| 1135 | zUuid = db_text("?","SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1136 | @ <h2>Artifact %s(zUuid):</h2> |
| 1137 | blob_zero(&downloadName); |
| 1138 | object_description(rid, 0, &downloadName); |
| 1139 | style_submenu_element("Download", "Download", |
| 1140 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1141 | @ <hr /> |
| 1142 | content_get(rid, &content); |
| 1143 | @ <blockquote><pre> |
| 1144 | hexdump(&content); |
| 1145 | @ </pre></blockquote> |
| @@ -1263,11 +1279,10 @@ | |
| 1279 | } |
| 1280 | } |
| 1281 | style_header("Artifact Content"); |
| 1282 | zUuid = db_text("?", "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 1283 | @ <h2>Artifact %s(zUuid)</h2> |
| 1284 | blob_zero(&downloadName); |
| 1285 | object_description(rid, 0, &downloadName); |
| 1286 | style_submenu_element("Download", "Download", |
| 1287 | "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); |
| 1288 | zMime = mimetype_from_name(blob_str(&downloadName)); |
| @@ -1290,11 +1305,10 @@ | |
| 1305 | style_submenu_element("Text", "Text", |
| 1306 | "%s/artifact/%s?txt=1", g.zTop, zUuid); |
| 1307 | } |
| 1308 | } |
| 1309 | } |
| 1310 | @ <hr /> |
| 1311 | content_get(rid, &content); |
| 1312 | if( renderAsWiki ){ |
| 1313 | wiki_convert(&content, 0, 0); |
| 1314 | }else if( renderAsHtml ){ |
| 1315 |