Patchwork [2,of,3,STABLE] vfs: ignore EPERM at os.utime, which avoids ambiguity at renaming (issue5418)

login
register
mail settings
Submitter Katsunori FUJIWARA
Date Nov. 12, 2016, 9:16 p.m.
Message ID <bff5ccbe5ead56aac7ff.1478985369@feefifofum>
Download mbox | patch
Permalink /patch/17528/
State Accepted
Delegated to: Yuya Nishihara
Headers show

Comments

Katsunori FUJIWARA - Nov. 12, 2016, 9:16 p.m.
# HG changeset patch
# User FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
# Date 1478985116 -32400
#      Sun Nov 13 06:11:56 2016 +0900
# Branch stable
# Node ID bff5ccbe5ead56aac7fff30f48a486007d469f3f
# Parent  b496a464399cb68628b09e52aa8cf379c98428e6
vfs: ignore EPERM at os.utime, which avoids ambiguity at renaming (issue5418)

According to POSIX specification, just having group write access to a
file causes EPERM at invocation of os.utime() with an explicit time
information (e.g. working on the repository shared by group access
permission).

To ignore EPERM at renaming in such case, this patch makes
vfs.rename() use filestat.avoidambig() introduced by previous patch.

Patch

diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
--- a/mercurial/scmutil.py
+++ b/mercurial/scmutil.py
@@ -390,8 +390,7 @@  class abstractvfs(object):
             newstat = util.filestat(dstpath)
             if newstat.isambig(oldstat):
                 # stat of renamed file is ambiguous to original one
-                advanced = (oldstat.stat.st_mtime + 1) & 0x7fffffff
-                os.utime(dstpath, (advanced, advanced))
+                newstat.avoidambig(dstpath, oldstat)
             return ret
         return util.rename(self.join(src), dstpath)