util: disable floating point stat times (issue4836)
authorMatt Mackall <mpm@selenic.com>
Thu, 19 Nov 2015 13:21:24 -0600
changeset 27015 341cb90ffd18
parent 27014 4223fc58f952
child 27016 448cbdab5883
util: disable floating point stat times (issue4836) Alternate fix for this issue which avoids putting extra function calls and exception handling in the fast path. For almost all purposes, integer timestamps are preferable to Mercurial. It stores integer timestamps in the dirstate and would thus like to avoid doing any float/int comparisons or conversions. We will continue to have to deal with 1-second granularity on filesystems for quite some time, so this won't significantly hinder our capabilities. This has some impact on our file cache validation code in that it lowers timestamp resolution. But as we still have to deal with low-resolution filesystems, we're not relying on this anyway. An alternate approach is to use stat[ST_MTIME], which is guaranteed to be an integer. But since this support isn't already in our extension, we can't depend on it being available without adding a hard Python->C API dependency that's painful for people like yours truly who have bisect regularly and people without compilers.
mercurial/util.py
--- a/mercurial/util.py	Wed Nov 18 15:58:06 2015 -0800
+++ b/mercurial/util.py	Thu Nov 19 13:21:24 2015 -0600
@@ -88,6 +88,11 @@
 
 _notset = object()
 
+# disable Python's problematic floating point timestamps (issue4836)
+# (Python hypocritically says you shouldn't change this behavior in
+# libraries, and sure enough Mercurial is not a library.)
+os.stat_float_times(False)
+
 def safehasattr(thing, attr):
     return getattr(thing, attr, _notset) is not _notset