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.

drh 2011-09-28 11:35 trunk
Commit 3e141b792c689c08baffdaac4f62a6faa08b84c5
2 files changed +5 -4 +5 -4
+5 -4
--- src/gzip.c
+++ src/gzip.c
@@ -47,20 +47,21 @@
4747
}
4848
4949
/*
5050
** Begin constructing a gzip file.
5151
*/
52
-void gzip_begin(void){
52
+void gzip_begin(sqlite3_int64 now){
5353
char aHdr[10];
54
- sqlite3_int64 now;
5554
assert( gzip.eState==0 );
5655
blob_zero(&gzip.out);
5756
aHdr[0] = 0x1f;
5857
aHdr[1] = 0x8b;
5958
aHdr[2] = 8;
6059
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
+ }
6263
put32(&aHdr[4], now&0xffffffff);
6364
aHdr[8] = 2;
6465
aHdr[9] = 255;
6566
blob_append(&gzip.out, aHdr, 10);
6667
gzip.iCRC = 0;
@@ -125,15 +126,15 @@
125126
void test_gzip_cmd(void){
126127
Blob b;
127128
char *zOut;
128129
if( g.argc!=3 ) usage("FILENAME");
129130
sqlite3_open(":memory:", &g.db);
130
- gzip_begin();
131
+ gzip_begin(0);
131132
blob_read_from_file(&b, g.argv[2]);
132133
zOut = mprintf("%s.gz", g.argv[2]);
133134
gzip_step(blob_buffer(&b), blob_size(&b));
134135
blob_reset(&b);
135136
gzip_finish(&b);
136137
blob_write_to_file(&b, zOut);
137138
blob_reset(&b);
138139
fossil_free(zOut);
139140
}
140141
--- 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 @@
4444
/*
4545
** Begin the process of generating a tarball.
4646
**
4747
** Initialize the GZIP compressor and the table of directory names.
4848
*/
49
-static void tar_begin(void){
49
+static void tar_begin(sqlite3_int64 mTime){
5050
assert( tball.aHdr==0 );
5151
tball.aHdr = fossil_malloc(512+512);
5252
memset(tball.aHdr, 0, 512+512);
5353
tball.zSpaces = (char*)&tball.aHdr[512];
5454
/* zPrevDir init */
@@ -60,11 +60,11 @@
6060
memcpy(&tball.aHdr[108], "0000000", 8); /* Owner ID */
6161
memcpy(&tball.aHdr[116], "0000000", 8); /* Group ID */
6262
memcpy(&tball.aHdr[257], "ustar\00000", 8); /* POSIX.1 format */
6363
memcpy(&tball.aHdr[265], "nobody", 7); /* Owner name */
6464
memcpy(&tball.aHdr[297], "nobody", 7); /* Group name */
65
- gzip_begin();
65
+ gzip_begin(mTime);
6666
db_multi_exec(
6767
"CREATE TEMP TABLE dir(name UNIQUE);"
6868
);
6969
}
7070
@@ -427,11 +427,11 @@
427427
Blob file;
428428
if( g.argc<3 ){
429429
usage("ARCHIVE FILE....");
430430
}
431431
sqlite3_open(":memory:", &g.db);
432
- tar_begin();
432
+ tar_begin(0);
433433
for(i=3; i<g.argc; i++){
434434
blob_zero(&file);
435435
blob_read_from_file(&file, g.argv[i]);
436436
tar_add_file(g.argv[i], &file,
437437
file_wd_perm(g.argv[i]), file_wd_mtime(g.argv[i]));
@@ -473,20 +473,20 @@
473473
blob_zero(pTar);
474474
return;
475475
}
476476
blob_zero(&hash);
477477
blob_zero(&filename);
478
- tar_begin();
479478
480479
if( zDir && zDir[0] ){
481480
blob_appendf(&filename, "%s/", zDir);
482481
}
483482
nPrefix = blob_size(&filename);
484483
485484
pManifest = manifest_get(rid, CFTYPE_MANIFEST);
486485
if( pManifest ){
487486
mTime = (pManifest->rDate - 2440587.5)*86400.0;
487
+ tar_begin(mTime);
488488
if( db_get_boolean("manifest", 0) ){
489489
blob_append(&filename, "manifest", -1);
490490
zName = blob_str(&filename);
491491
tar_add_file(zName, &mfile, 0, mTime);
492492
sha1sum_blob(&mfile, &hash);
@@ -513,10 +513,11 @@
513513
}else{
514514
sha1sum_blob(&mfile, &hash);
515515
blob_append(&filename, blob_str(&hash), 16);
516516
zName = blob_str(&filename);
517517
mTime = db_int64(0, "SELECT (julianday('now') - 2440587.5)*86400.0;");
518
+ tar_begin(mTime);
518519
tar_add_file(zName, &mfile, 0, mTime);
519520
}
520521
manifest_destroy(pManifest);
521522
blob_reset(&mfile);
522523
blob_reset(&filename);
523524
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button