Fossil SCM
Render any phantom or shunned artifacts as an empty file.
Commit
2487f505cd3bf30fc3dcf9ce63c4560b72428cd3b959a27fa94d6c2067822a01
Parent
a3471a5eef0b476…
1 file changed
+14
-4
+14
-4
| --- src/export.c | ||
| +++ src/export.c | ||
| @@ -949,22 +949,32 @@ | ||
| 949 | 949 | db_step(&sIns); |
| 950 | 950 | db_reset(&sIns); |
| 951 | 951 | return db_last_insert_rowid(); |
| 952 | 952 | } |
| 953 | 953 | |
| 954 | +/* This is the SHA3-256 hash of an empty file */ | |
| 955 | +static const char zEmptySha3[] = | |
| 956 | + "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a"; | |
| 957 | + | |
| 954 | 958 | /* |
| 955 | 959 | ** Export a single file named by zUuid. |
| 956 | 960 | */ |
| 957 | 961 | static void mirror_send_file(FILE *xCmd, const char *zUuid){ |
| 958 | 962 | int iMark; |
| 959 | 963 | int rid; |
| 960 | 964 | int rc; |
| 961 | 965 | Blob data; |
| 962 | 966 | rid = fast_uuid_to_rid(zUuid); |
| 963 | - if( rid<0 ) fossil_fatal("no rid for %s", zUuid); | |
| 964 | - rc = content_get(rid, &data); | |
| 965 | - if( rc==0 ) fossil_fatal("%s is a phantom", zUuid); | |
| 967 | + if( rid<0 ){ | |
| 968 | + zUuid = zEmptySha3; | |
| 969 | + }else{ | |
| 970 | + rc = content_get(rid, &data); | |
| 971 | + if( rc==0 ){ | |
| 972 | + blob_init(&data, 0, 0); | |
| 973 | + zUuid = zEmptySha3; | |
| 974 | + } | |
| 975 | + } | |
| 966 | 976 | iMark = mirror_find_mark(zUuid, 1); |
| 967 | 977 | fprintf(xCmd, "blob\nmark :%d\ndata %d\n", iMark, blob_size(&data)); |
| 968 | 978 | fwrite(blob_buffer(&data), 1, blob_size(&data), xCmd); |
| 969 | 979 | fprintf(xCmd, "\n"); |
| 970 | 980 | blob_reset(&data); |
| @@ -1269,11 +1279,11 @@ | ||
| 1269 | 1279 | " WHERE type IN ('ci','t')" |
| 1270 | 1280 | " AND mtime>coalesce((SELECT value FROM mconfig WHERE key='start'),0.0)" |
| 1271 | 1281 | " AND blob.rid=event.objid" |
| 1272 | 1282 | " AND blob.uuid NOT IN (SELECT uuid FROM mirror.mmark);" |
| 1273 | 1283 | ); |
| 1274 | - nTotal = db_int(0, "SELECT count(*) FROM tomirror"); | |
| 1284 | + nTotal = db_int(0, "SELECT count(*) FROM tomirror WHERE type='ci'"); | |
| 1275 | 1285 | if( nLimit<nTotal ){ |
| 1276 | 1286 | nTotal = nLimit; |
| 1277 | 1287 | }else if( nLimit>nTotal ){ |
| 1278 | 1288 | nLimit = nTotal; |
| 1279 | 1289 | } |
| 1280 | 1290 |
| --- src/export.c | |
| +++ src/export.c | |
| @@ -949,22 +949,32 @@ | |
| 949 | db_step(&sIns); |
| 950 | db_reset(&sIns); |
| 951 | return db_last_insert_rowid(); |
| 952 | } |
| 953 | |
| 954 | /* |
| 955 | ** Export a single file named by zUuid. |
| 956 | */ |
| 957 | static void mirror_send_file(FILE *xCmd, const char *zUuid){ |
| 958 | int iMark; |
| 959 | int rid; |
| 960 | int rc; |
| 961 | Blob data; |
| 962 | rid = fast_uuid_to_rid(zUuid); |
| 963 | if( rid<0 ) fossil_fatal("no rid for %s", zUuid); |
| 964 | rc = content_get(rid, &data); |
| 965 | if( rc==0 ) fossil_fatal("%s is a phantom", zUuid); |
| 966 | iMark = mirror_find_mark(zUuid, 1); |
| 967 | fprintf(xCmd, "blob\nmark :%d\ndata %d\n", iMark, blob_size(&data)); |
| 968 | fwrite(blob_buffer(&data), 1, blob_size(&data), xCmd); |
| 969 | fprintf(xCmd, "\n"); |
| 970 | blob_reset(&data); |
| @@ -1269,11 +1279,11 @@ | |
| 1269 | " WHERE type IN ('ci','t')" |
| 1270 | " AND mtime>coalesce((SELECT value FROM mconfig WHERE key='start'),0.0)" |
| 1271 | " AND blob.rid=event.objid" |
| 1272 | " AND blob.uuid NOT IN (SELECT uuid FROM mirror.mmark);" |
| 1273 | ); |
| 1274 | nTotal = db_int(0, "SELECT count(*) FROM tomirror"); |
| 1275 | if( nLimit<nTotal ){ |
| 1276 | nTotal = nLimit; |
| 1277 | }else if( nLimit>nTotal ){ |
| 1278 | nLimit = nTotal; |
| 1279 | } |
| 1280 |
| --- src/export.c | |
| +++ src/export.c | |
| @@ -949,22 +949,32 @@ | |
| 949 | db_step(&sIns); |
| 950 | db_reset(&sIns); |
| 951 | return db_last_insert_rowid(); |
| 952 | } |
| 953 | |
| 954 | /* This is the SHA3-256 hash of an empty file */ |
| 955 | static const char zEmptySha3[] = |
| 956 | "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a"; |
| 957 | |
| 958 | /* |
| 959 | ** Export a single file named by zUuid. |
| 960 | */ |
| 961 | static void mirror_send_file(FILE *xCmd, const char *zUuid){ |
| 962 | int iMark; |
| 963 | int rid; |
| 964 | int rc; |
| 965 | Blob data; |
| 966 | rid = fast_uuid_to_rid(zUuid); |
| 967 | if( rid<0 ){ |
| 968 | zUuid = zEmptySha3; |
| 969 | }else{ |
| 970 | rc = content_get(rid, &data); |
| 971 | if( rc==0 ){ |
| 972 | blob_init(&data, 0, 0); |
| 973 | zUuid = zEmptySha3; |
| 974 | } |
| 975 | } |
| 976 | iMark = mirror_find_mark(zUuid, 1); |
| 977 | fprintf(xCmd, "blob\nmark :%d\ndata %d\n", iMark, blob_size(&data)); |
| 978 | fwrite(blob_buffer(&data), 1, blob_size(&data), xCmd); |
| 979 | fprintf(xCmd, "\n"); |
| 980 | blob_reset(&data); |
| @@ -1269,11 +1279,11 @@ | |
| 1279 | " WHERE type IN ('ci','t')" |
| 1280 | " AND mtime>coalesce((SELECT value FROM mconfig WHERE key='start'),0.0)" |
| 1281 | " AND blob.rid=event.objid" |
| 1282 | " AND blob.uuid NOT IN (SELECT uuid FROM mirror.mmark);" |
| 1283 | ); |
| 1284 | nTotal = db_int(0, "SELECT count(*) FROM tomirror WHERE type='ci'"); |
| 1285 | if( nLimit<nTotal ){ |
| 1286 | nTotal = nLimit; |
| 1287 | }else if( nLimit>nTotal ){ |
| 1288 | nLimit = nTotal; |
| 1289 | } |
| 1290 |