[Rpm-metadata] [PATCH] Exclude filename from .gz files

Dennis Gregorovic dgregor at redhat.com
Wed Nov 30 11:45:11 UTC 2011


A quick test on my local machine confirms that this patch does the
trick.

# createrepo .
# cd repodata/
# sha1sum other.xml.gz 
1eb13a25318339d9e8157f0bf80419c019fa5000  other.xml.gz
# gunzip other.xml.gz 
# gzip -9 -n other.xml 
# sha1sum other.xml.gz 
1eb13a25318339d9e8157f0bf80419c019fa5000  other.xml.gz

-- Dennis

On Tue, 2011-11-29 at 04:58 -0500, Elia Pinto wrote:
> From: Elia Pinto <yersinia.spiros at gmail.com>
> 
> When you run createrepo, the original filenames,
> including full path, of the files are stored
> in the header of the .gz metadata
> 
> The path becomes part of the checksum of the gzip file
> itself.  So, if you gunzip the file and re-gzip it,
> you get a different checksum.
> 
> Based on the original observation of Dennis Gregorovic
> ---
>  createrepo/utils.py |   20 ++++++--------------
>  1 files changed, 6 insertions(+), 14 deletions(-)
> 
> diff --git a/createrepo/utils.py b/createrepo/utils.py
> index c5cec64..d52d070 100644
> --- a/createrepo/utils.py
> +++ b/createrepo/utils.py
> @@ -40,22 +40,14 @@ def _(args):
>  
>  class GzipFile(gzip.GzipFile):
>      def _write_gzip_header(self):
> +        # Generate a header that is easily reproduced with gzip -9 -n on
> +        # an unix-like system
>          self.fileobj.write('\037\213')             # magic header
>          self.fileobj.write('\010')                 # compression method
> -        if hasattr(self, 'name'):
> -            fname = self.name[:-3]
> -        else:
> -            fname = self.filename[:-3]
> -        flags = 0
> -        if fname:
> -            flags = FNAME
> -        self.fileobj.write(chr(flags))
> -        write32u(self.fileobj, long(0))
> -        self.fileobj.write('\002')
> -        self.fileobj.write('\377')
> -        if fname:
> -            self.fileobj.write(fname + '\000')
> -
> +        self.fileobj.write('\000')                 # flags
> +        write32u(self.fileobj, long(0))            # timestamp
> +        self.fileobj.write('\002')                 # max compression
> +        self.fileobj.write('\003')                 # UNIX
>  
>  def _gzipOpen(filename, mode="rb", compresslevel=9):
>      return GzipFile(filename, mode, compresslevel)




More information about the Rpm-metadata mailing list