Fossil SCM
In file changes histories, show when the file is deleted.
Commit
4bbb437f06ec4066bb79d8a547fb5ed4c9405359
Parent
42ba7b97aa3a479…
1 file changed
+51
-45
+51
-45
| --- src/finfo.c | ||
| +++ src/finfo.c | ||
| @@ -58,19 +58,20 @@ | ||
| 58 | 58 | usage("FILENAME"); |
| 59 | 59 | } |
| 60 | 60 | file_tree_name(g.argv[2], &dest, 1); |
| 61 | 61 | zFilename = blob_str(&dest); |
| 62 | 62 | db_prepare(&q, |
| 63 | - "SELECT b.uuid, ci.uuid, date(event.mtime,'localtime')," | |
| 63 | + "SELECT " | |
| 64 | + " (SELECT uuid FROM blob WHERE rid=mlink.fid)," /* New file */ | |
| 65 | + " (SELECT uuid FROM blob WHERE rid=mlink.mid)," /* The check-in */ | |
| 66 | + " date(event.mtime,'localtime')," | |
| 64 | 67 | " coalesce(event.ecomment, event.comment)," |
| 65 | 68 | " coalesce(event.euser, event.user)" |
| 66 | - " FROM mlink, blob b, event, blob ci" | |
| 69 | + " FROM mlink, event" | |
| 67 | 70 | " WHERE mlink.fnid=(SELECT fnid FROM filename WHERE name=%Q)" |
| 68 | - " AND b.rid=mlink.fid" | |
| 69 | 71 | " AND event.objid=mlink.mid" |
| 70 | - " AND event.objid=ci.rid" | |
| 71 | - " ORDER BY event.mtime DESC LIMIT %d OFFSET %d", | |
| 72 | + " ORDER BY event.mtime DESC LIMIT %d OFFSET %d /*sort*/", | |
| 72 | 73 | zFilename, iLimit, iOffset |
| 73 | 74 | ); |
| 74 | 75 | |
| 75 | 76 | printf("History of %s\n", zFilename); |
| 76 | 77 | while( db_step(&q)==SQLITE_ROW ){ |
| @@ -79,12 +80,17 @@ | ||
| 79 | 80 | const char *zDate = db_column_text(&q, 2); |
| 80 | 81 | const char *zCom = db_column_text(&q, 3); |
| 81 | 82 | const char *zUser = db_column_text(&q, 4); |
| 82 | 83 | char *zOut; |
| 83 | 84 | printf("%s ", zDate); |
| 84 | - zOut = sqlite3_mprintf("[%.10s] %s (user: %s, artifact: [%.10s])", | |
| 85 | - zCiUuid, zCom, zUser, zFileUuid); | |
| 85 | + if( zFileUuid==0 ){ | |
| 86 | + zOut = sqlite3_mprintf("[%.10s] DELETED %s (user: %s)", | |
| 87 | + zCiUuid, zCom, zUser); | |
| 88 | + }else{ | |
| 89 | + zOut = sqlite3_mprintf("[%.10s] %s (user: %s, artifact: [%.10s])", | |
| 90 | + zCiUuid, zCom, zUser, zFileUuid); | |
| 91 | + } | |
| 86 | 92 | comment_print(zOut, 11, 79); |
| 87 | 93 | sqlite3_free(zOut); |
| 88 | 94 | } |
| 89 | 95 | db_finalize(&q); |
| 90 | 96 | blob_reset(&dest); |
| @@ -111,28 +117,25 @@ | ||
| 111 | 117 | |
| 112 | 118 | zPrevDate[0] = 0; |
| 113 | 119 | zFilename = PD("name",""); |
| 114 | 120 | db_prepare(&q, |
| 115 | 121 | "SELECT" |
| 116 | - " substr(b.uuid,1,10)," | |
| 117 | - " datetime(event.mtime,'localtime')," | |
| 118 | - " coalesce(event.ecomment, event.comment)," | |
| 119 | - " coalesce(event.euser, event.user)," | |
| 120 | - " mlink.pid," | |
| 121 | - " mlink.fid," | |
| 122 | - " (SELECT substr(uuid,1,10) FROM blob WHERE rid=mlink.pid)," | |
| 123 | - " (SELECT substr(uuid,1,10) FROM blob WHERE rid=mlink.fid)," | |
| 124 | - " ci.uuid," | |
| 125 | - " event.bgcolor," | |
| 122 | + " datetime(event.mtime,'localtime')," /* Date of change */ | |
| 123 | + " coalesce(event.ecomment, event.comment)," /* Check-in comment */ | |
| 124 | + " coalesce(event.euser, event.user)," /* User who made chng */ | |
| 125 | + " mlink.pid," /* File rid */ | |
| 126 | + " mlink.fid," /* Parent file rid */ | |
| 127 | + " (SELECT uuid FROM blob WHERE rid=mlink.pid)," /* Parent file uuid */ | |
| 128 | + " (SELECT uuid FROM blob WHERE rid=mlink.fid)," /* Current file uuid */ | |
| 129 | + " (SELECT uuid FROM blob WHERE rid=mlink.mid)," /* Check-in uuid */ | |
| 130 | + " event.bgcolor," /* Background color */ | |
| 126 | 131 | " (SELECT value FROM tagxref WHERE tagid=%d AND tagtype>0" |
| 127 | - " AND tagxref.rid=mlink.mid)" | |
| 128 | - " FROM mlink, blob b, event, blob ci" | |
| 132 | + " AND tagxref.rid=mlink.mid)" /* Tags */ | |
| 133 | + " FROM mlink, event" | |
| 129 | 134 | " WHERE mlink.fnid=(SELECT fnid FROM filename WHERE name=%Q)" |
| 130 | - " AND b.rid=mlink.fid" | |
| 131 | 135 | " AND event.objid=mlink.mid" |
| 132 | - " AND event.objid=ci.rid" | |
| 133 | - " ORDER BY event.mtime DESC", | |
| 136 | + " ORDER BY event.mtime DESC /*sort*/", | |
| 134 | 137 | TAG_BRANCH, |
| 135 | 138 | zFilename |
| 136 | 139 | ); |
| 137 | 140 | blob_zero(&title); |
| 138 | 141 | blob_appendf(&title, "History of "); |
| @@ -141,21 +144,20 @@ | ||
| 141 | 144 | blob_reset(&title); |
| 142 | 145 | pGraph = graph_init(); |
| 143 | 146 | @ <div id="canvas" style="position:relative;width:1px;height:1px;"></div> |
| 144 | 147 | @ <table cellspacing=0 border=0 cellpadding=0> |
| 145 | 148 | while( db_step(&q)==SQLITE_ROW ){ |
| 146 | - const char *zUuid = db_column_text(&q, 0); | |
| 147 | - const char *zDate = db_column_text(&q, 1); | |
| 148 | - const char *zCom = db_column_text(&q, 2); | |
| 149 | - const char *zUser = db_column_text(&q, 3); | |
| 150 | - int fpid = db_column_int(&q, 4); | |
| 151 | - int frid = db_column_int(&q, 5); | |
| 152 | - const char *zFpuid = db_column_text(&q, 6); | |
| 153 | - const char *zFuid = db_column_text(&q, 7); | |
| 154 | - const char *zCkin = db_column_text(&q,8); | |
| 155 | - const char *zBgClr = db_column_text(&q, 9); | |
| 156 | - const char *zBr = db_column_text(&q, 10); | |
| 149 | + const char *zDate = db_column_text(&q, 0); | |
| 150 | + const char *zCom = db_column_text(&q, 1); | |
| 151 | + const char *zUser = db_column_text(&q, 2); | |
| 152 | + int fpid = db_column_int(&q, 3); | |
| 153 | + int frid = db_column_int(&q, 4); | |
| 154 | + const char *zPUuid = db_column_text(&q, 5); | |
| 155 | + const char *zUuid = db_column_text(&q, 6); | |
| 156 | + const char *zCkin = db_column_text(&q,7); | |
| 157 | + const char *zBgClr = db_column_text(&q, 8); | |
| 158 | + const char *zBr = db_column_text(&q, 9); | |
| 157 | 159 | int gidx; |
| 158 | 160 | char zTime[10]; |
| 159 | 161 | char zShort[20]; |
| 160 | 162 | char zShortCkin[20]; |
| 161 | 163 | if( zBr==0 ) zBr = "trunk"; |
| @@ -176,28 +178,32 @@ | ||
| 176 | 178 | }else{ |
| 177 | 179 | @ <td valign="top" align="left"> |
| 178 | 180 | } |
| 179 | 181 | sqlite3_snprintf(sizeof(zShort), zShort, "%.10s", zUuid); |
| 180 | 182 | sqlite3_snprintf(sizeof(zShortCkin), zShortCkin, "%.10s", zCkin); |
| 181 | - if( g.okHistory ){ | |
| 182 | - @ <a href="%s(g.zTop)/artifact/%s(zUuid)">[%s(zShort)]</a> | |
| 183 | + if( zUuid ){ | |
| 184 | + if( g.okHistory ){ | |
| 185 | + @ <a href="%s(g.zTop)/artifact/%s(zUuid)">[%S(zUuid)]</a> | |
| 186 | + }else{ | |
| 187 | + @ [%S(zUuid)] | |
| 188 | + } | |
| 189 | + @ part of check-in | |
| 183 | 190 | }else{ |
| 184 | - @ [%s(zShort)] | |
| 191 | + @ <b>Deleted</b> by check-in | |
| 185 | 192 | } |
| 186 | - @ part of check-in | |
| 187 | 193 | hyperlink_to_uuid(zShortCkin); |
| 188 | 194 | @ %h(zCom) (user: |
| 189 | 195 | hyperlink_to_user(zUser, zDate, ""); |
| 190 | 196 | @ branch: %h(zBr)) |
| 191 | - if( g.okHistory ){ | |
| 192 | - if( fpid ){ | |
| 193 | - @ <a href="%s(g.zTop)/fdiff?v1=%s(zFpuid)&v2=%s(zFuid)">[diff]</a> | |
| 194 | - } | |
| 195 | - @ <a href="%s(g.zTop)/annotate?checkin=%s(zShortCkin)&filename=%h(zFilename)"> | |
| 196 | - @ [annotate]</a> | |
| 197 | - @ </td> | |
| 198 | - } | |
| 197 | + if( g.okHistory && zUuid ){ | |
| 198 | + if( fpid ){ | |
| 199 | + @ <a href="%s(g.zTop)/fdiff?v1=%s(zPUuid)&v2=%s(zUuid)">[diff]</a> | |
| 200 | + } | |
| 201 | + @ <a href="%s(g.zTop)/annotate?checkin=%S(zCkin)&filename=%h(zFilename)"> | |
| 202 | + @ [annotate]</a> | |
| 203 | + } | |
| 204 | + @ </td> | |
| 199 | 205 | } |
| 200 | 206 | db_finalize(&q); |
| 201 | 207 | if( pGraph ){ |
| 202 | 208 | graph_finish(pGraph, 1); |
| 203 | 209 | if( pGraph->nErr ){ |
| 204 | 210 |
| --- src/finfo.c | |
| +++ src/finfo.c | |
| @@ -58,19 +58,20 @@ | |
| 58 | usage("FILENAME"); |
| 59 | } |
| 60 | file_tree_name(g.argv[2], &dest, 1); |
| 61 | zFilename = blob_str(&dest); |
| 62 | db_prepare(&q, |
| 63 | "SELECT b.uuid, ci.uuid, date(event.mtime,'localtime')," |
| 64 | " coalesce(event.ecomment, event.comment)," |
| 65 | " coalesce(event.euser, event.user)" |
| 66 | " FROM mlink, blob b, event, blob ci" |
| 67 | " WHERE mlink.fnid=(SELECT fnid FROM filename WHERE name=%Q)" |
| 68 | " AND b.rid=mlink.fid" |
| 69 | " AND event.objid=mlink.mid" |
| 70 | " AND event.objid=ci.rid" |
| 71 | " ORDER BY event.mtime DESC LIMIT %d OFFSET %d", |
| 72 | zFilename, iLimit, iOffset |
| 73 | ); |
| 74 | |
| 75 | printf("History of %s\n", zFilename); |
| 76 | while( db_step(&q)==SQLITE_ROW ){ |
| @@ -79,12 +80,17 @@ | |
| 79 | const char *zDate = db_column_text(&q, 2); |
| 80 | const char *zCom = db_column_text(&q, 3); |
| 81 | const char *zUser = db_column_text(&q, 4); |
| 82 | char *zOut; |
| 83 | printf("%s ", zDate); |
| 84 | zOut = sqlite3_mprintf("[%.10s] %s (user: %s, artifact: [%.10s])", |
| 85 | zCiUuid, zCom, zUser, zFileUuid); |
| 86 | comment_print(zOut, 11, 79); |
| 87 | sqlite3_free(zOut); |
| 88 | } |
| 89 | db_finalize(&q); |
| 90 | blob_reset(&dest); |
| @@ -111,28 +117,25 @@ | |
| 111 | |
| 112 | zPrevDate[0] = 0; |
| 113 | zFilename = PD("name",""); |
| 114 | db_prepare(&q, |
| 115 | "SELECT" |
| 116 | " substr(b.uuid,1,10)," |
| 117 | " datetime(event.mtime,'localtime')," |
| 118 | " coalesce(event.ecomment, event.comment)," |
| 119 | " coalesce(event.euser, event.user)," |
| 120 | " mlink.pid," |
| 121 | " mlink.fid," |
| 122 | " (SELECT substr(uuid,1,10) FROM blob WHERE rid=mlink.pid)," |
| 123 | " (SELECT substr(uuid,1,10) FROM blob WHERE rid=mlink.fid)," |
| 124 | " ci.uuid," |
| 125 | " event.bgcolor," |
| 126 | " (SELECT value FROM tagxref WHERE tagid=%d AND tagtype>0" |
| 127 | " AND tagxref.rid=mlink.mid)" |
| 128 | " FROM mlink, blob b, event, blob ci" |
| 129 | " WHERE mlink.fnid=(SELECT fnid FROM filename WHERE name=%Q)" |
| 130 | " AND b.rid=mlink.fid" |
| 131 | " AND event.objid=mlink.mid" |
| 132 | " AND event.objid=ci.rid" |
| 133 | " ORDER BY event.mtime DESC", |
| 134 | TAG_BRANCH, |
| 135 | zFilename |
| 136 | ); |
| 137 | blob_zero(&title); |
| 138 | blob_appendf(&title, "History of "); |
| @@ -141,21 +144,20 @@ | |
| 141 | blob_reset(&title); |
| 142 | pGraph = graph_init(); |
| 143 | @ <div id="canvas" style="position:relative;width:1px;height:1px;"></div> |
| 144 | @ <table cellspacing=0 border=0 cellpadding=0> |
| 145 | while( db_step(&q)==SQLITE_ROW ){ |
| 146 | const char *zUuid = db_column_text(&q, 0); |
| 147 | const char *zDate = db_column_text(&q, 1); |
| 148 | const char *zCom = db_column_text(&q, 2); |
| 149 | const char *zUser = db_column_text(&q, 3); |
| 150 | int fpid = db_column_int(&q, 4); |
| 151 | int frid = db_column_int(&q, 5); |
| 152 | const char *zFpuid = db_column_text(&q, 6); |
| 153 | const char *zFuid = db_column_text(&q, 7); |
| 154 | const char *zCkin = db_column_text(&q,8); |
| 155 | const char *zBgClr = db_column_text(&q, 9); |
| 156 | const char *zBr = db_column_text(&q, 10); |
| 157 | int gidx; |
| 158 | char zTime[10]; |
| 159 | char zShort[20]; |
| 160 | char zShortCkin[20]; |
| 161 | if( zBr==0 ) zBr = "trunk"; |
| @@ -176,28 +178,32 @@ | |
| 176 | }else{ |
| 177 | @ <td valign="top" align="left"> |
| 178 | } |
| 179 | sqlite3_snprintf(sizeof(zShort), zShort, "%.10s", zUuid); |
| 180 | sqlite3_snprintf(sizeof(zShortCkin), zShortCkin, "%.10s", zCkin); |
| 181 | if( g.okHistory ){ |
| 182 | @ <a href="%s(g.zTop)/artifact/%s(zUuid)">[%s(zShort)]</a> |
| 183 | }else{ |
| 184 | @ [%s(zShort)] |
| 185 | } |
| 186 | @ part of check-in |
| 187 | hyperlink_to_uuid(zShortCkin); |
| 188 | @ %h(zCom) (user: |
| 189 | hyperlink_to_user(zUser, zDate, ""); |
| 190 | @ branch: %h(zBr)) |
| 191 | if( g.okHistory ){ |
| 192 | if( fpid ){ |
| 193 | @ <a href="%s(g.zTop)/fdiff?v1=%s(zFpuid)&v2=%s(zFuid)">[diff]</a> |
| 194 | } |
| 195 | @ <a href="%s(g.zTop)/annotate?checkin=%s(zShortCkin)&filename=%h(zFilename)"> |
| 196 | @ [annotate]</a> |
| 197 | @ </td> |
| 198 | } |
| 199 | } |
| 200 | db_finalize(&q); |
| 201 | if( pGraph ){ |
| 202 | graph_finish(pGraph, 1); |
| 203 | if( pGraph->nErr ){ |
| 204 |
| --- src/finfo.c | |
| +++ src/finfo.c | |
| @@ -58,19 +58,20 @@ | |
| 58 | usage("FILENAME"); |
| 59 | } |
| 60 | file_tree_name(g.argv[2], &dest, 1); |
| 61 | zFilename = blob_str(&dest); |
| 62 | db_prepare(&q, |
| 63 | "SELECT " |
| 64 | " (SELECT uuid FROM blob WHERE rid=mlink.fid)," /* New file */ |
| 65 | " (SELECT uuid FROM blob WHERE rid=mlink.mid)," /* The check-in */ |
| 66 | " date(event.mtime,'localtime')," |
| 67 | " coalesce(event.ecomment, event.comment)," |
| 68 | " coalesce(event.euser, event.user)" |
| 69 | " FROM mlink, event" |
| 70 | " WHERE mlink.fnid=(SELECT fnid FROM filename WHERE name=%Q)" |
| 71 | " AND event.objid=mlink.mid" |
| 72 | " ORDER BY event.mtime DESC LIMIT %d OFFSET %d /*sort*/", |
| 73 | zFilename, iLimit, iOffset |
| 74 | ); |
| 75 | |
| 76 | printf("History of %s\n", zFilename); |
| 77 | while( db_step(&q)==SQLITE_ROW ){ |
| @@ -79,12 +80,17 @@ | |
| 80 | const char *zDate = db_column_text(&q, 2); |
| 81 | const char *zCom = db_column_text(&q, 3); |
| 82 | const char *zUser = db_column_text(&q, 4); |
| 83 | char *zOut; |
| 84 | printf("%s ", zDate); |
| 85 | if( zFileUuid==0 ){ |
| 86 | zOut = sqlite3_mprintf("[%.10s] DELETED %s (user: %s)", |
| 87 | zCiUuid, zCom, zUser); |
| 88 | }else{ |
| 89 | zOut = sqlite3_mprintf("[%.10s] %s (user: %s, artifact: [%.10s])", |
| 90 | zCiUuid, zCom, zUser, zFileUuid); |
| 91 | } |
| 92 | comment_print(zOut, 11, 79); |
| 93 | sqlite3_free(zOut); |
| 94 | } |
| 95 | db_finalize(&q); |
| 96 | blob_reset(&dest); |
| @@ -111,28 +117,25 @@ | |
| 117 | |
| 118 | zPrevDate[0] = 0; |
| 119 | zFilename = PD("name",""); |
| 120 | db_prepare(&q, |
| 121 | "SELECT" |
| 122 | " datetime(event.mtime,'localtime')," /* Date of change */ |
| 123 | " coalesce(event.ecomment, event.comment)," /* Check-in comment */ |
| 124 | " coalesce(event.euser, event.user)," /* User who made chng */ |
| 125 | " mlink.pid," /* File rid */ |
| 126 | " mlink.fid," /* Parent file rid */ |
| 127 | " (SELECT uuid FROM blob WHERE rid=mlink.pid)," /* Parent file uuid */ |
| 128 | " (SELECT uuid FROM blob WHERE rid=mlink.fid)," /* Current file uuid */ |
| 129 | " (SELECT uuid FROM blob WHERE rid=mlink.mid)," /* Check-in uuid */ |
| 130 | " event.bgcolor," /* Background color */ |
| 131 | " (SELECT value FROM tagxref WHERE tagid=%d AND tagtype>0" |
| 132 | " AND tagxref.rid=mlink.mid)" /* Tags */ |
| 133 | " FROM mlink, event" |
| 134 | " WHERE mlink.fnid=(SELECT fnid FROM filename WHERE name=%Q)" |
| 135 | " AND event.objid=mlink.mid" |
| 136 | " ORDER BY event.mtime DESC /*sort*/", |
| 137 | TAG_BRANCH, |
| 138 | zFilename |
| 139 | ); |
| 140 | blob_zero(&title); |
| 141 | blob_appendf(&title, "History of "); |
| @@ -141,21 +144,20 @@ | |
| 144 | blob_reset(&title); |
| 145 | pGraph = graph_init(); |
| 146 | @ <div id="canvas" style="position:relative;width:1px;height:1px;"></div> |
| 147 | @ <table cellspacing=0 border=0 cellpadding=0> |
| 148 | while( db_step(&q)==SQLITE_ROW ){ |
| 149 | const char *zDate = db_column_text(&q, 0); |
| 150 | const char *zCom = db_column_text(&q, 1); |
| 151 | const char *zUser = db_column_text(&q, 2); |
| 152 | int fpid = db_column_int(&q, 3); |
| 153 | int frid = db_column_int(&q, 4); |
| 154 | const char *zPUuid = db_column_text(&q, 5); |
| 155 | const char *zUuid = db_column_text(&q, 6); |
| 156 | const char *zCkin = db_column_text(&q,7); |
| 157 | const char *zBgClr = db_column_text(&q, 8); |
| 158 | const char *zBr = db_column_text(&q, 9); |
| 159 | int gidx; |
| 160 | char zTime[10]; |
| 161 | char zShort[20]; |
| 162 | char zShortCkin[20]; |
| 163 | if( zBr==0 ) zBr = "trunk"; |
| @@ -176,28 +178,32 @@ | |
| 178 | }else{ |
| 179 | @ <td valign="top" align="left"> |
| 180 | } |
| 181 | sqlite3_snprintf(sizeof(zShort), zShort, "%.10s", zUuid); |
| 182 | sqlite3_snprintf(sizeof(zShortCkin), zShortCkin, "%.10s", zCkin); |
| 183 | if( zUuid ){ |
| 184 | if( g.okHistory ){ |
| 185 | @ <a href="%s(g.zTop)/artifact/%s(zUuid)">[%S(zUuid)]</a> |
| 186 | }else{ |
| 187 | @ [%S(zUuid)] |
| 188 | } |
| 189 | @ part of check-in |
| 190 | }else{ |
| 191 | @ <b>Deleted</b> by check-in |
| 192 | } |
| 193 | hyperlink_to_uuid(zShortCkin); |
| 194 | @ %h(zCom) (user: |
| 195 | hyperlink_to_user(zUser, zDate, ""); |
| 196 | @ branch: %h(zBr)) |
| 197 | if( g.okHistory && zUuid ){ |
| 198 | if( fpid ){ |
| 199 | @ <a href="%s(g.zTop)/fdiff?v1=%s(zPUuid)&v2=%s(zUuid)">[diff]</a> |
| 200 | } |
| 201 | @ <a href="%s(g.zTop)/annotate?checkin=%S(zCkin)&filename=%h(zFilename)"> |
| 202 | @ [annotate]</a> |
| 203 | } |
| 204 | @ </td> |
| 205 | } |
| 206 | db_finalize(&q); |
| 207 | if( pGraph ){ |
| 208 | graph_finish(pGraph, 1); |
| 209 | if( pGraph->nErr ){ |
| 210 |