# HG changeset patch # User Pierre-Yves David # Date 2021-11-17 11:24:00 # Node ID 08b060abd658d553b6fea7f3978df96e491122c2 # Parent 3d6eb119200dcdc2b88b83526e46c7953a95ab33 dirstate: move "get fs now" in the timestamp utility module We will need it during update. Differential Revision: https://phab.mercurial-scm.org/D11783 diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -66,16 +66,6 @@ class rootcache(filecache): return obj._join(fname) -def _getfsnow(vfs): - '''Get "now" timestamp on filesystem''' - tmpfd, tmpname = vfs.mkstemp() - try: - return timestamp.mtime_of(os.fstat(tmpfd)) - finally: - os.close(tmpfd) - vfs.unlink(tmpname) - - def requires_parents_change(func): def wrap(self, *args, **kwargs): if not self.pendingparentchange(): @@ -787,7 +777,7 @@ class dirstate(object): # https://www.mercurial-scm.org/wiki/DirstateTransactionPlan # record when mtime start to be ambiguous - now = _getfsnow(self._opener) + now = timestamp.get_fs_now(self._opener) # delay writing in-memory changes out tr.addfilegenerator( diff --git a/mercurial/dirstateutils/timestamp.py b/mercurial/dirstateutils/timestamp.py --- a/mercurial/dirstateutils/timestamp.py +++ b/mercurial/dirstateutils/timestamp.py @@ -6,6 +6,7 @@ from __future__ import absolute_import import functools +import os import stat @@ -54,6 +55,19 @@ class timestamp(tuple): return self_subsec_nanos > other_subsec_nanos +def get_fs_now(vfs): + """return a timestamp for "now" in the current vfs + + This will raise an exception if no temporary files could be created. + """ + tmpfd, tmpname = vfs.mkstemp() + try: + return mtime_of(os.fstat(tmpfd)) + finally: + os.close(tmpfd) + vfs.unlink(tmpname) + + def zero(): """ Returns the `timestamp` at the Unix epoch. diff --git a/tests/fakedirstatewritetime.py b/tests/fakedirstatewritetime.py --- a/tests/fakedirstatewritetime.py +++ b/tests/fakedirstatewritetime.py @@ -9,7 +9,6 @@ from __future__ import absolute_import from mercurial import ( context, - dirstate, dirstatemap as dirstatemapmod, extensions, policy, @@ -73,19 +72,19 @@ def fakewrite(ui, func): ) dirstatemapmod.dirstatemap.write = wrapper - orig_dirstate_getfsnow = dirstate._getfsnow + orig_get_fs_now = timestamp.get_fs_now wrapper = lambda *args: pack_dirstate(fakenow, orig_pack_dirstate, *args) orig_module = parsers orig_pack_dirstate = parsers.pack_dirstate orig_module.pack_dirstate = wrapper - dirstate._getfsnow = lambda *args: fakenow + timestamp.get_fs_now = lambda *args: fakenow try: return func() finally: orig_module.pack_dirstate = orig_pack_dirstate - dirstate._getfsnow = orig_dirstate_getfsnow + timestamp.get_fs_now = orig_get_fs_now if has_rust_dirstate: dirstatemapmod.dirstatemap.write = orig_dirstatemap_write