diff --git a/hgext/largefiles/overrides.py b/hgext/largefiles/overrides.py --- a/hgext/largefiles/overrides.py +++ b/hgext/largefiles/overrides.py @@ -667,7 +667,7 @@ 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, '') @@ -675,7 +675,7 @@ 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) diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py --- a/mercurial/cmdutil.py +++ b/mercurial/cmdutil.py @@ -1187,7 +1187,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/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