aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuido Günther <agx@sigxcpu.org>2016-06-30 16:43:30 +0200
committerGuido Günther <agx@sigxcpu.org>2016-06-30 17:08:31 +0200
commite7a2e18f9fe9e1c9b0e993049dbf15620604087e (patch)
tree35c74b914e8d4736e9d0e057dcadd8a0bb2dffe7
parent6732732d3336d067bcaf140862158c56b62b8031 (diff)
rpm.changelog: Wrap str{f,p}time calls
so we're sure they run under a C locale. Otherwise we might misparse dates due to locale differences. This unbreaks rpm-ch's the test suite.
-rw-r--r--gbp/rpm/changelog.py18
1 files changed, 18 insertions, 0 deletions
diff --git a/gbp/rpm/changelog.py b/gbp/rpm/changelog.py
index 504391a..7f59816 100644
--- a/gbp/rpm/changelog.py
+++ b/gbp/rpm/changelog.py
@@ -16,12 +16,28 @@
# <http://www.gnu.org/licenses/>
"""An RPM Changelog"""
+import locale
import datetime
import re
+from functools import wraps
+
import gbp.log
+def c_locale(category):
+ def _decorator(f):
+ @wraps(f)
+ def wrapper(*args, **kwargs):
+ saved = locale.setlocale(category, None)
+ locale.setlocale(category, 'C')
+ ret = f(*args, **kwargs)
+ locale.setlocale(category, saved)
+ return ret
+ return wrapper
+ return _decorator
+
+
class ChangelogError(Exception):
"""Problem parsing changelog"""
pass
@@ -43,6 +59,7 @@ class _ChangelogHeader(object):
return self._data[key]
return None
+ @c_locale(locale.LC_TIME)
def __str__(self):
keys = dict(self._data)
keys['time'] = self._data['time'].strftime(
@@ -171,6 +188,7 @@ class ChangelogParser(object):
except IOError as err:
raise ChangelogError("Unable to read changelog file: %s" % err)
+ @c_locale(locale.LC_TIME)
def _parse_section_header(self, text):
"""Parse one changelog section header"""
# Try to split out time stamp and "changelog name"