Only set mode of new patch if the target file was removed before.
If the file is writable by the user, but owned by a different user, the
chmod will otherwise fail with "Operation not permitted".
Additionally make very sure that the file is only written if either the number
of links is <= 1 or the file was successfully removed.
Maybe this minimal COW code should be replaced by something from util.
--- a/mercurial/patch.py Wed Oct 24 22:15:45 2007 +0200
+++ b/mercurial/patch.py Thu Oct 25 19:40:56 2007 +0200
@@ -9,7 +9,7 @@
from i18n import _
from node import *
import base85, cmdutil, mdiff, util, context, revlog, diffhelpers
-import cStringIO, email.Parser, os, popen2, re, sha
+import cStringIO, email.Parser, os, popen2, re, sha, errno
import sys, tempfile, zlib
class PatchError(Exception):
@@ -402,11 +402,13 @@
st = None
try:
st = os.lstat(dest)
- if st.st_nlink > 1:
- os.unlink(dest)
- except: pass
+ except OSError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ if st and st.st_nlink > 1:
+ os.unlink(dest)
fp = file(dest, 'wb')
- if st:
+ if st and st.st_nlink > 1:
os.chmod(dest, st.st_mode)
fp.writelines(self.lines)
fp.close()