[PATCH stable] dirstate.write: don't ignore stat data if mtime is in the future (issue1790)

Adrian Buehlmann adrian at cadifra.com
Fri Aug 21 10:50:55 CDT 2009


# HG changeset patch
# User Adrian Buehlmann <adrian at cadifra.com>
# Date 1250857043 -7200
# Node ID cab3d06cc7ee4672d9bfd28ab38e568de80473e9
# Parent  f4f17d5695d2972ae4126f5a676a1e573ededaa1
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).

diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py
--- a/mercurial/dirstate.py
+++ b/mercurial/dirstate.py
@@ -377,9 +377,9 @@ class dirstate(object):
             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 @@ class dirstate(object):
         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)
diff --git a/tests/test-dirstate-future b/tests/test-dirstate-future
new file mode 100755
--- /dev/null
+++ b/tests/test-dirstate-future
@@ -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
diff --git a/tests/test-dirstate-future.out b/tests/test-dirstate-future.out
new file mode 100644
--- /dev/null
+++ b/tests/test-dirstate-future.out
@@ -0,0 +1,2 @@
+adding a
+n 644          2 2021-01-01 12:00:00 a


More information about the Mercurial-devel mailing list