util.datestr: do not crash on revisions with negative timestamp (issue2513) stable
authorAdrian Buehlmann <adrian@cadifra.com>
Tue, 23 Nov 2010 13:11:40 +0100
branchstable
changeset 13039 dd24f3e7ca9e
parent 13038 670f4e98276d
child 13040 44b26a87f73e
child 13041 79388a8325dc
util.datestr: do not crash on revisions with negative timestamp (issue2513) Python's time.gmtime(lt) fails on Windows, producing a traceback with ValueError: (22, 'Invalid argument') if lt < -43200. We get a local time boundary value of -43200 if we take "the epoch" Thu Jan 01 00:00:00 1970 = time.gmtime(0) from timezone 'UTC+0' into timezone 'UTC-12'. All other timezones will have larger local time values for that point in time. Aborting with a traceback on 'hg log' for revisions with a timestamp value < -43200 is clearly not acceptable. Returning "invalid timestamp" or similar as string representation is not an option either, since that may crash other tools which parse the output of 'hg log'. Instead, we teach util.datestr() to return the epoch in timezone UTC+0 on *all platforms*, represented by the string Thu Jan 01 00:00:00 1970 +0000 if the timestamp's unix time value is negative. (based on a patch originally proposed by Benjamin Pollack)
mercurial/util.py
--- a/mercurial/util.py	Tue Nov 23 22:53:47 2010 +0100
+++ b/mercurial/util.py	Tue Nov 23 13:11:40 2010 +0100
@@ -1023,6 +1023,9 @@
     number of seconds away from UTC. if timezone is false, do not
     append time zone to string."""
     t, tz = date or makedate()
+    if t < 0:
+        t = 0   # time.gmtime(lt) fails on Windows for lt < -43200
+        tz = 0
     if "%1" in format or "%2" in format:
         sign = (tz > 0) and "-" or "+"
         minutes = abs(tz) // 60