# HG changeset patch # User Thomas Arendsen Hein # Date 1193334056 -7200 # Node ID bff41174563ff7bd98889d4937af75e8fd0bfa69 # Parent b3afa6725082d8e1195f4ef032f143db9866acb5 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. diff --git a/mercurial/patch.py b/mercurial/patch.py --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -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 @@ class patchfile: 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()