Unify mq and hg patch invocation.
authorBrendan Cully <brendan@kublai.com>
Tue, 15 Aug 2006 11:28:50 -0700
changeset 2919 b70740aefa4d
parent 2918 68cea0b8f992
child 2920 ef8ee4477019
child 2921 addb58e3b41c
Unify mq and hg patch invocation. This makes patch a little less verbose by default, so the tests had to be updated.
hgext/mq.py
mercurial/commands.py
mercurial/patch.py
tests/test-git-import.out
tests/test-import.out
--- a/hgext/mq.py	Tue Aug 15 11:43:31 2006 -0700
+++ b/hgext/mq.py	Tue Aug 15 11:28:50 2006 -0700
@@ -400,39 +400,15 @@
         '''Apply patchfile  to the working directory.
         patchfile: file name of patch'''
         try:
-            pp = util.find_in_path('gpatch', os.environ.get('PATH', ''), 'patch')
-            f = os.popen("%s -d %s -p1 --no-backup-if-mismatch < %s" %
-                         (pp, util.shellquote(repo.root), util.shellquote(patchfile)))
-        except:
-            self.ui.warn("patch failed, unable to continue (try -v)\n")
-            return (None, [], False)
-        files = []
-        fuzz = False
-        for l in f:
-            l = l.rstrip('\r\n');
-            if self.ui.verbose:
-                self.ui.warn(l + "\n")
-            if l[:14] == 'patching file ':
-                pf = os.path.normpath(util.parse_patch_output(l))
-                if pf not in files:
-                    files.append(pf)
-                printed_file = False
-                file_str = l
-            elif l.find('with fuzz') >= 0:
-                if not printed_file:
-                    self.ui.warn(file_str + '\n')
-                    printed_file = True
-                self.ui.warn(l + '\n')
-                fuzz = True
-            elif l.find('saving rejects to file') >= 0:
-                self.ui.warn(l + '\n')
-            elif l.find('FAILED') >= 0:
-                if not printed_file:
-                    self.ui.warn(file_str + '\n')
-                    printed_file = True
-                self.ui.warn(l + '\n')
+            (files, fuzz) = patch.patch(patchfile, self.ui, strip=1,
+                                        cwd=repo.root)
+        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 (not f.close(), files, fuzz)
+        return (True, files.keys(), fuzz)
 
     def apply(self, repo, series, list=False, update_status=True,
               strict=False, patchdir=None, merge=None, wlock=None):
--- a/mercurial/commands.py	Tue Aug 15 11:43:31 2006 -0700
+++ b/mercurial/commands.py	Tue Aug 15 11:28:50 2006 -0700
@@ -1681,7 +1681,7 @@
                 message = None
             ui.debug(_('message:\n%s\n') % message)
 
-            files = patch.patch(strip, tmpname, ui, cwd=repo.root)
+            files, fuzz = patch.patch(tmpname, ui, strip=strip, cwd=repo.root)
             removes = []
             if len(files) > 0:
                 cfiles = files.keys()
--- a/mercurial/patch.py	Tue Aug 15 11:43:31 2006 -0700
+++ b/mercurial/patch.py	Tue Aug 15 11:28:50 2006 -0700
@@ -215,13 +215,14 @@
     tmpfp.close()
     return patchname
 
-def patch(strip, patchname, ui, cwd=None):
+def patch(patchname, ui, strip=1, cwd=None):
     """apply the patch <patchname> to the working directory.
     a list of patched files is returned"""
 
     (dopatch, gitpatches) = readgitpatch(patchname)
 
     files = {}
+    fuzz = False
     if dopatch:
         if dopatch == 'filter':
             patchname = dogitpatch(patchname, gitpatches)
@@ -237,10 +238,25 @@
 
         for line in fp:
             line = line.rstrip()
-            ui.status("%s\n" % line)
+            ui.note(line + '\n')
             if line.startswith('patching file '):
                 pf = util.parse_patch_output(line)
+                printed_file = False
                 files.setdefault(pf, (None, None))
