[Python-modules-commits] [sphinx] 01/04: Extend SOURCE_DATE_EPOCH support

Dmitry Shachnev mitya57 at moszumanska.debian.org
Tue May 17 13:09:52 UTC 2016


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

mitya57 pushed a commit to branch master
in repository sphinx.

commit bbeef13a7d22a34cf6ef35197238e7b1e89ab530
Author: Alexis Bienvenüe <pado at passoire.fr>
Date:   Tue May 17 14:28:48 2016 +0300

    Extend SOURCE_DATE_EPOCH support
    
    Taken from: https://github.com/sphinx-doc/sphinx/pull/2503
    Fixes: https://bugs.debian.org/820895
---
 sphinx/builders/gettext.py                 |  8 ++++-
 sphinx/config.py                           | 13 +++++++-
 sphinx/util/i18n.py                        |  3 +-
 tests/roots/test-correct-year/conf.py      |  3 ++
 tests/roots/test-correct-year/contents.rst |  4 +++
 tests/test_correct_year.py                 | 49 ++++++++++++++++++++++++++++++
 6 files changed, 76 insertions(+), 4 deletions(-)

diff --git a/sphinx/builders/gettext.py b/sphinx/builders/gettext.py
index fce6c8c..1c47893 100644
--- a/sphinx/builders/gettext.py
+++ b/sphinx/builders/gettext.py
@@ -11,7 +11,7 @@
 
 from __future__ import unicode_literals
 
-from os import path, walk
+from os import path, walk, getenv
 from codecs import open
 from time import time
 from datetime import datetime, tzinfo, timedelta
@@ -130,6 +130,12 @@ class I18nBuilder(Builder):
 timestamp = time()
 tzdelta = datetime.fromtimestamp(timestamp) - \
     datetime.utcfromtimestamp(timestamp)
+# set timestamp from SOURCE_DATE_EPOCH if set
+# see https://reproducible-builds.org/specs/source-date-epoch/
+source_date_epoch = getenv('SOURCE_DATE_EPOCH')
+if source_date_epoch is not None:
+    timestamp = float(source_date_epoch)
+    tzdelta = 0
 
 
 class LocalTimeZone(tzinfo):
diff --git a/sphinx/config.py b/sphinx/config.py
index e199e7d..707f162 100644
--- a/sphinx/config.py
+++ b/sphinx/config.py
@@ -10,7 +10,7 @@
 """
 
 import re
-from os import path, environ
+from os import path, environ, getenv
 import shlex
 
 from six import PY2, PY3, iteritems, string_types, binary_type, text_type, integer_types
@@ -19,8 +19,10 @@ from sphinx.errors import ConfigError
 from sphinx.locale import l_
 from sphinx.util.osutil import make_filename, cd
 from sphinx.util.pycompat import execfile_, NoneType
+from sphinx.util.i18n import format_date
 
 nonascii_re = re.compile(br'[\x80-\xff]')
+copyright_year_re = re.compile(r'^((\d{4}-)?)(\d{4})(?=[ ,])')
 
 CONFIG_SYNTAX_ERROR = "There is a syntax error in your configuration file: %s"
 if PY3:
@@ -298,6 +300,15 @@ class Config(object):
         self.setup = config.get('setup', None)
         self.extensions = config.get('extensions', [])
 
+        # correct values of copyright year that are not coherent with
+        # the SOURCE_DATE_EPOCH environment variable (if set)
+        # See https://reproducible-builds.org/specs/source-date-epoch/
+        if getenv('SOURCE_DATE_EPOCH') is not None:
+            for k in ('copyright', 'epub_copyright'):
+                if k in config:
+                    config[k] = copyright_year_re.sub('\g<1>%s' % format_date('%Y'),
+                                                      config[k])
+
     def check_types(self, warn):
         # check all values for deviation from the default value's type, since
         # that can result in TypeErrors all over the place
diff --git a/sphinx/util/i18n.py b/sphinx/util/i18n.py
index f4a8bce..d0cb1f4 100644
--- a/sphinx/util/i18n.py
+++ b/sphinx/util/i18n.py
@@ -14,7 +14,6 @@ import os
 import re
 import warnings
 from os import path
-from time import gmtime
 from datetime import datetime
 from collections import namedtuple
 
@@ -188,7 +187,7 @@ def format_date(format, date=None, language=None, warn=None):
         # See https://wiki.debian.org/ReproducibleBuilds/TimestampsProposal
         source_date_epoch = os.getenv('SOURCE_DATE_EPOCH')
         if source_date_epoch is not None:
-            date = gmtime(float(source_date_epoch))
+            date = datetime.utcfromtimestamp(float(source_date_epoch))
         else:
             date = datetime.now()
 
diff --git a/tests/roots/test-correct-year/conf.py b/tests/roots/test-correct-year/conf.py
new file mode 100644
index 0000000..9b554aa
--- /dev/null
+++ b/tests/roots/test-correct-year/conf.py
@@ -0,0 +1,3 @@
+
+copyright = u'2006-2009, Author'
+
diff --git a/tests/roots/test-correct-year/contents.rst b/tests/roots/test-correct-year/contents.rst
new file mode 100644
index 0000000..938dfd5
--- /dev/null
+++ b/tests/roots/test-correct-year/contents.rst
@@ -0,0 +1,4 @@
+=================
+test-correct-year
+=================
+
diff --git a/tests/test_correct_year.py b/tests/test_correct_year.py
new file mode 100644
index 0000000..7a156cb
--- /dev/null
+++ b/tests/test_correct_year.py
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+"""
+    test_correct_year
+    ~~~~~~~~~~~~~~~~~
+
+    Test copyright year adjustment
+
+    :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+import os
+
+from util import TestApp
+
+
+def test_correct_year():
+    try:
+        # save current value of SOURCE_DATE_EPOCH
+        sde = os.environ.pop('SOURCE_DATE_EPOCH',None)
+
+        # test with SOURCE_DATE_EPOCH unset: no modification
+        app = TestApp(buildername='html',testroot='correct-year')
+        app.builder.build_all()
+        content = (app.outdir / 'contents.html').text()
+        app.cleanup()
+        assert '2006-2009' in content
+
+        # test with SOURCE_DATE_EPOCH set: copyright year should be
+        # updated
+        os.environ['SOURCE_DATE_EPOCH'] = "1293840000"
+        app = TestApp(buildername='html',testroot='correct-year')
+        app.builder.build_all()
+        content = (app.outdir / 'contents.html').text()
+        app.cleanup()
+        assert '2006-2011' in content
+
+        os.environ['SOURCE_DATE_EPOCH'] = "1293839999"
+        app = TestApp(buildername='html',testroot='correct-year')
+        app.builder.build_all()
+        content = (app.outdir / 'contents.html').text()
+        app.cleanup()
+        assert '2006-2010' in content
+
+    finally:
+        # Restores SOURCE_DATE_EPOCH
+        if sde == None:
+            os.environ.pop('SOURCE_DATE_EPOCH',None)
+        else:
+            os.environ['SOURCE_DATE_EPOCH'] = sde

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/sphinx.git



More information about the Python-modules-commits mailing list