Fossil SCM
Use the check-in time as the timestamp for zlib compression on tarballs, os that every tarball for the same check-in is identical.
Commit
3e141b792c689c08baffdaac4f62a6faa08b84c5
Parent
13120e9620d71fd…
2 files changed
+5
-4
+5
-4
+5
-4
| --- src/gzip.c | ||
| +++ src/gzip.c | ||
| @@ -47,20 +47,21 @@ | ||
| 47 | 47 | } |
| 48 | 48 | |
| 49 | 49 | /* |
| 50 | 50 | ** Begin constructing a gzip file. |
| 51 | 51 | */ |
| 52 | -void gzip_begin(void){ | |
| 52 | +void gzip_begin(sqlite3_int64 now){ | |
| 53 | 53 | char aHdr[10]; |
| 54 | - sqlite3_int64 now; | |
| 55 | 54 | assert( gzip.eState==0 ); |
| 56 | 55 | blob_zero(&gzip.out); |
| 57 | 56 | aHdr[0] = 0x1f; |
| 58 | 57 | aHdr[1] = 0x8b; |
| 59 | 58 | aHdr[2] = 8; |
| 60 | 59 | aHdr[3] = 0; |
| 61 | - now = db_int64(0, "SELECT (julianday('now') - 2440587.5)*86400.0"); | |
| 60 | + if( now==0 ){ | |
| 61 | + now = db_int64(0, "SELECT (julianday('now') - 2440587.5)*86400.0"); | |
| 62 | + } | |
| 62 | 63 | put32(&aHdr[4], now&0xffffffff); |
| 63 | 64 | aHdr[8] = 2; |
| 64 | 65 | aHdr[9] = 255; |
| 65 | 66 | blob_append(&gzip.out, aHdr, 10); |
| 66 | 67 | gzip.iCRC = 0; |
| @@ -125,15 +126,15 @@ | ||
| 125 | 126 | void test_gzip_cmd(void){ |
| 126 | 127 | Blob b; |
| 127 | 128 | char *zOut; |
| 128 | 129 | if( g.argc!=3 ) usage("FILENAME"); |
| 129 | 130 | sqlite3_open(":memory:", &g.db); |
| 130 | - gzip_begin(); | |
| 131 | + gzip_begin(0); | |
| 131 | 132 | blob_read_from_file(&b, g.argv[2]); |
| 132 | 133 | zOut = mprintf("%s.gz", g.argv[2]); |
| 133 | 134 | gzip_step(blob_buffer(&b), blob_size(&b)); |
| 134 | 135 | blob_reset(&b); |
| 135 | 136 | gzip_finish(&b); |
| 136 | 137 | blob_write_to_file(&b, zOut); |
| 137 | 138 | blob_reset(&b); |
| 138 | 139 | fossil_free(zOut); |
| 139 | 140 | } |
| 140 | 141 |
| --- src/gzip.c | |
| +++ src/gzip.c | |
| @@ -47,20 +47,21 @@ | |
| 47 | } |
| 48 | |
| 49 | /* |
| 50 | ** Begin constructing a gzip file. |
| 51 | */ |
| 52 | void gzip_begin(void){ |
| 53 | char aHdr[10]; |
| 54 | sqlite3_int64 now; |
| 55 | assert( gzip.eState==0 ); |
| 56 | blob_zero(&gzip.out); |
| 57 | aHdr[0] = 0x1f; |
| 58 | aHdr[1] = 0x8b; |
| 59 | aHdr[2] = 8; |
| 60 | aHdr[3] = 0; |
| 61 | now = db_int64(0, "SELECT (julianday('now') - 2440587.5)*86400.0"); |
| 62 | put32(&aHdr[4], now&0xffffffff); |
| 63 | aHdr[8] = 2; |
| 64 | aHdr[9] = 255; |
| 65 | blob_append(&gzip.out, aHdr, 10); |
| 66 | gzip.iCRC = 0; |
| @@ -125,15 +126,15 @@ | |
| 125 | void test_gzip_cmd(void){ |
| 126 | Blob b; |
| 127 | char *zOut; |
| 128 | if( g.argc!=3 ) usage("FILENAME"); |
| 129 | sqlite3_open(":memory:", &g.db); |
| 130 | gzip_begin(); |
| 131 | blob_read_from_file(&b, g.argv[2]); |
| 132 | zOut = mprintf("%s.gz", g.argv[2]); |
| 133 | gzip_step(blob_buffer(&b), blob_size(&b)); |
| 134 | blob_reset(&b); |
| 135 | gzip_finish(&b); |
| 136 | blob_write_to_file(&b, zOut); |
| 137 | blob_reset(&b); |
| 138 | fossil_free(zOut); |
| 139 | } |
| 140 |
| --- src/gzip.c | |
| +++ src/gzip.c | |
| @@ -47,20 +47,21 @@ | |
| 47 | } |
| 48 | |
| 49 | /* |
| 50 | ** Begin constructing a gzip file. |
| 51 | */ |
| 52 | void gzip_begin(sqlite3_int64 now){ |
| 53 | char aHdr[10]; |
| 54 | assert( gzip.eState==0 ); |
| 55 | blob_zero(&gzip.out); |
| 56 | aHdr[0] = 0x1f; |
| 57 | aHdr[1] = 0x8b; |
| 58 | aHdr[2] = 8; |
| 59 | aHdr[3] = 0; |
| 60 | if( now==0 ){ |
| 61 | now = db_int64(0, "SELECT (julianday('now') - 2440587.5)*86400.0"); |
| 62 | } |
| 63 | put32(&aHdr[4], now&0xffffffff); |
| 64 | aHdr[8] = 2; |
| 65 | aHdr[9] = 255; |
| 66 | blob_append(&gzip.out, aHdr, 10); |
| 67 | gzip.iCRC = 0; |
| @@ -125,15 +126,15 @@ | |
| 126 | void test_gzip_cmd(void){ |
| 127 | Blob b; |
| 128 | char *zOut; |
| 129 | if( g.argc!=3 ) usage("FILENAME"); |
| 130 | sqlite3_open(":memory:", &g.db); |
| 131 | gzip_begin(0); |
| 132 | blob_read_from_file(&b, g.argv[2]); |
| 133 | zOut = mprintf("%s.gz", g.argv[2]); |
| 134 | gzip_step(blob_buffer(&b), blob_size(&b)); |
| 135 | blob_reset(&b); |
| 136 | gzip_finish(&b); |
| 137 | blob_write_to_file(&b, zOut); |
| 138 | blob_reset(&b); |
| 139 | fossil_free(zOut); |
| 140 | } |
| 141 |
+5
-4
| --- src/tar.c | ||
| +++ src/tar.c | ||
| @@ -44,11 +44,11 @@ | ||
| 44 | 44 | /* |
| 45 | 45 | ** Begin the process of generating a tarball. |
| 46 | 46 | ** |
| 47 | 47 | ** Initialize the GZIP compressor and the table of directory names. |
| 48 | 48 | */ |
| 49 | -static void tar_begin(void){ | |
| 49 | +static void tar_begin(sqlite3_int64 mTime){ | |
| 50 | 50 | assert( tball.aHdr==0 ); |
| 51 | 51 | tball.aHdr = fossil_malloc(512+512); |
| 52 | 52 | memset(tball.aHdr, 0, 512+512); |
| 53 | 53 | tball.zSpaces = (char*)&tball.aHdr[512]; |
| 54 | 54 | /* zPrevDir init */ |
| @@ -60,11 +60,11 @@ | ||
| 60 | 60 | memcpy(&tball.aHdr[108], "0000000", 8); /* Owner ID */ |
| 61 | 61 | memcpy(&tball.aHdr[116], "0000000", 8); /* Group ID */ |
| 62 | 62 | memcpy(&tball.aHdr[257], "ustar\00000", 8); /* POSIX.1 format */ |
| 63 | 63 | memcpy(&tball.aHdr[265], "nobody", 7); /* Owner name */ |
| 64 | 64 | memcpy(&tball.aHdr[297], "nobody", 7); /* Group name */ |
| 65 | - gzip_begin(); | |
| 65 | + gzip_begin(mTime); | |
| 66 | 66 | db_multi_exec( |
| 67 | 67 | "CREATE TEMP TABLE dir(name UNIQUE);" |
| 68 | 68 | ); |
| 69 | 69 | } |
| 70 | 70 | |
| @@ -427,11 +427,11 @@ | ||
| 427 | 427 | Blob file; |
| 428 | 428 | if( g.argc<3 ){ |
| 429 | 429 | usage("ARCHIVE FILE...."); |
| 430 | 430 | } |
| 431 | 431 | sqlite3_open(":memory:", &g.db); |
| 432 | - tar_begin(); | |
| 432 | + tar_begin(0); | |
| 433 | 433 | for(i=3; i<g.argc; i++){ |
| 434 | 434 | blob_zero(&file); |
| 435 | 435 | blob_read_from_file(&file, g.argv[i]); |
| 436 | 436 | tar_add_file(g.argv[i], &file, |
| 437 | 437 | file_wd_perm(g.argv[i]), file_wd_mtime(g.argv[i])); |
| @@ -473,20 +473,20 @@ | ||
| 473 | 473 | blob_zero(pTar); |
| 474 | 474 | return; |
| 475 | 475 | } |
| 476 | 476 | blob_zero(&hash); |
| 477 | 477 | blob_zero(&filename); |
| 478 | - tar_begin(); | |
| 479 | 478 | |
| 480 | 479 | if( zDir && zDir[0] ){ |
| 481 | 480 | blob_appendf(&filename, "%s/", zDir); |
| 482 | 481 | } |
| 483 | 482 | nPrefix = blob_size(&filename); |
| 484 | 483 | |
| 485 | 484 | pManifest = manifest_get(rid, CFTYPE_MANIFEST); |
| 486 | 485 | if( pManifest ){ |
| 487 | 486 | mTime = (pManifest->rDate - 2440587.5)*86400.0; |
| 487 | + tar_begin(mTime); | |
| 488 | 488 | if( db_get_boolean("manifest", 0) ){ |
| 489 | 489 | blob_append(&filename, "manifest", -1); |
| 490 | 490 | zName = blob_str(&filename); |
| 491 | 491 | tar_add_file(zName, &mfile, 0, mTime); |
| 492 | 492 | sha1sum_blob(&mfile, &hash); |
| @@ -513,10 +513,11 @@ | ||
| 513 | 513 | }else{ |
| 514 | 514 | sha1sum_blob(&mfile, &hash); |
| 515 | 515 | blob_append(&filename, blob_str(&hash), 16); |
| 516 | 516 | zName = blob_str(&filename); |
| 517 | 517 | mTime = db_int64(0, "SELECT (julianday('now') - 2440587.5)*86400.0;"); |
| 518 | + tar_begin(mTime); | |
| 518 | 519 | tar_add_file(zName, &mfile, 0, mTime); |
| 519 | 520 | } |
| 520 | 521 | manifest_destroy(pManifest); |
| 521 | 522 | blob_reset(&mfile); |
| 522 | 523 | blob_reset(&filename); |
| 523 | 524 |
| --- src/tar.c | |
| +++ src/tar.c | |
| @@ -44,11 +44,11 @@ | |
| 44 | /* |
| 45 | ** Begin the process of generating a tarball. |
| 46 | ** |
| 47 | ** Initialize the GZIP compressor and the table of directory names. |
| 48 | */ |
| 49 | static void tar_begin(void){ |
| 50 | assert( tball.aHdr==0 ); |
| 51 | tball.aHdr = fossil_malloc(512+512); |
| 52 | memset(tball.aHdr, 0, 512+512); |
| 53 | tball.zSpaces = (char*)&tball.aHdr[512]; |
| 54 | /* zPrevDir init */ |
| @@ -60,11 +60,11 @@ | |
| 60 | memcpy(&tball.aHdr[108], "0000000", 8); /* Owner ID */ |
| 61 | memcpy(&tball.aHdr[116], "0000000", 8); /* Group ID */ |
| 62 | memcpy(&tball.aHdr[257], "ustar\00000", 8); /* POSIX.1 format */ |
| 63 | memcpy(&tball.aHdr[265], "nobody", 7); /* Owner name */ |
| 64 | memcpy(&tball.aHdr[297], "nobody", 7); /* Group name */ |
| 65 | gzip_begin(); |
| 66 | db_multi_exec( |
| 67 | "CREATE TEMP TABLE dir(name UNIQUE);" |
| 68 | ); |
| 69 | } |
| 70 | |
| @@ -427,11 +427,11 @@ | |
| 427 | Blob file; |
| 428 | if( g.argc<3 ){ |
| 429 | usage("ARCHIVE FILE...."); |
| 430 | } |
| 431 | sqlite3_open(":memory:", &g.db); |
| 432 | tar_begin(); |
| 433 | for(i=3; i<g.argc; i++){ |
| 434 | blob_zero(&file); |
| 435 | blob_read_from_file(&file, g.argv[i]); |
| 436 | tar_add_file(g.argv[i], &file, |
| 437 | file_wd_perm(g.argv[i]), file_wd_mtime(g.argv[i])); |
| @@ -473,20 +473,20 @@ | |
| 473 | blob_zero(pTar); |
| 474 | return; |
| 475 | } |
| 476 | blob_zero(&hash); |
| 477 | blob_zero(&filename); |
| 478 | tar_begin(); |
| 479 | |
| 480 | if( zDir && zDir[0] ){ |
| 481 | blob_appendf(&filename, "%s/", zDir); |
| 482 | } |
| 483 | nPrefix = blob_size(&filename); |
| 484 | |
| 485 | pManifest = manifest_get(rid, CFTYPE_MANIFEST); |
| 486 | if( pManifest ){ |
| 487 | mTime = (pManifest->rDate - 2440587.5)*86400.0; |
| 488 | if( db_get_boolean("manifest", 0) ){ |
| 489 | blob_append(&filename, "manifest", -1); |
| 490 | zName = blob_str(&filename); |
| 491 | tar_add_file(zName, &mfile, 0, mTime); |
| 492 | sha1sum_blob(&mfile, &hash); |
| @@ -513,10 +513,11 @@ | |
| 513 | }else{ |
| 514 | sha1sum_blob(&mfile, &hash); |
| 515 | blob_append(&filename, blob_str(&hash), 16); |
| 516 | zName = blob_str(&filename); |
| 517 | mTime = db_int64(0, "SELECT (julianday('now') - 2440587.5)*86400.0;"); |
| 518 | tar_add_file(zName, &mfile, 0, mTime); |
| 519 | } |
| 520 | manifest_destroy(pManifest); |
| 521 | blob_reset(&mfile); |
| 522 | blob_reset(&filename); |
| 523 |
| --- src/tar.c | |
| +++ src/tar.c | |
| @@ -44,11 +44,11 @@ | |
| 44 | /* |
| 45 | ** Begin the process of generating a tarball. |
| 46 | ** |
| 47 | ** Initialize the GZIP compressor and the table of directory names. |
| 48 | */ |
| 49 | static void tar_begin(sqlite3_int64 mTime){ |
| 50 | assert( tball.aHdr==0 ); |
| 51 | tball.aHdr = fossil_malloc(512+512); |
| 52 | memset(tball.aHdr, 0, 512+512); |
| 53 | tball.zSpaces = (char*)&tball.aHdr[512]; |
| 54 | /* zPrevDir init */ |
| @@ -60,11 +60,11 @@ | |
| 60 | memcpy(&tball.aHdr[108], "0000000", 8); /* Owner ID */ |
| 61 | memcpy(&tball.aHdr[116], "0000000", 8); /* Group ID */ |
| 62 | memcpy(&tball.aHdr[257], "ustar\00000", 8); /* POSIX.1 format */ |
| 63 | memcpy(&tball.aHdr[265], "nobody", 7); /* Owner name */ |
| 64 | memcpy(&tball.aHdr[297], "nobody", 7); /* Group name */ |
| 65 | gzip_begin(mTime); |
| 66 | db_multi_exec( |
| 67 | "CREATE TEMP TABLE dir(name UNIQUE);" |
| 68 | ); |
| 69 | } |
| 70 | |
| @@ -427,11 +427,11 @@ | |
| 427 | Blob file; |
| 428 | if( g.argc<3 ){ |
| 429 | usage("ARCHIVE FILE...."); |
| 430 | } |
| 431 | sqlite3_open(":memory:", &g.db); |
| 432 | tar_begin(0); |
| 433 | for(i=3; i<g.argc; i++){ |
| 434 | blob_zero(&file); |
| 435 | blob_read_from_file(&file, g.argv[i]); |
| 436 | tar_add_file(g.argv[i], &file, |
| 437 | file_wd_perm(g.argv[i]), file_wd_mtime(g.argv[i])); |
| @@ -473,20 +473,20 @@ | |
| 473 | blob_zero(pTar); |
| 474 | return; |
| 475 | } |
| 476 | blob_zero(&hash); |
| 477 | blob_zero(&filename); |
| 478 | |
| 479 | if( zDir && zDir[0] ){ |
| 480 | blob_appendf(&filename, "%s/", zDir); |
| 481 | } |
| 482 | nPrefix = blob_size(&filename); |
| 483 | |
| 484 | pManifest = manifest_get(rid, CFTYPE_MANIFEST); |
| 485 | if( pManifest ){ |
| 486 | mTime = (pManifest->rDate - 2440587.5)*86400.0; |
| 487 | tar_begin(mTime); |
| 488 | if( db_get_boolean("manifest", 0) ){ |
| 489 | blob_append(&filename, "manifest", -1); |
| 490 | zName = blob_str(&filename); |
| 491 | tar_add_file(zName, &mfile, 0, mTime); |
| 492 | sha1sum_blob(&mfile, &hash); |
| @@ -513,10 +513,11 @@ | |
| 513 | }else{ |
| 514 | sha1sum_blob(&mfile, &hash); |
| 515 | blob_append(&filename, blob_str(&hash), 16); |
| 516 | zName = blob_str(&filename); |
| 517 | mTime = db_int64(0, "SELECT (julianday('now') - 2440587.5)*86400.0;"); |
| 518 | tar_begin(mTime); |
| 519 | tar_add_file(zName, &mfile, 0, mTime); |
| 520 | } |
| 521 | manifest_destroy(pManifest); |
| 522 | blob_reset(&mfile); |
| 523 | blob_reset(&filename); |
| 524 |