# HG changeset patch # User Boris Feld # Date 2017-05-24 15:50:17 # Node ID bb18728ea617c52f668df832474601a9af59dfa2 # Parent 2b5953a49f1407f825d65b45986d213cb5c79203 util: raise ParseError when parsing dates (BC) a7dce526c462 refactored util.parsedate in order to raise ValueError instead of Abort for using with ui.configwith. It causes several problems, putting arbitrary bytes in ValueError can cause issues with Python 3. Moreover, we added a function to convert ValueError exceptions back to Abort. A better approach would be to make parsedate raises ParseError, removing the convert function and update configwith to also catch ParseError. The side-effect is that error message when giving an invalid date in CLI change from: abort: invalid date: 'foo bar' to: hg: parse error: invalid date: 'foo bar' I'm not sure if it's an acceptable change, I found personally the error message more clear but more verbose too. diff --git a/mercurial/ui.py b/mercurial/ui.py --- a/mercurial/ui.py +++ b/mercurial/ui.py @@ -522,7 +522,7 @@ class ui(object): return default try: return convert(v) - except ValueError: + except (ValueError, error.ParseError): if desc is None: desc = convert.__name__ raise error.ConfigError(_("%s.%s is not a valid %s ('%s')") @@ -607,7 +607,7 @@ class ui(object): (0, 0) """ if self.config(section, name, default, untrusted): - return self.configwith(util.rawparsedate, section, name, default, + return self.configwith(util.parsedate, section, name, default, 'date', untrusted) return default diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -1924,9 +1924,6 @@ def parsedate(date, formats=None, bias=N The date may be a "unixtime offset" string or in one of the specified formats. If the date already is a (unixtime, offset) tuple, it is returned. - This function calls rawparsedate and convert ValueError to Abort for - functions that needs higher level exception. - >>> parsedate(' today ') == parsedate(\ datetime.date.today().strftime('%b %d')) True @@ -1941,20 +1938,6 @@ def parsedate(date, formats=None, bias=N >>> tz == strtz True """ - try: - return rawparsedate(date, formats=formats, bias=bias) - except ValueError as exception: - raise Abort(str(exception)) - -def rawparsedate(date, formats=None, bias=None): - """parse a localized date/time and return a (unixtime, offset) tuple. - - The date may be a "unixtime offset" string or in one of the specified - formats. If the date already is a (unixtime, offset) tuple, it is returned. - - See docstring of parsedate for example. - Raise ValueError for invalid date value. - """ if bias is None: bias = {} if not date: @@ -2001,15 +1984,15 @@ def rawparsedate(date, formats=None, bia else: break else: - raise ValueError(_('invalid date: %r') % date) + raise error.ParseError(_('invalid date: %r') % date) # validate explicit (probably user-specified) date and # time zone offset. values must fit in signed 32 bits for # current 32-bit linux runtimes. timezones go from UTC-12 # to UTC+14 if when < -0x80000000 or when > 0x7fffffff: - raise ValueError(_('date exceeds 32 bits: %d') % when) + raise error.ParseError(_('date exceeds 32 bits: %d') % when) if offset < -50400 or offset > 43200: - raise ValueError(_('impossible time zone offset: %d') % offset) + raise error.ParseError(_('impossible time zone offset: %d') % offset) return when, offset def matchdate(date): diff --git a/tests/test-commit.t b/tests/test-commit.t --- a/tests/test-commit.t +++ b/tests/test-commit.t @@ -15,20 +15,20 @@ commit date test $ hg commit -d '0 0' -m commit-1 $ echo foo >> foo $ hg commit -d '1 4444444' -m commit-3 - abort: impossible time zone offset: 4444444 + hg: parse error: impossible time zone offset: 4444444 [255] $ hg commit -d '1 15.1' -m commit-4 - abort: invalid date: '1\t15.1' + hg: parse error: invalid date: '1\t15.1' [255] $ hg commit -d 'foo bar' -m commit-5 - abort: invalid date: 'foo bar' + hg: parse error: invalid date: 'foo bar' [255] $ hg commit -d ' 1 4444' -m commit-6 $ hg commit -d '111111111111 0' -m commit-7 - abort: date exceeds 32 bits: 111111111111 + hg: parse error: date exceeds 32 bits: 111111111111 [255] $ hg commit -d '-111111111111 0' -m commit-7 - abort: date exceeds 32 bits: -111111111111 + hg: parse error: date exceeds 32 bits: -111111111111 [255] $ echo foo >> foo $ hg commit -d '1901-12-13 20:45:52 +0000' -m commit-7-2 @@ -38,10 +38,10 @@ commit date test 3 1901-12-13 20:45:52 +0000 2 1901-12-13 20:45:52 +0000 $ hg commit -d '1901-12-13 20:45:51 +0000' -m commit-7 - abort: date exceeds 32 bits: -2147483649 + hg: parse error: date exceeds 32 bits: -2147483649 [255] $ hg commit -d '-2147483649 0' -m commit-7 - abort: date exceeds 32 bits: -2147483649 + hg: parse error: date exceeds 32 bits: -2147483649 [255] commit added file that has been deleted diff --git a/tests/test-glog.t b/tests/test-glog.t --- a/tests/test-glog.t +++ b/tests/test-glog.t @@ -1513,7 +1513,7 @@ glog always reorders nodes which explain ('symbol', 'date') ('string', '2 0 to 4 0'))) $ hg log -G -d 'brace ) in a date' - abort: invalid date: 'brace ) in a date' + hg: parse error: invalid date: 'brace ) in a date' [255] $ testlog --prune 31 --prune 32 [] diff --git a/tests/test-parse-date.t b/tests/test-parse-date.t --- a/tests/test-parse-date.t +++ b/tests/test-parse-date.t @@ -17,13 +17,13 @@ This runs with TZ="GMT" $ hg ci -d "1150000000 14400" -m "rev 4 (merge)" $ echo "fail" >> a $ hg ci -d "should fail" -m "fail" - abort: invalid date: 'should fail' + hg: parse error: invalid date: 'should fail' [255] $ hg ci -d "100000000000000000 1400" -m "fail" - abort: date exceeds 32 bits: 100000000000000000 + hg: parse error: date exceeds 32 bits: 100000000000000000 [255] $ hg ci -d "100000 1400000" -m "fail" - abort: impossible time zone offset: 1400000 + hg: parse error: impossible time zone offset: 1400000 [255] Check with local timezone other than GMT and with DST diff --git a/tests/test-revset.t b/tests/test-revset.t --- a/tests/test-revset.t +++ b/tests/test-revset.t @@ -413,7 +413,7 @@ quoting needed hg: parse error: invalid \x escape [255] $ log 'date(tip)' - abort: invalid date: 'tip' + hg: parse error: invalid date: 'tip' [255] $ log '0:date' abort: unknown revision 'date'!