Source: weather-util
Version: 2.4-1
Severity: wishlist
Tags: patch
User: reproducible-bui...@lists.alioth.debian.org
Usertags: timestamps
X-Debbugs-Cc: reproducible-b...@lists.alioth.debian.org

Hi,

Whilst working on the Reproducible Builds effort [0] we noticed that
weather-util could not be built reproducibly.

This is because it embedded:

 a) The current build date, varying on the timezone of the build
    server.

 b) Timestamps of existing filenames, also varying on the timezone of
    the build server.

Patch attached that fixes both issues.

 [0] https://reproducible-builds.org/


Regards,

--
      ,''`.
     : :'  :     Chris Lamb
     `. `'`      la...@debian.org / chris-lamb.co.uk
       `-
--- a/debian/patches/reproducible-build.patch   1970-01-01 01:00:00.000000000 
+0100
--- b/debian/patches/reproducible-build.patch   2020-07-09 15:22:07.073550632 
+0100
@@ -0,0 +1,74 @@
+Description: Make the build reproducible
+Author: Chris Lamb <la...@debian.org>
+Last-Update: 2020-07-09
+
+--- weather-util-2.4.orig/weather.py
++++ weather-util-2.4/weather.py
+@@ -1268,56 +1268,56 @@ def correlate():
+         weather_copyright,
+         os.path.basename( sys.argv[0] ),
+         datetime.date.isoformat(
+-            datetime.datetime.fromtimestamp( time.time() )
++            datetime.datetime.utcfromtimestamp( 
int(os.environ.get('SOURCE_DATE_EPOCH', time.time())) )
+         ),
+         hashlib.md5( open(gcounties_an, "rb").read() ).hexdigest(),
+         datetime.date.isoformat(
+-            datetime.datetime.fromtimestamp( os.path.getmtime(gcounties_an) )
++            datetime.datetime.utcfromtimestamp( 
os.path.getmtime(gcounties_an) )
+         ),
+         gcounties_an,
+         hashlib.md5( open(gcousubs_an, "rb").read() ).hexdigest(),
+         datetime.date.isoformat(
+-            datetime.datetime.fromtimestamp( os.path.getmtime(gcousubs_an) )
++            datetime.datetime.utcfromtimestamp( os.path.getmtime(gcousubs_an) 
)
+         ),
+         gcousubs_an,
+         hashlib.md5( open(gplace_an, "rb").read() ).hexdigest(),
+         datetime.date.isoformat(
+-            datetime.datetime.fromtimestamp( os.path.getmtime(gplace_an) )
++            datetime.datetime.utcfromtimestamp( os.path.getmtime(gplace_an) )
+         ),
+         gplace_an,
+         hashlib.md5( open(gzcta_an, "rb").read() ).hexdigest(),
+         datetime.date.isoformat(
+-            datetime.datetime.fromtimestamp( os.path.getmtime(gzcta_an) )
++            datetime.datetime.utcfromtimestamp( os.path.getmtime(gzcta_an) )
+         ),
+         gzcta_an,
+         hashlib.md5( open(cpfzcf_fn, "rb").read() ).hexdigest(),
+         datetime.date.isoformat(
+-            datetime.datetime.fromtimestamp( os.path.getmtime(cpfzcf_fn) )
++            datetime.datetime.utcfromtimestamp( os.path.getmtime(cpfzcf_fn) )
+         ),
+         cpfzcf_fn,
+         hashlib.md5( open(nsdcccc_fn, "rb").read() ).hexdigest(),
+         datetime.date.isoformat(
+-            datetime.datetime.fromtimestamp( os.path.getmtime(nsdcccc_fn) )
++            datetime.datetime.utcfromtimestamp( os.path.getmtime(nsdcccc_fn) )
+         ),
+         nsdcccc_fn,
+         hashlib.md5( open(ourairports_fn, "rb").read() ).hexdigest(),
+         datetime.date.isoformat(
+-            datetime.datetime.fromtimestamp( os.path.getmtime(ourairports_fn) 
)
++            datetime.datetime.utcfromtimestamp( 
os.path.getmtime(ourairports_fn) )
+         ),
+         ourairports_fn,
+         hashlib.md5( open(overrides_fn, "rb").read() ).hexdigest(),
+         datetime.date.isoformat(
+-            datetime.datetime.fromtimestamp( os.path.getmtime(overrides_fn) )
++            datetime.datetime.utcfromtimestamp( 
os.path.getmtime(overrides_fn) )
+         ),
+         overrides_fn,
+         hashlib.md5( open(slist_fn, "rb").read() ).hexdigest(),
+         datetime.date.isoformat(
+-            datetime.datetime.fromtimestamp( os.path.getmtime(slist_fn) )
++            datetime.datetime.utcfromtimestamp( os.path.getmtime(slist_fn) )
+         ),
+         slist_fn,
+         hashlib.md5( open(zlist_fn, "rb").read() ).hexdigest(),
+         datetime.date.isoformat(
+-            datetime.datetime.fromtimestamp( os.path.getmtime(zlist_fn) )
++            datetime.datetime.utcfromtimestamp( os.path.getmtime(zlist_fn) )
+         ),
+         zlist_fn
+     )
--- a/debian/patches/series     2020-07-09 12:08:21.283653753 +0100
--- b/debian/patches/series     2020-07-09 12:26:27.908128181 +0100
@@ -1,2 +1,3 @@
 fhs.patch
 pypath.patch
+reproducible-build.patch
--- a/weather.py        2020-07-09 12:08:21.263653502 +0100
--- b/weather.py        2020-07-09 15:22:05.169514142 +0100
@@ -1268,56 +1268,56 @@
         weather_copyright,
         os.path.basename( sys.argv[0] ),
         datetime.date.isoformat(
-            datetime.datetime.fromtimestamp( time.time() )
+            datetime.datetime.utcfromtimestamp( 
int(os.environ.get('SOURCE_DATE_EPOCH', time.time())) )
         ),
         hashlib.md5( open(gcounties_an, "rb").read() ).hexdigest(),
         datetime.date.isoformat(
-            datetime.datetime.fromtimestamp( os.path.getmtime(gcounties_an) )
+            datetime.datetime.utcfromtimestamp( os.path.getmtime(gcounties_an) 
)
         ),
         gcounties_an,
         hashlib.md5( open(gcousubs_an, "rb").read() ).hexdigest(),
         datetime.date.isoformat(
-            datetime.datetime.fromtimestamp( os.path.getmtime(gcousubs_an) )
+            datetime.datetime.utcfromtimestamp( os.path.getmtime(gcousubs_an) )
         ),
         gcousubs_an,
         hashlib.md5( open(gplace_an, "rb").read() ).hexdigest(),
         datetime.date.isoformat(
-            datetime.datetime.fromtimestamp( os.path.getmtime(gplace_an) )
+            datetime.datetime.utcfromtimestamp( os.path.getmtime(gplace_an) )
         ),
         gplace_an,
         hashlib.md5( open(gzcta_an, "rb").read() ).hexdigest(),
         datetime.date.isoformat(
-            datetime.datetime.fromtimestamp( os.path.getmtime(gzcta_an) )
+            datetime.datetime.utcfromtimestamp( os.path.getmtime(gzcta_an) )
         ),
         gzcta_an,
         hashlib.md5( open(cpfzcf_fn, "rb").read() ).hexdigest(),
         datetime.date.isoformat(
-            datetime.datetime.fromtimestamp( os.path.getmtime(cpfzcf_fn) )
+            datetime.datetime.utcfromtimestamp( os.path.getmtime(cpfzcf_fn) )
         ),
         cpfzcf_fn,
         hashlib.md5( open(nsdcccc_fn, "rb").read() ).hexdigest(),
         datetime.date.isoformat(
-            datetime.datetime.fromtimestamp( os.path.getmtime(nsdcccc_fn) )
+            datetime.datetime.utcfromtimestamp( os.path.getmtime(nsdcccc_fn) )
         ),
         nsdcccc_fn,
         hashlib.md5( open(ourairports_fn, "rb").read() ).hexdigest(),
         datetime.date.isoformat(
-            datetime.datetime.fromtimestamp( os.path.getmtime(ourairports_fn) )
+            datetime.datetime.utcfromtimestamp( 
os.path.getmtime(ourairports_fn) )
         ),
         ourairports_fn,
         hashlib.md5( open(overrides_fn, "rb").read() ).hexdigest(),
         datetime.date.isoformat(
-            datetime.datetime.fromtimestamp( os.path.getmtime(overrides_fn) )
+            datetime.datetime.utcfromtimestamp( os.path.getmtime(overrides_fn) 
)
         ),
         overrides_fn,
         hashlib.md5( open(slist_fn, "rb").read() ).hexdigest(),
         datetime.date.isoformat(
-            datetime.datetime.fromtimestamp( os.path.getmtime(slist_fn) )
+            datetime.datetime.utcfromtimestamp( os.path.getmtime(slist_fn) )
         ),
         slist_fn,
         hashlib.md5( open(zlist_fn, "rb").read() ).hexdigest(),
         datetime.date.isoformat(
-            datetime.datetime.fromtimestamp( os.path.getmtime(zlist_fn) )
+            datetime.datetime.utcfromtimestamp( os.path.getmtime(zlist_fn) )
         ),
         zlist_fn
     )

Reply via email to