patch: pass an opener to patchfile
authorPatrick Mezard <pmezard@gmail.com>
Wed, 19 Nov 2008 13:27:57 +0100
changeset 7391 27d304c8cc03
parent 7390 0d1c770c6be1
child 7392 564326a6ef9c
patch: pass an opener to patchfile
hgext/keyword.py
mercurial/patch.py
--- a/hgext/keyword.py	Tue Nov 18 13:20:55 2008 +0100
+++ b/hgext/keyword.py	Wed Nov 19 13:27:57 2008 +0100
@@ -487,10 +487,10 @@
                 del wlock, lock
 
     # monkeypatches
-    def kwpatchfile_init(orig, self, ui, fname, missing=False):
+    def kwpatchfile_init(orig, self, ui, fname, opener, missing=False):
         '''Monkeypatch/wrap patch.patchfile.__init__ to avoid
         rejects or conflicts due to expanded keywords in working dir.'''
-        orig(self, ui, fname, missing)
+        orig(self, ui, fname, opener, missing)
         # shrink keywords read from working dir
         self.lines = kwt.shrinklines(self.fname, self.lines)
 
--- a/mercurial/patch.py	Tue Nov 18 13:20:55 2008 +0100
+++ b/mercurial/patch.py	Wed Nov 19 13:27:57 2008 +0100
@@ -228,27 +228,24 @@
 contextdesc = re.compile('(---|\*\*\*) (\d+)(,(\d+))? (---|\*\*\*)')
 
 class patchfile:
-    def __init__(self, ui, fname, missing=False):
+    def __init__(self, ui, fname, opener, missing=False):
         self.fname = fname
+        self.opener = opener
         self.ui = ui
         self.lines = []
         self.exists = False
         self.missing = missing
         if not missing:
             try:
-                fp = file(fname, 'rb')
+                fp = self.opener(fname, 'r')
                 self.lines = fp.readlines()
+                fp.close()
                 self.exists = True
             except IOError:
                 pass
         else:
             self.ui.warn(_("unable to find '%s' for patching\n") % self.fname)
 
-        if not self.exists:
-            dirname = os.path.dirname(fname)
-            if dirname and not os.path.isdir(dirname):
-                os.makedirs(dirname)
-
         self.hash = {}
         self.dirty = 0
         self.offset = 0
@@ -307,32 +304,25 @@
         self.ui.warn(
             _("%d out of %d hunks FAILED -- saving rejects to file %s\n") %
             (len(self.rej), self.hunks, fname))
-        fp = file(fname, 'wb')
         base = os.path.basename(self.fname)
+        fp = self.opener(fname, 'w')        
         fp.write("--- %s\n+++ %s\n" % (base, base))
         for x in self.rej:
             for l in x.hunk:
                 fp.write(l)
                 if l[-1] != '\n':
                     fp.write("\n\ No newline at end of file\n")
+        fp.close()
 
     def write(self, dest=None):
-        if self.dirty:
-            if not dest:
-                dest = self.fname
-            st = None
-            try:
-                st = os.lstat(dest)
-            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 and st.st_nlink > 1:
-                os.chmod(dest, st.st_mode)
-            fp.writelines(self.lines)
-            fp.close()
+        if not self.dirty:
+            return
+        if not dest:
+            dest = self.fname
+        fp = self.opener(dest, 'w')
+        for l in self.lines:
+            fp.write(l)
+        fp.close()
 
     def close(self):
         self.write()
@@ -935,6 +925,7 @@
     err = 0
     current_file = None
     gitpatches = None
+    opener = util.opener(os.getcwd())
 
     def closefile():
         if not current_file:
@@ -957,11 +948,11 @@
             afile, bfile, first_hunk = values
             try:
                 if sourcefile:
-                    current_file = patchfile(ui, sourcefile)
+                    current_file = patchfile(ui, sourcefile, opener)
                 else:
                     current_file, missing = selectfile(afile, bfile, first_hunk,
                                             strip, reverse)
-                    current_file = patchfile(ui, current_file, missing)
+                    current_file = patchfile(ui, current_file, opener, missing)
             except PatchError, err:
                 ui.warn(str(err) + '\n')
                 current_file, current_hunk = None, None