patch: return list of modified files even when an exception is raised
authorBrendan Cully <brendan@kublai.com>
Wed, 18 Oct 2006 10:37:34 -0700
changeset 3465 2d35a8d2b32d
parent 3464 ba3a96750de0
child 3466 8b55c0ba8048
patch: return list of modified files even when an exception is raised The file list is passed in as an argument and updated in place. This fixes issue399.
hgext/mq.py
mercurial/commands.py
mercurial/patch.py
--- a/hgext/mq.py	Wed Oct 18 10:37:34 2006 -0700
+++ b/hgext/mq.py	Wed Oct 18 10:37:34 2006 -0700
@@ -408,14 +408,15 @@
     def patch(self, repo, patchfile):
         '''Apply patchfile  to the working directory.
         patchfile: file name of patch'''
+        files = {}
         try:
-            (files, fuzz) = patch.patch(patchfile, self.ui, strip=1,
-                                        cwd=repo.root)
+            fuzz = patch.patch(patchfile, self.ui, strip=1, cwd=repo.root,
+                               files=files)
         except Exception, inst:
             self.ui.note(str(inst) + '\n')
             if not self.ui.verbose:
                 self.ui.warn("patch failed, unable to continue (try -v)\n")
-            return (False, [], False)
+            return (False, files, False)
 
         return (True, files, fuzz)
 
--- a/mercurial/commands.py	Wed Oct 18 10:37:34 2006 -0700
+++ b/mercurial/commands.py	Wed Oct 18 10:37:34 2006 -0700
@@ -1656,8 +1656,12 @@
                 message = None
             ui.debug(_('message:\n%s\n') % message)
 
-            files, fuzz = patch.patch(tmpname, ui, strip=strip, cwd=repo.root)
-            files = patch.updatedir(ui, repo, files, wlock=wlock)
+            files = {}
+            try:
+                fuzz = patch.patch(tmpname, ui, strip=strip, cwd=repo.root,
+                                   files=files)
+            finally:
+                files = patch.updatedir(ui, repo, files, wlock=wlock)
             repo.commit(files, message, user, date, wlock=wlock, lock=lock)
         finally:
             os.unlink(tmpname)
--- a/mercurial/patch.py	Wed Oct 18 10:37:34 2006 -0700
+++ b/mercurial/patch.py	Wed Oct 18 10:37:34 2006 -0700
@@ -266,14 +266,13 @@
     tmpfp.close()
     return patchname
 
-def patch(patchname, ui, strip=1, cwd=None):
+def patch(patchname, ui, strip=1, cwd=None, files={}):
     """apply the patch <patchname> to the working directory.
     a list of patched files is returned"""
 
     # helper function
     def __patch(patchname):
         """patch and updates the files and fuzz variables"""
-        files = {}
         fuzz = False
 
         patcher = util.find_in_path('gpatch', os.environ.get('PATH', ''),
@@ -308,25 +307,24 @@
         if code:
             raise util.Abort(_("patch command failed: %s") %
                              util.explain_exit(code)[0])
-        return files, fuzz
+        return fuzz
 
     (dopatch, gitpatches) = readgitpatch(patchname)
+    for gp in gitpatches:
+        files[gp.path] = (gp.op, gp)
 
-    files, fuzz = {}, False
+    fuzz = False
     if dopatch:
         if dopatch in ('filter', 'binary'):
             patchname = dogitpatch(patchname, gitpatches, cwd=cwd)
         try:
             if dopatch != 'binary':
-                files, fuzz = __patch(patchname)
+                fuzz = __patch(patchname)
         finally:
             if dopatch == 'filter':
                 os.unlink(patchname)
 
-    for gp in gitpatches:
-        files[gp.path] = (gp.op, gp)
-
-    return (files, fuzz)
+    return fuzz
 
 def diffopts(ui, opts={}):
     return mdiff.diffopts(