D2729: copyfile: preserve stat info (mtime, etc.) when doing copies/renames
spectral (Kyle Lippincott)
phabricator at mercurial-scm.org
Mon Mar 12 21:58:24 UTC 2018
spectral updated this revision to Diff 6965.
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D2729?vs=6964&id=6965
REVISION DETAIL
https://phab.mercurial-scm.org/D2729
AFFECTED FILES
hgext/largefiles/overrides.py
mercurial/cmdutil.py
tests/test-rename.t
CHANGE DETAILS
diff --git a/tests/test-rename.t b/tests/test-rename.t
--- a/tests/test-rename.t
+++ b/tests/test-rename.t
@@ -657,3 +657,24 @@
[255]
$ hg status -C
+check that stat information such as mtime is preserved - it's unclear whether
+the `touch` and `stat` commands are portable, so we mimic them using python.
+Not all platforms support precision of even one-second granularity, so we allow
+a rather generous fudge factor here; 1234567890 is 2009, and the primary thing
+we care about is that it's not the machine's current time; hopefully it's really
+unlikely for a machine to have such a broken clock that this test fails. :)
+
+ $ mkdir mtime
+Create the file (as empty), then update its mtime and atime to be 1234567890.
+ >>> import os
+ >>> filename = "mtime/f"
+ >>> mtime = 1234567890
+ >>> open(filename, "w").close()
+ >>> os.utime(filename, (mtime, mtime))
+ $ hg ci -qAm 'add mtime dir'
+ $ hg mv -q mtime mtime2
+ >>> from __future__ import print_function
+ >>> import os
+ >>> filename = "mtime2/f"
+ >>> print(os.stat(filename).st_mtime < 1234567999)
+ True
diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -1186,7 +1186,7 @@
os.rename(src, tmp)
os.rename(tmp, target)
else:
- util.copyfile(src, target)
+ util.copyfile(src, target, copystat=True)
srcexists = True
except IOError as inst:
if inst.errno == errno.ENOENT:
diff --git a/hgext/largefiles/overrides.py b/hgext/largefiles/overrides.py
--- a/hgext/largefiles/overrides.py
+++ b/hgext/largefiles/overrides.py
@@ -667,15 +667,15 @@
try:
origcopyfile = util.copyfile
copiedfiles = []
- def overridecopyfile(src, dest):
+ def overridecopyfile(src, dest, *args, **kwargs):
if (lfutil.shortname in src and
dest.startswith(repo.wjoin(lfutil.shortname))):
destlfile = dest.replace(lfutil.shortname, '')
if not opts['force'] and os.path.exists(destlfile):
raise IOError('',
_('destination largefile already exists'))
copiedfiles.append((src, dest))
- origcopyfile(src, dest)
+ origcopyfile(src, dest, *args, **kwargs)
util.copyfile = overridecopyfile
result += orig(ui, repo, listpats, opts, rename)
To: spectral, #hg-reviewers, durin42
Cc: durin42, mercurial-devel
More information about the Mercurial-devel
mailing list