X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=debian%2Fpatches%2Frsyncable.diff;h=bf7bde07bc5e58d42841c1f3833531a556ac1d70;hb=96fe9591947fa90f8ffd38c088d43411e055fc1e;hp=e615d984f72ea670151dd7f3511a1defe58fc8b6;hpb=4ee107046a0ffd91f6c60c787326a5e27b799f6d;p=debian%2Fgzip diff --git a/debian/patches/rsyncable.diff b/debian/patches/rsyncable.diff index e615d98..bf7bde0 100644 --- a/debian/patches/rsyncable.diff +++ b/debian/patches/rsyncable.diff @@ -1,5 +1,3 @@ -diff --git a/deflate.c b/deflate.c -index 0950391..1b3ac52 100644 --- a/deflate.c +++ b/deflate.c @@ -131,6 +131,14 @@ @@ -17,8 +15,8 @@ index 0950391..1b3ac52 100644 /* =========================================================================== * Local data used by the "longest match" routines. */ -@@ -212,6 +220,8 @@ local int compr_level; - unsigned near good_match; +@@ -212,6 +220,8 @@ + unsigned good_match; /* Use a faster search when the previous match is longer than this */ +local ulg rsync_sum; /* rolling sum of rsync window */ @@ -26,7 +24,7 @@ index 0950391..1b3ac52 100644 /* Values for max_lazy_match, good_match and max_chain_length, depending on * the desired pack level (0..9). The values given below have been tuned to -@@ -307,6 +317,10 @@ void lm_init (pack_level, flags) +@@ -314,6 +324,10 @@ #endif /* prev will be initialized on the fly */ @@ -37,15 +35,7 @@ index 0950391..1b3ac52 100644 /* Set the default configuration parameters: */ max_lazy_match = configuration_table[pack_level].max_lazy; -@@ -324,6 +338,7 @@ void lm_init (pack_level, flags) - - strstart = 0; - block_start = 0L; -+ rsync_chunk_end = 0xFFFFFFFFUL; - #ifdef ASMV - match_init(); /* initialize the asm code */ - #endif -@@ -543,6 +558,8 @@ local void fill_window() +@@ -550,6 +564,8 @@ memcpy((char*)window, (char*)window+WSIZE, (unsigned)WSIZE); match_start -= WSIZE; strstart -= WSIZE; /* we now have strstart >= MAX_DIST: */ @@ -54,13 +44,11 @@ index 0950391..1b3ac52 100644 block_start -= (long) WSIZE; -@@ -570,6 +587,39 @@ local void fill_window() +@@ -579,13 +595,44 @@ } } -+local void rsync_roll(start, num) -+ unsigned start; -+ unsigned num; ++local void rsync_roll(unsigned start, unsigned num) +{ + unsigned i; + @@ -94,34 +82,58 @@ index 0950391..1b3ac52 100644 /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. -@@ -617,6 +667,7 @@ local off_t deflate_fast() + */ + #define FLUSH_BLOCK(eof) \ + flush_block(block_start >= 0L ? (char*)&window[(unsigned)block_start] : \ +- (char*)NULL, (long)strstart - block_start, (eof)) ++ (char*)NULL, (long)strstart - block_start, flush-1, (eof)) + + /* =========================================================================== + * Processes a new input file and return its compressed length. This +@@ -596,7 +643,7 @@ + local off_t deflate_fast() + { + IPos hash_head; /* head of the hash chain */ +- int flush; /* set if current block must be flushed */ ++ int flush = 0; /* set if current block must be flushed, 2=>and padded */ + unsigned match_length = 0; /* length of best match */ + + prev_length = MIN_MATCH-1; +@@ -626,7 +673,8 @@ lookahead -= match_length; +- /* Insert new strings in the hash table only if the match length + RSYNC_ROLL(strstart, match_length); - /* Insert new strings in the hash table only if the match length ++ /* Insert new strings in the hash table only if the match length * is not too large. This saves time but degrades compression. */ -@@ -645,9 +696,18 @@ local off_t deflate_fast() + if (match_length <= max_insert_length) { +@@ -654,9 +702,14 @@ /* No match, output a literal byte */ Tracevv((stderr,"%c",window[strstart])); flush = ct_tally (0, window[strstart]); + RSYNC_ROLL(strstart, 1); lookahead--; - strstart++; + strstart++; } + if (rsync && strstart > rsync_chunk_end) { -+ ush attr = 0; /* ascii/binary flag */ -+ -+ flush = 1; -+ /* Reset huffman tree */ -+ ct_init(&attr, &method); ++ flush = 2; + rsync_chunk_end = 0xFFFFFFFFUL; + } if (flush) FLUSH_BLOCK(0), block_start = strstart; /* Make sure that we always have enough lookahead, except -@@ -721,6 +781,7 @@ off_t deflate() +@@ -679,7 +732,7 @@ + { + IPos hash_head; /* head of hash chain */ + IPos prev_match; /* previous match */ +- int flush; /* set if current block must be flushed */ ++ int flush = 0; /* set if current block must be flushed */ + int match_available = 0; /* set if previous match exists */ + register unsigned match_length = MIN_MATCH-1; /* length of best match */ + +@@ -730,6 +783,7 @@ */ lookahead -= prev_length-1; prev_length -= 2; @@ -129,19 +141,15 @@ index 0950391..1b3ac52 100644 do { strstart++; INSERT_STRING(strstart, hash_head); -@@ -733,24 +794,51 @@ off_t deflate() +@@ -742,24 +796,38 @@ match_available = 0; match_length = MIN_MATCH-1; strstart++; - if (flush) FLUSH_BLOCK(0), block_start = strstart; + if (rsync && strstart > rsync_chunk_end) { -+ ush attr = 0; /* ascii/binary flag */ -+ -+ /* Reset huffman tree */ -+ ct_init(&attr, &method); + rsync_chunk_end = 0xFFFFFFFFUL; -+ flush = 1; ++ flush = 2; + } + if (flush) FLUSH_BLOCK(0), block_start = strstart; } else if (match_available) { @@ -155,13 +163,8 @@ index 0950391..1b3ac52 100644 - } + flush = ct_tally (0, window[strstart-1]); + if (rsync && strstart > rsync_chunk_end) { -+ ush attr = 0; /* ascii/binary flag */ -+ -+ /* Reset huffman tree */ -+ ct_init(&attr, &method); + rsync_chunk_end = 0xFFFFFFFFUL; -+ -+ flush = 1; ++ flush = 2; + } + if (flush) FLUSH_BLOCK(0), block_start = strstart; + RSYNC_ROLL(strstart, 1); @@ -172,12 +175,8 @@ index 0950391..1b3ac52 100644 * the next step to decide. */ + if (rsync && strstart > rsync_chunk_end) { -+ ush attr = 0; /* ascii/binary flag */ -+ -+ /* Reset huffman tree */ -+ ct_init(&attr, &method); + rsync_chunk_end = 0xFFFFFFFFUL; -+ ++ flush = 2; + FLUSH_BLOCK(0), block_start = strstart; + } match_available = 1; @@ -185,30 +184,34 @@ index 0950391..1b3ac52 100644 strstart++; lookahead--; } -diff --git a/doc/gzip.texi b/doc/gzip.texi -index a6009d2..84887c3 100644 --- a/doc/gzip.texi +++ b/doc/gzip.texi -@@ -353,6 +353,14 @@ specified on the command line are directories, @command{gzip} will descend +@@ -208,6 +208,7 @@ + -V, --version display version number + -1, --fast compress faster + -9, --best compress better ++ --rsyncable Make rsync-friendly archive + + With no FILE, or when FILE is -, read standard input. + +@@ -358,6 +359,14 @@ into the directory and compress all the files it finds there (or decompress them in the case of @command{gunzip}). +@item --rsyncable -+While compressing, synchronize the output occasionally based on the -+input. This can reduce the compression slightly in some cases, but -+means that the @code{rsync} program can take advantage of similarities -+in the uncompressed input when syncronizing two files compressed with -+this flag. @code{gunzip} cannot tell the difference between a -+compressed file created with this option, and one created without it. ++While compressing, synchronize the output occasionally based on ++the input. This increases size by less than 1 percent most ++cases, but means that the @command{rsync} program can much more efficiently ++synchronize files compressed with this flag. @command{gunzip} ++cannot tell the difference between a compressed file created ++with this option, and one created without it. + @item --suffix @var{suf} @itemx -S @var{suf} Use suffix @var{suf} instead of @samp{.gz}. Any suffix can be -diff --git a/gzip.c b/gzip.c -index 9e2a890..b867350 100644 --- a/gzip.c +++ b/gzip.c -@@ -218,6 +218,7 @@ int ofd; /* output file descriptor */ +@@ -215,6 +215,7 @@ unsigned insize; /* valid bytes in inbuf */ unsigned inptr; /* index of next byte to be processed in inbuf */ unsigned outcnt; /* bytes in output buffer */ @@ -216,15 +219,16 @@ index 9e2a890..b867350 100644 static int handled_sig[] = { -@@ -271,6 +272,7 @@ struct option longopts[] = +@@ -275,7 +276,7 @@ {"best", 0, 0, '9'}, /* compress better */ {"lzw", 0, 0, 'Z'}, /* make output compatible with old compress */ {"bits", 1, 0, 'b'}, /* max number of bits per code (implies -Z) */ +- + {"rsyncable", 0, 0, 'R'}, /* make rsync-friendly archive */ { 0, 0, 0, 0 } }; -@@ -352,6 +354,7 @@ local void help() +@@ -359,6 +360,7 @@ " -Z, --lzw produce output compatible with old compress", " -b, --bits=BITS max number of bits per code (implies -Z)", #endif @@ -232,21 +236,23 @@ index 9e2a890..b867350 100644 "", "With no FILE, or when FILE is -, read standard input.", "", -@@ -479,6 +482,9 @@ int main (int argc, char **argv) - recursive = 1; +@@ -489,8 +491,11 @@ + #else + recursive = 1; #endif - break; +- break; +- case 'S': ++ break; + case 'R': + rsync = 1; break; + - case 'S': ++ case 'S': #ifdef NO_MULTIPLE_DOTS if (*optarg == '.') optarg++; -diff --git a/gzip.h b/gzip.h -index 0c3dd68..5270c56 100644 + #endif --- a/gzip.h +++ b/gzip.h -@@ -146,6 +146,7 @@ EXTERN(uch, window); /* Sliding window and suffix table (unlzw) */ +@@ -140,6 +140,7 @@ extern unsigned insize; /* valid bytes in inbuf */ extern unsigned inptr; /* index of next byte to be processed in inbuf */ extern unsigned outcnt; /* bytes in output buffer */ @@ -254,30 +260,64 @@ index 0c3dd68..5270c56 100644 extern off_t bytes_in; /* number of input bytes */ extern off_t bytes_out; /* number of output bytes */ -diff --git a/doc/gzip.texi b/doc/gzip.texi -index 84887c3..ecd4e00 100644 ---- a/doc/gzip.texi -+++ b/doc/gzip.texi -@@ -207,6 +207,7 @@ Mandatory arguments to long options are mandatory for short options too. - -V, --version display version number - -1, --fast compress faster - -9, --best compress better -+ --rsyncable Make rsync-friendly archive +@@ -287,7 +288,7 @@ + /* in trees.c */ + extern void ct_init (ush *attr, int *method); + extern int ct_tally (int dist, int lc); +-extern off_t flush_block (char *buf, ulg stored_len, int eof); ++extern off_t flush_block (char *buf, ulg stored_len, int pad, int eof); - With no FILE, or when FILE is -, read standard input. - -@@ -361,6 +362,14 @@ in the uncompressed input when syncronizing two files compressed with - this flag. @code{gunzip} cannot tell the difference between a - compressed file created with this option, and one created without it. + /* in bits.c */ + extern void bi_init (file_t zipfile); +--- a/gzip.1 ++++ b/gzip.1 +@@ -5,6 +5,7 @@ + .ll +8 + .B gzip + .RB [ " \-acdfhklLnNrtvV19 " ] ++.RB [ --rsyncable ] + .RB [ \-S\ suffix ] + [ + .I "name \&..." +@@ -287,6 +288,16 @@ + .I gunzip + ). + .TP ++.B --rsyncable ++While compressing, synchronize the output occasionally based on the input. ++This increases size by less than 1 percent most cases, but means that the ++.BR rsync (1) ++program can take advantage of similarities in the uncompressed input ++when syncronizing two files compressed with this flag. ++.I gunzip ++cannot tell the difference between a compressed file created with this option, ++and one created without it. ++.TP + .B \-S .suf --suffix .suf + When compressing, use suffix .suf instead of .gz. + Any non-empty suffix can be given, but suffixes +--- a/trees.c ++++ b/trees.c +@@ -856,9 +856,10 @@ + * trees or store, and output the encoded block to the zip file. This function + * returns the total compressed length for the file so far. + */ +-off_t flush_block(buf, stored_len, eof) ++off_t flush_block(buf, stored_len, pad, eof) + char *buf; /* input block, or NULL if too old */ + ulg stored_len; /* length of input block */ ++ int pad; /* pad output to byte boundary */ + int eof; /* true if this is the last block for a file */ + { + ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ +@@ -951,6 +952,10 @@ + Assert (input_len == bytes_in, "bad input size"); + bi_windup(); + compressed_len += 7; /* align on byte boundary */ ++ } else if (pad && (compressed_len % 8) != 0) { ++ send_bits((STORED_BLOCK<<1)+eof, 3); /* send block type */ ++ compressed_len = (compressed_len + 3 + 7) & ~7L; ++ copy_block(buf, 0, 1); /* with header */ + } -+@item --rsyncable -+While compressing, synchronize the output occasionally based on -+the input. This increases size by less than 1 percent most -+cases, but means that the @command{rsync} program can much more efficiently -+synchronize files compressed with this flag. @command{gunzip} -+cannot tell the difference between a compressed file created -+with this option, and one created without it. -+ - @item --suffix @var{suf} - @itemx -S @var{suf} - Use suffix @var{suf} instead of @samp{.gz}. Any suffix can be + return compressed_len >> 3;