dirstate.write: don't ignore stat data if mtime is in the future (issue1790)
authorAdrian Buehlmann <adrian@cadifra.com>
Fri, 21 Aug 2009 14:17:23 +0200
changeset 9378 1a7bcf58ba56
parent 9376 68f393788895
child 9379 9d2e3508faf9
child 9380 e499a4147c66
dirstate.write: don't ignore stat data if mtime is in the future (issue1790) This change narrows the race guard that was introduced by af3f26b6bba4 ("dirstate: ignore stat data for files that were updated too recently") to not discard the _map entry's stat data if the mtime is in the future. Without this change, status locks files having odd mtimes in the future into the 'unset' state, causing needless file compares later (admittedly harmless), but also inflicting highly irritating sticky effects on tools/plugins that directly read .hg/dirstate (e.g. TortoiseHg).
mercurial/dirstate.py
tests/test-dirstate-future
tests/test-dirstate-future.out
--- a/mercurial/dirstate.py	Sat Aug 22 01:34:56 2009 +0200
+++ b/mercurial/dirstate.py	Fri Aug 21 14:17:23 2009 +0200
@@ -377,9 +377,9 @@
             gran = int(self._ui.config('dirstate', 'granularity', 1))
         except ValueError:
             gran = 1
-        limit = sys.maxint
         if gran > 0:
-            limit = util.fstat(st).st_mtime - gran
+            hlimit = util.fstat(st).st_mtime
+            llimit = hlimit - gran
 
         cs = cStringIO.StringIO()
         copymap = self._copymap
@@ -389,7 +389,8 @@
         for f, e in self._map.iteritems():
             if f in copymap:
                 f = "%s\0%s" % (f, copymap[f])
-            if e[3] > limit and e[0] == 'n':
+            if gran > 0 and e[0] == 'n' and llimit < e[3] <= hlimit:
+                # file was updated too recently, ignore stat data
                 e = (e[0], 0, -1, -1)
             e = pack(_format, e[0], e[1], e[2], e[3], len(f))
             write(e)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-dirstate-future	Fri Aug 21 14:17:23 2009 +0200
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+hg init
+echo a > a
+hg add
+hg ci -m1
+
+# set mtime of a into the future
+touch -t 202101011200 a
+
+# status must not set a's entry to unset (issue1790)
+hg status
+hg debugstate
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-dirstate-future.out	Fri Aug 21 14:17:23 2009 +0200
@@ -0,0 +1,2 @@
+adding a
+n 644          2 2021-01-01 12:00:00 a