[PATCH 3 of 3 STABLE] date: accept broader range of ISO 8601 time specs

Matt Mackall mpm at selenic.com
Wed Jul 27 16:48:42 EDT 2016


# HG changeset patch
# User Matt Mackall <mpm at selenic.com>
# Date 1469650956 18000
#      Wed Jul 27 15:22:36 2016 -0500
# Branch stable
# Node ID 114728123ca15c6e614ad4ad7d6c719ba9f0ac7b
# Parent  a8d5ca11a21b8c833577e9265b3a16f78a528c63
date: accept broader range of ISO 8601 time specs

The "normal" ISO date/time includes a T between date and time. It also
allows dropping the colons and seconds from the timespec. Add new
patterns for these forms as well as tests.

diff -r a8d5ca11a21b -r 114728123ca1 mercurial/util.py
--- a/mercurial/util.py	Wed Jul 27 15:20:34 2016 -0500
+++ b/mercurial/util.py	Wed Jul 27 15:22:36 2016 -0500
@@ -440,7 +440,14 @@
 
 # used by parsedate
 defaultdateformats = (
-    '%Y-%m-%d %H:%M:%S',
+    '%Y-%m-%dT%H:%M:%S', # the 'real' ISO8601
+    '%Y-%m-%dT%H:%M',    #   without seconds
+    '%Y-%m-%dT%H%M%S',   # another awful but legal variant without :
+    '%Y-%m-%dT%H%M',     #   without seconds
+    '%Y-%m-%d %H:%M:%S', # our common legal variant
+    '%Y-%m-%d %H:%M',    #   without seconds
+    '%Y-%m-%d %H%M%S',   # without :
+    '%Y-%m-%d %H%M',     #   without seconds
     '%Y-%m-%d %I:%M:%S%p',
     '%Y-%m-%d %H:%M',
     '%Y-%m-%d %I:%M%p',
@@ -1764,7 +1771,7 @@
     if s.endswith("Z") and s[-2:-1].isdigit():
         return 0, s[:-1]
 
-    # ISO8601-style [+-]hh:mm
+    # ISO860-style [+-]hh:mm
     if (len(s) >= 6 and s[-6] in "+-" and s[-3] == ":" and
         s[-5:-3].isdigit() and s[-2:].isdigit()):
         sign = (s[-6] == "+") and 1 or -1
diff -r a8d5ca11a21b -r 114728123ca1 tests/test-parse-date.t
--- a/tests/test-parse-date.t	Wed Jul 27 15:20:34 2016 -0500
+++ b/tests/test-parse-date.t	Wed Jul 27 15:22:36 2016 -0500
@@ -258,3 +258,31 @@
   $ hg log -d today --template '{desc}\n'
   Explicitly committed now.
   today is a good day to code
+
+Test parsing various ISO8601 forms
+
+  $ hg debugdate "2016-07-27T12:10:21"
+  internal: 1469646621 * (glob)
+  standard: Wed Jul 27 12:10:21 2016 -0700
+  $ hg debugdate "2016-07-27T12:10:21Z"
+  internal: 1469621421 0
+  standard: Wed Jul 27 12:10:21 2016 +0000
+  $ hg debugdate "2016-07-27T12:10:21+00:00"
+  internal: 1469621421 0
+  standard: Wed Jul 27 12:10:21 2016 +0000
+  $ hg debugdate "2016-07-27T121021Z"
+  internal: 1469621421 0
+  standard: Wed Jul 27 12:10:21 2016 +0000
+
+  $ hg debugdate "2016-07-27 12:10:21"
+  internal: 1469646621 * (glob)
+  standard: Wed Jul 27 12:10:21 2016 -0700
+  $ hg debugdate "2016-07-27 12:10:21Z"
+  internal: 1469621421 0
+  standard: Wed Jul 27 12:10:21 2016 +0000
+  $ hg debugdate "2016-07-27 12:10:21+00:00"
+  internal: 1469621421 0
+  standard: Wed Jul 27 12:10:21 2016 +0000
+  $ hg debugdate "2016-07-27 121021Z"
+  internal: 1469621421 0
+  standard: Wed Jul 27 12:10:21 2016 +0000


More information about the Mercurial-devel mailing list