diff --git a/Lib/fontTools/misc/timeTools.py b/Lib/fontTools/misc/timeTools.py index e61e3eea5..c30a3778a 100644 --- a/Lib/fontTools/misc/timeTools.py +++ b/Lib/fontTools/misc/timeTools.py @@ -3,6 +3,7 @@ from __future__ import print_function, division, absolute_import from fontTools.misc.py23 import * +import os import time import calendar @@ -47,6 +48,10 @@ def timestampFromString(value): return calendar.timegm(time.strptime(value)) - epoch_diff def timestampNow(): + # https://reproducible-builds.org/specs/source-date-epoch/ + source_date_epoch = os.environ.get("SOURCE_DATE_EPOCH") + if source_date_epoch is not None: + return int(source_date_epoch) - epoch_diff return int(time.time() - epoch_diff) def timestampSinceEpoch(value): diff --git a/Tests/misc/timeTools_test.py b/Tests/misc/timeTools_test.py index e5da19b05..04f05846d 100644 --- a/Tests/misc/timeTools_test.py +++ b/Tests/misc/timeTools_test.py @@ -1,9 +1,25 @@ from __future__ import print_function, division, absolute_import from fontTools.misc.py23 import * -from fontTools.misc.timeTools import asctime +from fontTools.misc.timeTools import asctime, timestampNow, epoch_diff +import os import time def test_asctime(): assert isinstance(asctime(), basestring) assert asctime(time.gmtime(0)) == 'Thu Jan 1 00:00:00 1970' + +def test_source_date_epoch(): + os.environ["SOURCE_DATE_EPOCH"] = "150687315" + assert timestampNow() + epoch_diff == 150687315 + + # Check that malformed value fail, any better way? + os.environ["SOURCE_DATE_EPOCH"] = "ABCDEFGHI" + try: + timestampNow() + assert False + except ValueError: + assert True + + del os.environ["SOURCE_DATE_EPOCH"] + assert timestampNow() + epoch_diff != 150687315