Commit date validation: more stringent checks, more useful error messages.
authorBryan O'Sullivan <bos@serpentine.com>
Sun, 04 Sep 2005 14:47:02 -0700
changeset 1202 71111d796e40
parent 1201 59bfbdbc38f6
child 1203 cb4c423cbb38
Commit date validation: more stringent checks, more useful error messages.
mercurial/changelog.py
mercurial/commands.py
tests/test-commit.out
--- a/mercurial/changelog.py	Sun Sep 04 14:45:03 2005 -0700
+++ b/mercurial/changelog.py	Sun Sep 04 14:47:02 2005 -0700
@@ -35,7 +35,10 @@
             # validate explicit (probably user-specified) date and
             # time zone offset. values must fit in signed 32 bits for
             # current 32-bit linux runtimes.
-            when, offset = map(int, date.split(' '))
+            try:
+                when, offset = map(int, date.split(' '))
+            except ValueError:
+                raise ValueError('invalid date: %r' % date)
             if abs(when) > 0x7fffffff:
                 raise ValueError('date exceeds 32 bits: %d' % when)
             if abs(offset) >= 43200:
--- a/mercurial/commands.py	Sun Sep 04 14:45:03 2005 -0700
+++ b/mercurial/commands.py	Sun Sep 04 14:47:02 2005 -0700
@@ -660,7 +660,10 @@
         files = c + a + [fn for fn in d if repo.dirstate.state(fn) == 'r']
     else:
         files = []
-    repo.commit(files, message, opts['user'], opts['date'], match)
+    try:
+        repo.commit(files, message, opts['user'], opts['date'], match)
+    except ValueError, inst:
+        raise util.Abort(str(inst))
 
 def copy(ui, repo, source, dest):
     """mark a file as copied or renamed for the next commit"""
@@ -1264,7 +1267,10 @@
 
     rc['parent'] = map(repo.lookup, rc['parent'])
 
-    repo.rawcommit(files, message, rc['user'], rc['date'], *rc['parent'])
+    try:
+        repo.rawcommit(files, message, rc['user'], rc['date'], *rc['parent'])
+    except ValueError, inst:
+        raise util.Abort(str(inst))
 
 def recover(ui, repo):
     """roll back an interrupted transaction"""
@@ -1502,7 +1508,10 @@
 
     message = (opts['message'] or opts['text'] or
                "Added tag %s for changeset %s" % (name, r))
-    repo.commit([".hgtags"], message, opts['user'], opts['date'])
+    try:
+        repo.commit([".hgtags"], message, opts['user'], opts['date'])
+    except ValueError, inst:
+        raise util.Abort(str(inst))
 
 def tags(ui, repo):
     """list repository tags"""
--- a/tests/test-commit.out	Sun Sep 04 14:45:03 2005 -0700
+++ b/tests/test-commit.out	Sun Sep 04 14:47:02 2005 -0700
@@ -1,90 +1,15 @@
-Traceback (most recent call last):
-  File "/tmp/hgtests.22041.15131.11536.3935/install/bin/hg", line 13, in ?
-    commands.run()
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 1809, in run
-    sys.exit(dispatch(sys.argv[1:]))
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 1945, in dispatch
-    return d()
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 1930, in <lambda>
-    d = lambda: func(u, repo, *args, **cmdoptions)
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 663, in commit
-    repo.commit(files, message, opts['user'], opts['date'], match)
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/localrepo.py", line 398, in commit
-    n = self.changelog.add(mn, changed, text, tr, p1, p2, user, date)
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/changelog.py", line 42, in add
-    raise ValueError('impossible time zone offset: %d' % offset)
-ValueError: impossible time zone offset: 4444444
 transaction abort!
 rollback completed
-Traceback (most recent call last):
-  File "/tmp/hgtests.22041.15131.11536.3935/install/bin/hg", line 13, in ?
-    commands.run()
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 1809, in run
-    sys.exit(dispatch(sys.argv[1:]))
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 1945, in dispatch
-    return d()
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 1930, in <lambda>
-    d = lambda: func(u, repo, *args, **cmdoptions)
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 663, in commit
-    repo.commit(files, message, opts['user'], opts['date'], match)
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/localrepo.py", line 398, in commit
-    n = self.changelog.add(mn, changed, text, tr, p1, p2, user, date)
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/changelog.py", line 38, in add
-    when, offset = map(int, date.split(' '))
-ValueError: invalid literal for int(): 1	15.1
+abort: impossible time zone offset: 4444444
+transaction abort!
+rollback completed
+abort: invalid date: '1\t15.1'
 transaction abort!
 rollback completed
-Traceback (most recent call last):
-  File "/tmp/hgtests.22041.15131.11536.3935/install/bin/hg", line 13, in ?
-    commands.run()
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 1809, in run
-    sys.exit(dispatch(sys.argv[1:]))
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 1945, in dispatch
-    return d()
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 1930, in <lambda>
-    d = lambda: func(u, repo, *args, **cmdoptions)
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 663, in commit
-    repo.commit(files, message, opts['user'], opts['date'], match)
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/localrepo.py", line 398, in commit
-    n = self.changelog.add(mn, changed, text, tr, p1, p2, user, date)
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/changelog.py", line 38, in add
-    when, offset = map(int, date.split(' '))
-ValueError: invalid literal for int(): foo
+abort: invalid date: 'foo bar'
 transaction abort!
 rollback completed
-Traceback (most recent call last):
-  File "/tmp/hgtests.22041.15131.11536.3935/install/bin/hg", line 13, in ?
-    commands.run()
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 1809, in run
-    sys.exit(dispatch(sys.argv[1:]))
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 1945, in dispatch
-    return d()
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 1930, in <lambda>
-    d = lambda: func(u, repo, *args, **cmdoptions)
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 663, in commit
-    repo.commit(files, message, opts['user'], opts['date'], match)
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/localrepo.py", line 398, in commit
-    n = self.changelog.add(mn, changed, text, tr, p1, p2, user, date)
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/changelog.py", line 38, in add
-    when, offset = map(int, date.split(' '))
-ValueError: invalid literal for int(): 
+abort: invalid date: ' 1 4444'
 transaction abort!
 rollback completed
-Traceback (most recent call last):
-  File "/tmp/hgtests.22041.15131.11536.3935/install/bin/hg", line 13, in ?
-    commands.run()
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 1809, in run
-    sys.exit(dispatch(sys.argv[1:]))
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 1945, in dispatch
-    return d()
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 1930, in <lambda>
-    d = lambda: func(u, repo, *args, **cmdoptions)
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/commands.py", line 663, in commit
-    repo.commit(files, message, opts['user'], opts['date'], match)
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/localrepo.py", line 398, in commit
-    n = self.changelog.add(mn, changed, text, tr, p1, p2, user, date)
-  File "/tmp/hgtests.22041.15131.11536.3935/install/lib/python/mercurial/changelog.py", line 40, in add
-    raise ValueError('date exceeds 32 bits: %d' % when)
-ValueError: date exceeds 32 bits: 111111111111
-transaction abort!
-rollback completed
+abort: date exceeds 32 bits: 111111111111