[PATCH 7 of 7] mq: add --empty option to qdelete to remove empty patches

Idan Kamara idankk86 at gmail.com
Tue May 24 11:26:13 CDT 2011


# HG changeset patch
# User Idan Kamara <idankk86 at gmail.com>
# Date 1306254023 -10800
# Node ID 025fd4d81b4ee30ecddf6d3fd04a3d556d03c1c2
# Parent  c21a4febed3f70f2b84b2c8b8cf88ec8269b37ef
mq: add --empty option to qdelete to remove empty patches

diff -r c21a4febed3f -r 025fd4d81b4e hgext/mq.py
--- a/hgext/mq.py	Tue May 24 19:17:22 2011 +0300
+++ b/hgext/mq.py	Tue May 24 19:20:23 2011 +0300
@@ -731,7 +731,17 @@
                 break
         return (err, n)
 
-    def _cleanup(self, patches, numrevs, keep=False):
+    def _cleanup(self, patches, numrevs, keep=False, emptyonly=False):
+        if emptyonly:
+            def isempty(patchfile):
+                try:
+                    ph = patchheader(self.join(patchfile), self.plainmode)
+                    return not ph.haspatch
+                except IOError:
+                    # don't delete failed to read files
+                    return False
+            patches = [p for p in patches if isempty(p)]
+
         if not keep:
             r = self.qrepo()
             if r:
@@ -797,8 +807,13 @@
 
     def delete(self, repo, patches, opts):
         if not patches and not opts.get('rev'):
-            raise util.Abort(_('qdelete requires at least one revision or '
-                               'patch name'))
+            if opts.get('empty'):
+                patches = self.series[self.series_end(True):]
+                if not patches:
+                    return
+            else:
+                raise util.Abort(_('qdelete requires at least one revision or '
+                                   'patch name or --empty'))
 
         realpatches = []
         for patch in patches:
@@ -822,7 +837,7 @@
             realpatches += revpatches
             numrevs = len(revpatches)
 
-        self._cleanup(realpatches, numrevs, opts.get('keep'))
+        self._cleanup(realpatches, numrevs, opts.get('keep'), opts.get('empty'))
 
     def check_toppatch(self, repo):
         if self.applied:
@@ -1858,13 +1873,15 @@
 @command("qdelete|qremove|qrm",
          [('k', 'keep', None, _('keep patch file')),
           ('r', 'rev', [],
-           _('stop managing a revision (DEPRECATED)'), _('REV'))],
-         _('hg qdelete [-k] [PATCH]...'))
+           _('stop managing a revision (DEPRECATED)'), _('REV')),
+          ('', 'empty', False, _('delete only empty patches'))],
+         _('hg qdelete [-k] [--empty] [PATCH]...'))
 def delete(ui, repo, *patches, **opts):
     """remove patches from queue
 
-    The patches must not be applied, and at least one patch is required. With
-    -k/--keep, the patch files are preserved in the patch directory.
+    The patches must not be applied, and at least one patch is required or
+    the --empty flag.
+    With -k/--keep, the patch files are preserved in the patch directory.
 
     To stop managing a patch and move it into permanent history,
     use the :hg:`qfinish` command."""
diff -r c21a4febed3f -r 025fd4d81b4e tests/test-mq-qdelete.t
--- a/tests/test-mq-qdelete.t	Tue May 24 19:17:22 2011 +0300
+++ b/tests/test-mq-qdelete.t	Tue May 24 19:20:23 2011 +0300
@@ -13,13 +13,118 @@
   $ hg qnew -d '1 0' pc
 
   $ hg qdel
-  abort: qdelete requires at least one revision or patch name
+  abort: qdelete requires at least one revision or patch name or --empty
   [255]
 
   $ hg qdel pc
   abort: cannot delete applied patch pc
   [255]
 
+test --empty
+
+  $ hg qpop -a
+  popping pc
+  popping pb
+  popping pa
+  patch queue now empty
+
+all patches are empty, no applied patches
+
+  $ hg qser
+  pa
+  pb
+  pc
+  $ hg qdel --empty
+  $ hg qser
+
+with applied patches
+
+  $ hg qnew -d '1 0' pa
+  $ hg qnew -d '1 0' pb
+  $ hg qnew -d '1 0' pc
+  $ hg qpop pa
+  popping pc
+  popping pb
+  now at: pa
+  $ hg qser
+  pa
+  pb
+  pc
+  $ hg qdel --empty
+  $ hg qser
+  pa
+
+all patches are not empty
+
+  $ echo a >> base
+  $ hg qref
+  $ hg qnew -d '1 0' pb
+  $ echo b >> base
+  $ hg qref
+  $ hg qnew -d '1 0' pc
+  $ echo c >> base
+  $ hg qref
+  $ hg qpop -a
+  popping pc
+  popping pb
+  popping pa
+  patch queue now empty
+
+  $ hg qser
+  pa
+  pb
+  pc
+  $ hg qdel --empty
+  $ hg qser
+  pa
+  pb
+  pc
+
+one patch is empty
+
+  $ hg qpush pb
+  applying pa
+  applying pb
+  now at: pb
+  $ hg qref -
+  $ hg up -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg qref
+  $ hg qpop -a
+  popping pb
+  popping pa
+  patch queue now empty
+
+  $ hg qser
+  pa
+  pb
+  pc
+  $ hg qdel --empty
+  $ hg qser
+  pa
+  pc
+
+specific empty patch
+
+  $ hg qpush
+  applying pa
+  now at: pa
+  $ hg qnew -d '1 0' pb
+  $ hg qpop
+  popping pb
+  now at: pa
+  $ hg qdel --empty pb
+  $ hg qser
+  pa
+  pc
+  $ hg qpop -a
+  popping pa
+  patch queue now empty
+  $ hg qdel pa pc
+  $ hg qnew -d '1 0' pa
+  $ hg qnew -d '1 0' pb
+  $ hg qnew -d '1 0' pc
+
   $ hg qpop
   popping pc
   now at: pb


More information about the Mercurial-devel mailing list