From 1bbb35416d8da71e8146a4cb4f2dbab7b24cff39 Mon Sep 17 00:00:00 2001 From: Bdale Garbee Date: Wed, 25 Dec 2013 15:48:58 -0700 Subject: [PATCH] updated rsyncable patch --- debian/changelog | 3 +- debian/patches/rsyncable.diff | 162 ++++++++++++++++++---------------- deflate.c | 36 ++------ doc/gzip.texi | 16 ---- gzip.h | 2 +- trees.c | 7 +- 6 files changed, 104 insertions(+), 122 deletions(-) diff --git a/debian/changelog b/debian/changelog index b8ec23c..f96cdc4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,9 @@ gzip (1.6-3) UNRELEASED; urgency=low * add a comment to the lintian overrides explaining them + * updated rsyncable patch from Alexander Inyukhin, closesL #708423 - -- Bdale Garbee Tue, 01 Oct 2013 15:27:38 -0600 + -- Bdale Garbee Wed, 25 Dec 2013 15:30:55 -0700 gzip (1.6-2) unstable; urgency=low diff --git a/debian/patches/rsyncable.diff b/debian/patches/rsyncable.diff index c2eb379..bf7bde0 100644 --- a/debian/patches/rsyncable.diff +++ b/debian/patches/rsyncable.diff @@ -1,6 +1,5 @@ -diff -u -r gzip-1.5/deflate.c /home/bdale/debian/gzip/deflate.c ---- gzip-1.5/deflate.c 2012-04-24 10:25:28.000000000 -0600 -+++ /home/bdale/debian/gzip/deflate.c 2012-06-19 14:01:41.885498670 -0600 +--- a/deflate.c ++++ b/deflate.c @@ -131,6 +131,14 @@ #endif /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ @@ -36,15 +35,7 @@ diff -u -r gzip-1.5/deflate.c /home/bdale/debian/gzip/deflate.c /* Set the default configuration parameters: */ max_lazy_match = configuration_table[pack_level].max_lazy; -@@ -331,6 +345,7 @@ - - strstart = 0; - block_start = 0L; -+ rsync_chunk_end = 0xFFFFFFFFUL; - #ifdef ASMV - match_init(); /* initialize the asm code */ - #endif -@@ -550,6 +565,8 @@ +@@ -550,6 +564,8 @@ memcpy((char*)window, (char*)window+WSIZE, (unsigned)WSIZE); match_start -= WSIZE; strstart -= WSIZE; /* we now have strstart >= MAX_DIST: */ @@ -53,13 +44,11 @@ diff -u -r gzip-1.5/deflate.c /home/bdale/debian/gzip/deflate.c block_start -= (long) WSIZE; -@@ -579,6 +596,39 @@ +@@ -579,13 +595,44 @@ } } -+local void rsync_roll(start, num) -+ unsigned start; -+ unsigned num; ++local void rsync_roll(unsigned start, unsigned num) +{ + unsigned i; + @@ -93,7 +82,24 @@ diff -u -r gzip-1.5/deflate.c /home/bdale/debian/gzip/deflate.c /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. -@@ -626,7 +676,8 @@ + */ + #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; @@ -103,7 +109,7 @@ diff -u -r gzip-1.5/deflate.c /home/bdale/debian/gzip/deflate.c * is not too large. This saves time but degrades compression. */ if (match_length <= max_insert_length) { -@@ -654,9 +705,18 @@ +@@ -654,9 +702,14 @@ /* No match, output a literal byte */ Tracevv((stderr,"%c",window[strstart])); flush = ct_tally (0, window[strstart]); @@ -112,17 +118,22 @@ diff -u -r gzip-1.5/deflate.c /home/bdale/debian/gzip/deflate.c 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 -@@ -730,6 +790,7 @@ +@@ -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; @@ -130,19 +141,15 @@ diff -u -r gzip-1.5/deflate.c /home/bdale/debian/gzip/deflate.c do { strstart++; INSERT_STRING(strstart, hash_head); -@@ -742,24 +803,51 @@ +@@ -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) { @@ -156,13 +163,8 @@ diff -u -r gzip-1.5/deflate.c /home/bdale/debian/gzip/deflate.c - } + 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); @@ -173,12 +175,8 @@ diff -u -r gzip-1.5/deflate.c /home/bdale/debian/gzip/deflate.c * 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; @@ -186,10 +184,9 @@ diff -u -r gzip-1.5/deflate.c /home/bdale/debian/gzip/deflate.c strstart++; lookahead--; } -diff -u -r gzip-1.5/doc/gzip.texi /home/bdale/debian/gzip/doc/gzip.texi ---- gzip-1.5/doc/gzip.texi 2012-01-01 01:53:58.000000000 -0700 -+++ /home/bdale/debian/gzip/doc/gzip.texi 2012-06-19 14:09:36.041559612 -0600 -@@ -207,6 +207,7 @@ +--- a/doc/gzip.texi ++++ b/doc/gzip.texi +@@ -208,6 +208,7 @@ -V, --version display version number -1, --fast compress faster -9, --best compress better @@ -197,18 +194,10 @@ diff -u -r gzip-1.5/doc/gzip.texi /home/bdale/debian/gzip/doc/gzip.texi With no FILE, or when FILE is -, read standard input. -@@ -353,6 +354,30 @@ +@@ -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. -+ +@item --rsyncable +While compressing, synchronize the output occasionally based on +the input. This increases size by less than 1 percent most @@ -216,21 +205,13 @@ diff -u -r gzip-1.5/doc/gzip.texi /home/bdale/debian/gzip/doc/gzip.texi +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 --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. + @item --suffix @var{suf} @itemx -S @var{suf} Use suffix @var{suf} instead of @samp{.gz}. Any suffix can be ---- gzip-1.5/gzip.c 2012-04-24 10:25:28.000000000 -0600 -+++ /home/bdale/debian/gzip/gzip.c 2012-06-19 14:00:43.283873180 -0600 -@@ -213,6 +213,7 @@ +--- a/gzip.c ++++ b/gzip.c +@@ -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 */ @@ -238,7 +219,7 @@ diff -u -r gzip-1.5/doc/gzip.texi /home/bdale/debian/gzip/doc/gzip.texi static int handled_sig[] = { -@@ -270,7 +271,7 @@ +@@ -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) */ @@ -247,7 +228,7 @@ diff -u -r gzip-1.5/doc/gzip.texi /home/bdale/debian/gzip/doc/gzip.texi { 0, 0, 0, 0 } }; -@@ -353,6 +354,7 @@ +@@ -359,6 +360,7 @@ " -Z, --lzw produce output compatible with old compress", " -b, --bits=BITS max number of bits per code (implies -Z)", #endif @@ -255,7 +236,7 @@ diff -u -r gzip-1.5/doc/gzip.texi /home/bdale/debian/gzip/doc/gzip.texi "", "With no FILE, or when FILE is -, read standard input.", "", -@@ -481,8 +483,11 @@ +@@ -489,8 +491,11 @@ #else recursive = 1; #endif @@ -269,9 +250,8 @@ diff -u -r gzip-1.5/doc/gzip.texi /home/bdale/debian/gzip/doc/gzip.texi #ifdef NO_MULTIPLE_DOTS if (*optarg == '.') optarg++; #endif -diff -u -r gzip-1.5/gzip.h /home/bdale/debian/gzip/gzip.h ---- gzip-1.5/gzip.h 2012-01-01 01:53:58.000000000 -0700 -+++ /home/bdale/debian/gzip/gzip.h 2012-06-19 13:57:36.833883093 -0600 +--- a/gzip.h ++++ b/gzip.h @@ -140,6 +140,7 @@ extern unsigned insize; /* valid bytes in inbuf */ extern unsigned inptr; /* index of next byte to be processed in inbuf */ @@ -280,11 +260,18 @@ diff -u -r gzip-1.5/gzip.h /home/bdale/debian/gzip/gzip.h extern off_t bytes_in; /* number of input bytes */ extern off_t bytes_out; /* number of output bytes */ -diff --git a/gzip.1 b/gzip.1 -index 71e097c..faee860 100644 +@@ -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); + + /* in bits.c */ + extern void bi_init (file_t zipfile); --- a/gzip.1 +++ b/gzip.1 -@@ -5,6 +5,7 @@ gzip, gunzip, zcat \- compress or expand files +@@ -5,6 +5,7 @@ .ll +8 .B gzip .RB [ " \-acdfhklLnNrtvV19 " ] @@ -292,7 +279,7 @@ index 71e097c..faee860 100644 .RB [ \-S\ suffix ] [ .I "name \&..." -@@ -287,6 +288,16 @@ will descend into the directory and compress all the files it finds there +@@ -287,6 +288,16 @@ .I gunzip ). .TP @@ -309,3 +296,28 @@ index 71e097c..faee860 100644 .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 */ + } + + return compressed_len >> 3; diff --git a/deflate.c b/deflate.c index 8e539d2..bb8a749 100644 --- a/deflate.c +++ b/deflate.c @@ -345,7 +345,6 @@ void lm_init (pack_level, flags) strstart = 0; block_start = 0L; - rsync_chunk_end = 0xFFFFFFFFUL; #ifdef ASMV match_init(); /* initialize the asm code */ #endif @@ -596,9 +595,7 @@ local void fill_window() } } -local void rsync_roll(start, num) - unsigned start; - unsigned num; +local void rsync_roll(unsigned start, unsigned num) { unsigned i; @@ -635,7 +632,7 @@ local void rsync_roll(start, num) */ #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 @@ -646,7 +643,7 @@ local void rsync_roll(start, num) 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; @@ -710,11 +707,7 @@ local off_t deflate_fast() 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; @@ -739,7 +732,7 @@ off_t deflate() { 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 */ @@ -805,12 +798,8 @@ off_t deflate() 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) { @@ -821,13 +810,8 @@ off_t deflate() Tracevv((stderr,"%c",window[strstart-1])); 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); @@ -838,12 +822,8 @@ off_t deflate() * 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; diff --git a/doc/gzip.texi b/doc/gzip.texi index 7ff37ad..cf0ec6c 100644 --- a/doc/gzip.texi +++ b/doc/gzip.texi @@ -359,14 +359,6 @@ specified on the command line are directories, @command{gzip} will descend 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. - @item --rsyncable While compressing, synchronize the output occasionally based on the input. This increases size by less than 1 percent most @@ -375,14 +367,6 @@ 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 --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. - @item --suffix @var{suf} @itemx -S @var{suf} Use suffix @var{suf} instead of @samp{.gz}. Any suffix can be diff --git a/gzip.h b/gzip.h index 70ccaa9..6d6e323 100644 --- a/gzip.h +++ b/gzip.h @@ -288,7 +288,7 @@ extern off_t deflate (void); /* 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); /* in bits.c */ extern void bi_init (file_t zipfile); diff --git a/trees.c b/trees.c index f2ad360..1e1a2ca 100644 --- a/trees.c +++ b/trees.c @@ -856,9 +856,10 @@ local void send_all_trees(lcodes, dcodes, blcodes) * 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 @@ off_t flush_block(buf, stored_len, eof) 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 */ } return compressed_len >> 3; -- 2.30.2