+            elif line.find('with fuzz') >= 0:
+                fuzz = True
+                if not printed_file:
+                    ui.warn(pf + '\n')
+                    printed_file = True
+                ui.warn(line + '\n')
+            elif line.find('saving rejects to file') >= 0:
+                ui.warn(line + '\n')
+            elif line.find('FAILED') >= 0:
+                if not printed_file:
+                    ui.warn(pf + '\n')
+                    printed_file = True
+                ui.warn(line + '\n')
+            
         code = fp.close()
         if code:
             raise util.Abort(_("patch command failed: %s") %
@@ -249,7 +265,7 @@
     for gp in gitpatches:
         files[gp.path] = (gp.op, gp)
 
-    return files
+    return (files, fuzz)
 
 def diff(repo, node1=None, node2=None, files=None, match=util.always,
          fp=None, changes=None, opts=None):
--- a/tests/test-git-import.out	Tue Aug 15 11:43:31 2006 -0700
+++ b/tests/test-git-import.out	Tue Aug 15 11:28:50 2006 -0700
@@ -1,6 +1,5 @@
 % new file
 applying patch from stdin
-patching file new
 % chmod +x
 applying patch from stdin
 % copy
@@ -14,15 +13,12 @@
 rename
 % delete
 applying patch from stdin
-patching file copyx
 new
 rename
 % regular diff
 applying patch from stdin
-patching file rename
 % copy and modify
 applying patch from stdin
-patching file copy2
 a
 a
 b
@@ -30,7 +26,6 @@
 a
 % rename and modify
 applying patch from stdin
-patching file rename2
 copy2: No such file or directory
 a
 a
--- a/tests/test-import.out	Tue Aug 15 11:43:31 2006 -0700
+++ b/tests/test-import.out	Tue Aug 15 11:28:50 2006 -0700
@@ -8,7 +8,6 @@
 added 1 changesets with 2 changes to 2 files
 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
 applying ../tip.patch
-patching file a
 % message should be same
 summary:     second change
 % committer should be same
@@ -21,7 +20,6 @@
 added 1 changesets with 2 changes to 2 files
 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
 applying ../tip.patch
-patching file a
 transaction abort!
 rollback completed
 % import of plain diff should be ok with message
@@ -32,7 +30,6 @@
 added 1 changesets with 2 changes to 2 files
 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
 applying ../tip.patch
-patching file a
 % import from stdin
 requesting all changes
 adding changesets
@@ -41,7 +38,6 @@
 added 1 changesets with 2 changes to 2 files
 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
 applying patch from stdin
-patching file a
 % override commit message
 requesting all changes
 adding changesets
@@ -50,7 +46,6 @@
 added 1 changesets with 2 changes to 2 files
 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
 applying patch from stdin
-patching file a
 summary:     override
 % plain diff in email, subject, message body
 requesting all changes
@@ -60,7 +55,6 @@
 added 1 changesets with 2 changes to 2 files
 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
 applying ../msg.patch
-patching file a
 user:        email patcher
 summary:     email patch
 % plain diff in email, no subject, message body
@@ -71,7 +65,6 @@
 added 1 changesets with 2 changes to 2 files
 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
 applying patch from stdin
-patching file a
 % plain diff in email, subject, no message body
 requesting all changes
 adding changesets
@@ -80,7 +73,6 @@
 added 1 changesets with 2 changes to 2 files
 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
 applying patch from stdin
-patching file a
 % plain diff in email, no subject, no message body, should fail
 requesting all changes
 adding changesets
@@ -89,7 +81,6 @@
 added 1 changesets with 2 changes to 2 files
 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
 applying patch from stdin
-patching file a
 transaction abort!
 rollback completed
 % hg export in email, should use patch header
@@ -100,7 +91,6 @@
 added 1 changesets with 2 changes to 2 files
 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
 applying patch from stdin
-patching file a
 summary:     second change
 % hg import in a subdirectory
 requesting all changes
@@ -110,7 +100,6 @@
 added 1 changesets with 2 changes to 2 files
 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
 applying ../../../tip.patch
-patching file a
 % message should be 'subdir change'
 summary:     subdir change
 % committer should be 'someoneelse'