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
)