Fossil SCM
Make phantom records are warning, not a fatal error, when trying to checkout or examine a check-in.
Commit
f7cff4ad13d06ec008119347f65972b6aa406e59
Parent
c2f5dbe65527d18…
1 file changed
+5
-28
+5
-28
| --- src/vfile.c | ||
| +++ src/vfile.c | ||
| @@ -70,35 +70,10 @@ | ||
| 70 | 70 | rid = content_new(zUuid); |
| 71 | 71 | } |
| 72 | 72 | return rid; |
| 73 | 73 | } |
| 74 | 74 | |
| 75 | -/* | |
| 76 | -** Verify that an object is not a phantom. If the object is | |
| 77 | -** a phantom, output an error message and quit. | |
| 78 | -*/ | |
| 79 | -static void vfile_verify_not_phantom( | |
| 80 | - int rid, /* The RID to verify */ | |
| 81 | - const char *zFilename, /* Filename. Might be NULL */ | |
| 82 | - const char *zUuid /* UUID. Might be NULL */ | |
| 83 | -){ | |
| 84 | - if( db_int(-1, "SELECT size FROM blob WHERE rid=%d", rid)<0 | |
| 85 | - && (zUuid==0 || !db_exists("SELECT 1 FROM shun WHERE uuid='%s'",zUuid)) | |
| 86 | - ){ | |
| 87 | - if( zFilename ){ | |
| 88 | - fossil_fatal("content missing for %s", zFilename); | |
| 89 | - }else{ | |
| 90 | - char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); | |
| 91 | - if( zUuid ){ | |
| 92 | - fossil_fatal("content missing for [%.10s]", zUuid); | |
| 93 | - }else{ | |
| 94 | - fossil_panic("bad object id: %d", rid); | |
| 95 | - } | |
| 96 | - } | |
| 97 | - } | |
| 98 | -} | |
| 99 | - | |
| 100 | 75 | /* |
| 101 | 76 | ** Build a catalog of all files in a checkin. |
| 102 | 77 | */ |
| 103 | 78 | void vfile_build(int vid){ |
| 104 | 79 | int rid; |
| @@ -105,23 +80,25 @@ | ||
| 105 | 80 | Stmt ins; |
| 106 | 81 | Manifest *p; |
| 107 | 82 | ManifestFile *pFile; |
| 108 | 83 | |
| 109 | 84 | db_begin_transaction(); |
| 110 | - vfile_verify_not_phantom(vid, 0, 0); | |
| 111 | 85 | p = manifest_get(vid, CFTYPE_MANIFEST); |
| 112 | 86 | if( p==0 ) return; |
| 113 | 87 | db_multi_exec("DELETE FROM vfile WHERE vid=%d", vid); |
| 114 | 88 | db_prepare(&ins, |
| 115 | 89 | "INSERT INTO vfile(vid,rid,mrid,pathname) " |
| 116 | 90 | " VALUES(:vid,:id,:id,:name)"); |
| 117 | 91 | db_bind_int(&ins, ":vid", vid); |
| 118 | 92 | manifest_file_rewind(p); |
| 119 | 93 | while( (pFile = manifest_file_next(p,0))!=0 ){ |
| 120 | - if( pFile->zUuid==0 ) continue; | |
| 94 | + if( pFile->zUuid==0 || uuid_is_shunned(pFile->zUuid) ) continue; | |
| 121 | 95 | rid = uuid_to_rid(pFile->zUuid, 0); |
| 122 | - vfile_verify_not_phantom(rid, pFile->zName, pFile->zUuid); | |
| 96 | + if( rid==0 || db_int(-1, "SELECT size FROM blob WHERE rid=%d", rid)<0 ){ | |
| 97 | + fossil_warning("content missing for %s", pFile->zName); | |
| 98 | + continue; | |
| 99 | + } | |
| 123 | 100 | db_bind_int(&ins, ":id", rid); |
| 124 | 101 | db_bind_text(&ins, ":name", pFile->zName); |
| 125 | 102 | db_step(&ins); |
| 126 | 103 | db_reset(&ins); |
| 127 | 104 | } |
| 128 | 105 |
| --- src/vfile.c | |
| +++ src/vfile.c | |
| @@ -70,35 +70,10 @@ | |
| 70 | rid = content_new(zUuid); |
| 71 | } |
| 72 | return rid; |
| 73 | } |
| 74 | |
| 75 | /* |
| 76 | ** Verify that an object is not a phantom. If the object is |
| 77 | ** a phantom, output an error message and quit. |
| 78 | */ |
| 79 | static void vfile_verify_not_phantom( |
| 80 | int rid, /* The RID to verify */ |
| 81 | const char *zFilename, /* Filename. Might be NULL */ |
| 82 | const char *zUuid /* UUID. Might be NULL */ |
| 83 | ){ |
| 84 | if( db_int(-1, "SELECT size FROM blob WHERE rid=%d", rid)<0 |
| 85 | && (zUuid==0 || !db_exists("SELECT 1 FROM shun WHERE uuid='%s'",zUuid)) |
| 86 | ){ |
| 87 | if( zFilename ){ |
| 88 | fossil_fatal("content missing for %s", zFilename); |
| 89 | }else{ |
| 90 | char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 91 | if( zUuid ){ |
| 92 | fossil_fatal("content missing for [%.10s]", zUuid); |
| 93 | }else{ |
| 94 | fossil_panic("bad object id: %d", rid); |
| 95 | } |
| 96 | } |
| 97 | } |
| 98 | } |
| 99 | |
| 100 | /* |
| 101 | ** Build a catalog of all files in a checkin. |
| 102 | */ |
| 103 | void vfile_build(int vid){ |
| 104 | int rid; |
| @@ -105,23 +80,25 @@ | |
| 105 | Stmt ins; |
| 106 | Manifest *p; |
| 107 | ManifestFile *pFile; |
| 108 | |
| 109 | db_begin_transaction(); |
| 110 | vfile_verify_not_phantom(vid, 0, 0); |
| 111 | p = manifest_get(vid, CFTYPE_MANIFEST); |
| 112 | if( p==0 ) return; |
| 113 | db_multi_exec("DELETE FROM vfile WHERE vid=%d", vid); |
| 114 | db_prepare(&ins, |
| 115 | "INSERT INTO vfile(vid,rid,mrid,pathname) " |
| 116 | " VALUES(:vid,:id,:id,:name)"); |
| 117 | db_bind_int(&ins, ":vid", vid); |
| 118 | manifest_file_rewind(p); |
| 119 | while( (pFile = manifest_file_next(p,0))!=0 ){ |
| 120 | if( pFile->zUuid==0 ) continue; |
| 121 | rid = uuid_to_rid(pFile->zUuid, 0); |
| 122 | vfile_verify_not_phantom(rid, pFile->zName, pFile->zUuid); |
| 123 | db_bind_int(&ins, ":id", rid); |
| 124 | db_bind_text(&ins, ":name", pFile->zName); |
| 125 | db_step(&ins); |
| 126 | db_reset(&ins); |
| 127 | } |
| 128 |
| --- src/vfile.c | |
| +++ src/vfile.c | |
| @@ -70,35 +70,10 @@ | |
| 70 | rid = content_new(zUuid); |
| 71 | } |
| 72 | return rid; |
| 73 | } |
| 74 | |
| 75 | /* |
| 76 | ** Build a catalog of all files in a checkin. |
| 77 | */ |
| 78 | void vfile_build(int vid){ |
| 79 | int rid; |
| @@ -105,23 +80,25 @@ | |
| 80 | Stmt ins; |
| 81 | Manifest *p; |
| 82 | ManifestFile *pFile; |
| 83 | |
| 84 | db_begin_transaction(); |
| 85 | p = manifest_get(vid, CFTYPE_MANIFEST); |
| 86 | if( p==0 ) return; |
| 87 | db_multi_exec("DELETE FROM vfile WHERE vid=%d", vid); |
| 88 | db_prepare(&ins, |
| 89 | "INSERT INTO vfile(vid,rid,mrid,pathname) " |
| 90 | " VALUES(:vid,:id,:id,:name)"); |
| 91 | db_bind_int(&ins, ":vid", vid); |
| 92 | manifest_file_rewind(p); |
| 93 | while( (pFile = manifest_file_next(p,0))!=0 ){ |
| 94 | if( pFile->zUuid==0 || uuid_is_shunned(pFile->zUuid) ) continue; |
| 95 | rid = uuid_to_rid(pFile->zUuid, 0); |
| 96 | if( rid==0 || db_int(-1, "SELECT size FROM blob WHERE rid=%d", rid)<0 ){ |
| 97 | fossil_warning("content missing for %s", pFile->zName); |
| 98 | continue; |
| 99 | } |
| 100 | db_bind_int(&ins, ":id", rid); |
| 101 | db_bind_text(&ins, ":name", pFile->zName); |
| 102 | db_step(&ins); |
| 103 | db_reset(&ins); |
| 104 | } |
| 105 |