[linux] 03/03: debian/bin/genorig.py: Make orig tarballs reproducible

debian-kernel at lists.debian.org debian-kernel at lists.debian.org
Sat Aug 29 22:59:47 UTC 2015


This is an automated email from the git hooks/post-receive script.

benh pushed a commit to branch master
in repository linux.

commit 44ea8344d64e39323dfbad7f81c3aa229214b9e1
Author: Ben Hutchings <ben at decadent.org.uk>
Date:   Sat Aug 29 23:56:25 2015 +0100

    debian/bin/genorig.py: Make orig tarballs reproducible
    
    Sort the tarball contents and set their mtimes to the upstream
    release time.  (In case we're given a tarball and patch, the
    release time is unknown and the result is not reproducible.  So
    don't do that.)
---
 debian/bin/genorig.py | 23 +++++++++++++++++++----
 debian/changelog      |  1 +
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/debian/bin/genorig.py b/debian/bin/genorig.py
index 779690d..b83f31c 100755
--- a/debian/bin/genorig.py
+++ b/debian/bin/genorig.py
@@ -8,6 +8,7 @@ import os.path
 import re
 import shutil
 import subprocess
+import time
 
 from debian_linux.debian import Changelog, VersionLinux
 from debian_linux.patches import PatchSeries
@@ -46,8 +47,19 @@ class Main(object):
                 self.upstream_extract(self.input_files[0])
             if len(self.input_files) > 1:
                 self.upstream_patch(self.input_files[1])
+
+            # debian_patch() will change file mtimes.  Capture the
+            # original release time so we can apply it to the final
+            # tarball.  Note this doesn't work in case we apply an
+            # upstream patch, as that doesn't carry a release time.
+            orig_date = time.strftime(
+                "%a, %d %b %Y %H:%M:%S +0000",
+                time.gmtime(
+                    os.stat(os.path.join(self.dir, self.orig, 'Makefile'))
+                    .st_mtime))
+
             self.debian_patch()
-            self.tar()
+            self.tar(orig_date)
         finally:
             shutil.rmtree(self.dir)
 
@@ -105,7 +117,7 @@ class Main(object):
         series = PatchSeries(name, "debian/patches", fp)
         series(dir=os.path.join(self.dir, self.orig))
 
-    def tar(self):
+    def tar(self, orig_date):
         out = os.path.join("../orig", self.orig_tar)
         try:
             os.mkdir("../orig")
@@ -117,9 +129,12 @@ class Main(object):
         except OSError:
             pass
         self.log("Generate tarball %s\n" % out)
-        cmdline = ['tar -caf', out, '-C', self.dir, self.orig]
+        cmdline = '''(cd '%s' && find '%s' -print0) |
+                     LC_ALL=C sort -z |
+                     tar -C '%s' --no-recursion --null -T - --mtime '%s' -caf '%s'
+                  ''' % (self.dir, self.orig, self.dir, orig_date, out)
         try:
-            if os.spawnv(os.P_WAIT, '/bin/sh', ['sh', '-c', ' '.join(cmdline)]):
+            if os.spawnv(os.P_WAIT, '/bin/sh', ['sh', '-c', cmdline]):
                 raise RuntimeError("Can't patch source")
             os.chmod(out, 0o644)
         except:
diff --git a/debian/changelog b/debian/changelog
index 11fe701..4a3b203 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -15,6 +15,7 @@ linux (4.2~rc8-1~exp2) UNRELEASED; urgency=medium
   * Fix last issue that prevents a reproducible build (Closes: #769844):
     - DocBook: Use a fixed encoding for output
   * debian/bin,debian/control,debian/lib/python: Use Python 3
+  * debian/bin/genorig.py: Make orig tarballs reproducible
 
  -- Ben Hutchings <ben at decadent.org.uk>  Tue, 25 Aug 2015 18:50:57 +0100
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/kernel/linux.git



More information about the Kernel-svn-changes mailing list