[PATCH] Allow the use of human readable dates (issue 251)

Jose M. Prieto jmprieto at gmx.net
Fri Jun 30 07:09:12 CDT 2006


# HG changeset patch
# User Jose M. Prieto <jmprieto at gmx.net>
# Date 1151668096 -7200
# Node ID 758f8083d68d8de422cf3133812bd677178d67f3
# Parent  e30f425a4b2ca3679ea715ceef3ef4b5130f1a27
Allow the use of human readable dates (issue 251)

diff -r e30f425a4b2c -r 758f8083d68d mercurial/changelog.py
--- a/mercurial/changelog.py	Fri Jun 30 10:16:38 2006 +0200
+++ b/mercurial/changelog.py	Fri Jun 30 13:48:16 2006 +0200
@@ -46,14 +46,15 @@ class changelog(revlog):
             try:
                 when, offset = map(int, date.split(' '))
             except ValueError:
-                raise ValueError(_('invalid date: %r') % date)
+                when, offset = util.parsedate(date)
             if abs(when) > 0x7fffffff:
                 raise ValueError(_('date exceeds 32 bits: %d') % when)
             if offset < -50400 or offset > 43200:
                 raise ValueError(_('impossible time zone offset: %d') % offset)
+            parseddate = "%d %d" % (when, offset)
         else:
-            date = "%d %d" % util.makedate()
+            parseddate = "%d %d" % util.makedate()
         list.sort()
-        l = [hex(manifest), user, date] + list + ["", desc]
+        l = [hex(manifest), user, parseddate] + list + ["", desc]
         text = "\n".join(l)
         return self.addrevision(text, transaction, self.count(), p1, p2)
diff -r e30f425a4b2c -r 758f8083d68d mercurial/util.py
--- a/mercurial/util.py	Fri Jun 30 10:16:38 2006 +0200
+++ b/mercurial/util.py	Fri Jun 30 13:48:16 2006 +0200
@@ -859,6 +859,29 @@ def datestr(date=None, format='%a %b %d 
         s += " %+03d%02d" % (-tz / 3600, ((-tz % 3600) / 60))
     return s
 
+def strdate(string, format='%a %b %d %H:%M:%S %Y'):
+    """parse a localized time string and return a (unixtime, offset) tuple.
+    if the string cannot be parsed, ValueError is raised."""
+    if re.compile(' (\+|-)\d{4}$').search(string):
+        date, tz = string.rsplit(None, 1)
+        tz = int(tz)
+        offset = - 3600 * (tz / 100) - 60 * (tz % 100)
+    else:
+        date, offset = string, 0
+    when = int(time.mktime(time.strptime(date, format))) + offset
+    return when, offset
+
+def parsedate(string, *formats):
+    """parse a localized time string and return a (unixtime, offset) tuple,
+    using a list of possible date formats."""
+    if not formats:
+        formats = ('%a %b %d %H:%M:%S %Y', '%Y-%m-%d %H:%M:%S')
+    for format in formats:
+        try:
+            return strdate(string, format)
+        except ValueError: pass
+    raise ValueError(_('invalid date: %r') % string)
+
 def shortuser(user):
     """Return a short representation of a user name or email address."""
     f = user.find('@')
diff -r e30f425a4b2c -r 758f8083d68d tests/test-parse-date
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-parse-date	Fri Jun 30 13:48:16 2006 +0200
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+hg init
+echo "test-parse-date" > a
+hg add a
+hg ci -d "Sun Jan 01 12:00:00 2006" -m "rev 0"
+echo "hi!" >> a
+hg ci -d "Sun Jan 01 12:00:00 2006 -0500" -m "rev 1"
+hg tag -d "2006-02-01 13:00:30" "Hi"
+hg backout --merge -d "2006-02-01 13:00:30 +0200" -m "rev 3" 1
+hg ci -d "1150000000 14400" -m "rev 4 (merge)"
+echo "fail" >> a
+hg ci -d "should fail" -m "fail"
+hg log --template '{date|date}\n'
diff -r e30f425a4b2c -r 758f8083d68d tests/test-parse-date.out
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-parse-date.out	Fri Jun 30 13:48:16 2006 +0200
@@ -0,0 +1,13 @@
+reverting a
+changeset 3:d26bd071d4a5 backs out changeset 1:8f5fdaa93a04
+merging with changeset 2:8993ce6e0988
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+(branch merge, don't forget to commit)
+abort: invalid date: 'should fail'
+transaction abort!
+rollback completed
+Sun Jun 11 00:26:40 2006 -0400
+Wed Feb 01 13:00:30 2006 +0200
+Wed Feb 01 13:00:30 2006 +0000
+Sun Jan 01 12:00:00 2006 -0500
+Sun Jan 01 12:00:00 2006 +0000


More information about the Mercurial mailing list