changeset 16653:73b8c2554be8

mq: introduce qpop --check qpop --check let you qpop with uncommitted files if they do not intersect with files touched by the popped patches.
author Patrick Mezard <patrick@mezard.eu>
date Sat, 12 May 2012 00:19:30 +0200
parents 1388cc711ea7
children 490ed8972f1b
files hgext/mq.py tests/test-mq-qpush-fail.t
diffstat 2 files changed, 60 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/mq.py	Tue May 08 15:31:00 2012 -0700
+++ b/hgext/mq.py	Sat May 12 00:19:30 2012 +0200
@@ -1299,7 +1299,9 @@
             wlock.release()
 
     def pop(self, repo, patch=None, force=False, update=True, all=False,
-            nobackup=False):
+            nobackup=False, check=False):
+        if force and check:
+            raise util.Abort(_('cannot use both --force and --check'))
         wlock = repo.wlock()
         try:
             if patch:
@@ -1346,9 +1348,12 @@
 
             tobackup = set()
             if update:
-                m, a, r, d = self.checklocalchanges(repo, force=force)
-                if not nobackup and force:
-                    tobackup.update(m + a)
+                m, a, r, d = self.checklocalchanges(repo, force=force or check)
+                if force:
+                    if not nobackup:
+                        tobackup.update(m + a)
+                elif check:
+                    tobackup.update(m + a + r + d)
 
             self.applieddirty = True
             end = len(self.applied)
@@ -1379,8 +1384,10 @@
                 if d:
                     raise util.Abort(_("deletions found between repo revs"))
 
-                # backup local changes in --force case
-                self.backup(repo, set(a + m + r) & tobackup)
+                tobackup = set(a + m + r) & tobackup
+                if check and tobackup:
+                    self.localchangesfound()
+                self.backup(repo, tobackup)
 
                 for f in a:
                     try:
@@ -2672,15 +2679,21 @@
          [('a', 'all', None, _('pop all patches')),
           ('n', 'name', '',
            _('queue name to pop (DEPRECATED)'), _('NAME')),
+          ('c', 'check', None, _('tolerate non-conflicting local changes')),
           ('f', 'force', None, _('forget any local changes to patched files')),
           ('', 'no-backup', None, _('do not save backup copies of files'))],
          _('hg qpop [-a] [-f] [PATCH | INDEX]'))
 def pop(ui, repo, patch=None, **opts):
     """pop the current patch off the stack
 
-    By default, pops off the top of the patch stack. If given a patch
-    name, keeps popping off patches until the named patch is at the
-    top of the stack.
+    Without argument, pops off the top of the patch stack. If given a
+    patch name, keeps popping off patches until the named patch is at
+    the top of the stack.
+
+    By default, abort if the working directory contains uncommitted
+    changes. With -c/--check, abort only if the uncommitted files
+    overlap with patched files. With -f/--force, backup and discard
+    changes made to such files.
 
     Return 0 on success.
     """
@@ -2692,7 +2705,8 @@
     else:
         q = repo.mq
     ret = q.pop(repo, patch, force=opts.get('force'), update=localupdate,
-                all=opts.get('all'), nobackup=opts.get('no_backup'))
+                all=opts.get('all'), nobackup=opts.get('no_backup'),
+                check=opts.get('check'))
     q.savedirty()
     return ret
 
--- a/tests/test-mq-qpush-fail.t	Tue May 08 15:31:00 2012 -0700
+++ b/tests/test-mq-qpush-fail.t	Sat May 12 00:19:30 2012 +0200
@@ -202,6 +202,42 @@
   $ test -f a.orig && echo 'error: backup with --no-backup'
   [1]
 
+test qpop --check
+
+  $ hg qpush
+  applying p1
+  now at: p1
+  $ hg qpop --check --force
+  abort: cannot use both --force and --check
+  [255]
+  $ echo a >> a
+  $ hg qpop --check
+  abort: local changes found, refresh first
+  [255]
+  $ hg revert -qa a
+  $ rm a
+  $ hg qpop --check
+  abort: local changes found, refresh first
+  [255]
+  $ hg rm -A a
+  $ hg qpop --check
+  abort: local changes found, refresh first
+  [255]
+  $ hg revert -qa a
+  $ echo b > b
+  $ hg add b
+  $ hg qpop --check
+  abort: local changes found, refresh first
+  [255]
+  $ hg forget b
+  $ echo d > d
+  $ hg add d
+  $ hg qpop --check
+  popping p1
+  patch queue now empty
+  $ hg forget d
+  $ rm d
+
 test qpush --force and backup files
 
   $ echo a >> a