retitle 782294 please make the output reproducible
tags 782294 + fixed-upstream
thanks
> asciidoc: make timestamps reproducible adding the flag
> --use-utc-timezone
Renaming bug - upstream have merged a (superior) SOURCE_DATE_EPOCH-based
patch instead.
Also attaching updated patch to match.
Regards,
--
,''`.
: :' : Chris Lamb
`. `'` [email protected] / chris-lamb.co.uk
`-
--- asciidoc-8.6.9.orig/asciidoc.py
+++ asciidoc-8.6.9/asciidoc.py
@@ -1268,25 +1268,27 @@ def char_encode(s):
else:
return s
-def time_str(t):
- """Convert seconds since the Epoch to formatted local time string."""
- t = time.localtime(t)
- s = time.strftime('%H:%M:%S',t)
- if time.daylight and t.tm_isdst == 1:
- result = s + ' ' + time.tzname[1]
+def date_time_str(t):
+ """Convert seconds since the Epoch to formatted local date and time strings."""
+ source_date_epoch = os.environ.get('SOURCE_DATE_EPOCH')
+ if source_date_epoch is not None:
+ t = time.gmtime(min(t, int(source_date_epoch)))
else:
- result = s + ' ' + time.tzname[0]
+ t = time.localtime(t)
+ date_str = time.strftime('%Y-%m-%d',t)
+ time_str = time.strftime('%H:%M:%S',t)
+ if source_date_epoch is not None:
+ time_str += ' UTC'
+ elif time.daylight and t.tm_isdst == 1:
+ time_str += ' ' + time.tzname[1]
+ else:
+ time_str += ' ' + time.tzname[0]
# Attempt to convert the localtime to the output encoding.
try:
- result = char_encode(result.decode(locale.getdefaultlocale()[1]))
+ time_str = char_encode(time_str.decode(locale.getdefaultlocale()[1]))
except Exception:
pass
- return result
-
-def date_str(t):
- """Convert seconds since the Epoch to formatted local date string."""
- t = time.localtime(t)
- return time.strftime('%Y-%m-%d',t)
+ return date_str, time_str
class Lex:
@@ -1453,8 +1455,7 @@ class Document(object):
Set implicit attributes and attributes in 'attrs'.
"""
t = time.time()
- self.attributes['localtime'] = time_str(t)
- self.attributes['localdate'] = date_str(t)
+ self.attributes['localdate'], self.attributes['localtime'] = date_time_str(t)
self.attributes['asciidoc-version'] = VERSION
self.attributes['asciidoc-file'] = APP_FILE
self.attributes['asciidoc-dir'] = APP_DIR
@@ -1484,8 +1485,7 @@ class Document(object):
else:
t = None
if t:
- self.attributes['doctime'] = time_str(t)
- self.attributes['docdate'] = date_str(t)
+ self.attributes['docdate'], self.attributes['doctime'] = date_time_str(t)
if self.infile != '<stdin>':
self.attributes['infile'] = self.infile
self.attributes['indir'] = os.path.dirname(self.infile)
--- asciidoc-8.6.9.orig/doc/asciidoc.1.txt
+++ asciidoc-8.6.9/doc/asciidoc.1.txt
@@ -162,6 +162,18 @@ The plugin commands perform as follows:
names starting with a period are skipped.
+ENVIRONMENT VARIABLES
+---------------------
+
+*`SOURCE_DATE_EPOCH`*::
+ If the `SOURCE_DATE_EPOCH` environment variable is set to a UNIX
+ timestamp, then the `{docdate}`, `{doctime}`, `{localdate}`, and
+ `{localtime}` attributes are computed in the UTC time zone, with any
+ timestamps newer than `SOURCE_DATE_EPOCH` replaced by
+ `SOURCE_DATE_EPOCH`. (This helps software using AsciiDoc to build
+ reproducibly.)
+
+
EXAMPLES
--------
`asciidoc asciidoc_file_name.txt`::
--- asciidoc-8.6.9.orig/doc/asciidoc.txt
+++ asciidoc-8.6.9/doc/asciidoc.txt
@@ -4603,11 +4603,11 @@ predefined intrinsic attributes:
{basebackend} html or docbook
{blockname} current block name (note 8).
{brvbar} broken vertical bar (|) character
- {docdate} document last modified date
+ {docdate} document last modified date (note 9)
{docdir} document input directory name (note 5)
{docfile} document file name (note 5)
{docname} document file name without extension (note 6)
- {doctime} document last modified time
+ {doctime} document last modified time (note 9)
{doctitle} document title (from document header)
{doctype-<doctype>} empty string ''
{doctype} document type specified by `-d` option
@@ -4625,8 +4625,8 @@ predefined intrinsic attributes:
{ldquo} Left double quote character (note 7)
{level} title level 1..4 (in section titles)
{listindex} the list index (1..) of the most recent list item
- {localdate} the current date
- {localtime} the current time
+ {localdate} the current date (note 9)
+ {localtime} the current time (note 9)
{lsquo} Left single quote character (note 7)
{lt} less than (<) character entity
{manname} manpage name (defined in NAME section)
@@ -4697,6 +4697,13 @@ predefined intrinsic attributes:
glossary
tables:: table
+9. If the `SOURCE_DATE_EPOCH` environment variable is set to a UNIX
+ timestamp, then the `{docdate}`, `{doctime}`, `{localdate}`, and
+ `{localtime}` attributes are computed in the UTC time zone, with any
+ timestamps newer than `SOURCE_DATE_EPOCH` replaced by
+ `SOURCE_DATE_EPOCH`. (This helps software using AsciiDoc to build
+ reproducibly.)
+
======