Patchwork [4,of,4,V2] shelve: allow shelving of a change with an mq patch applied

login
register
mail settings
Submitter David Soria Parra
Date Oct. 1, 2013, 10:29 a.m.
Message ID <5855de925923648eed88.1380623364@achird.localdomain>
Download mbox | patch
Permalink /patch/2686/
State Accepted
Commit 28b1b7b9b4a9b580f71ae8cb3e82f4d0a914a768
Headers show

Comments

David Soria Parra - Oct. 1, 2013, 10:29 a.m.
# HG changeset patch
# User David Soria Parra <dsp@experimentalworks.net>
# Date 1377793335 25200
#      Thu Aug 29 09:22:15 2013 -0700
# Node ID 5855de925923648eed889772bb3704c28da22ec4
# Parent  03f034cfe01eb249cf4a3856d9a3d0e3e01deed7
shelve: allow shelving of a change with an mq patch applied

We allow shelving of of changes on top of a MQ repository. MQ will
not allow repository changes on top of applied patches. We introduce
checkapplied in MQ to bypass this check.
Matt Mackall - Oct. 2, 2013, 12:04 a.m.
On Tue, 2013-10-01 at 12:29 +0200, David Soria Parra wrote:
> # HG changeset patch
> # User David Soria Parra <dsp@experimentalworks.net>
> # Date 1377793335 25200
> #      Thu Aug 29 09:22:15 2013 -0700
> # Node ID 5855de925923648eed889772bb3704c28da22ec4
> # Parent  03f034cfe01eb249cf4a3856d9a3d0e3e01deed7
> shelve: allow shelving of a change with an mq patch applied
> 
> We allow shelving of of changes on top of a MQ repository. MQ will
> not allow repository changes on top of applied patches. We introduce
> checkapplied in MQ to bypass this check.

These are queued for default, thanks.

Patch

diff --git a/hgext/mq.py b/hgext/mq.py
--- a/hgext/mq.py
+++ b/hgext/mq.py
@@ -347,6 +347,7 @@ 
         except error.ConfigError:
             self.gitmode = ui.config('mq', 'git', 'auto').lower()
         self.plainmode = ui.configbool('mq', 'plain', False)
+        self.checkapplied = True
 
     @util.propertycache
     def applied(self):
@@ -3264,7 +3265,7 @@ 
             return queue(self.ui, self.baseui, self.path)
 
         def abortifwdirpatched(self, errmsg, force=False):
-            if self.mq.applied and not force:
+            if self.mq.applied and self.mq.checkapplied and not force:
                 parents = self.dirstate.parents()
                 patches = [s.node for s in self.mq.applied]
                 if parents[0] in patches or parents[1] in patches:
@@ -3280,7 +3281,7 @@ 
                                               editor, extra)
 
         def checkpush(self, force, revs):
-            if self.mq.applied and not force:
+            if self.mq.applied and self.mq.checkapplied and not force:
                 outapplied = [e.node for e in self.mq.applied]
                 if revs:
                     # Assume applied patches have no non-patch descendants and
diff --git a/hgext/shelve.py b/hgext/shelve.py
--- a/hgext/shelve.py
+++ b/hgext/shelve.py
@@ -156,7 +156,11 @@ 
         # check modified, added, removed, deleted only
         for flist in repo.status(match=match)[:4]:
             shelvedfiles.extend(flist)
-        return repo.commit(message, user, opts.get('date'), match)
+        saved, repo.mq.checkapplied = repo.mq.checkapplied, False
+        try:
+            return repo.commit(message, user, opts.get('date'), match)
+        finally:
+            repo.mq.checkapplied = saved
 
     if parent.node() != nullid:
         desc = parent.description().split('\n', 1)[0]
diff --git a/tests/test-shelve.t b/tests/test-shelve.t
--- a/tests/test-shelve.t
+++ b/tests/test-shelve.t
@@ -1,7 +1,9 @@ 
   $ echo "[extensions]" >> $HGRCPATH
+  $ echo "mq=" >> $HGRCPATH
   $ echo "shelve=" >> $HGRCPATH
   $ echo "[defaults]" >> $HGRCPATH
   $ echo "diff = --nodates --git" >> $HGRCPATH
+  $ echo "qnew = --date '0 0'" >> $HGRCPATH
 
   $ hg init repo
   $ cd repo
@@ -33,11 +35,12 @@ 
   nothing changed
   [1]
 
-create another commit
+create an mq patch - shelving should work fine with a patch applied
 
   $ echo n > n
   $ hg add n
   $ hg commit n -m second
+  $ hg qnew second.patch
 
 shelve a change that we will delete later
 
@@ -79,11 +82,11 @@ 
 ensure that our shelved changes exist
 
   $ hg shelve -l
-  default-01      (*)    second (glob)
-  default         (*)    second (glob)
+  default-01      (*)    [mq]: second.patch (glob)
+  default         (*)    [mq]: second.patch (glob)
 
   $ hg shelve -l -p default
-  default         (*)    second (glob)
+  default         (*)    [mq]: second.patch (glob)
   
   diff --git a/a/a b/a/a
   --- a/a/a
@@ -95,6 +98,7 @@ 
 delete our older shelved change
 
   $ hg shelve -d default
+  $ hg qfinish -a -q
 
 local edits should prevent a shelved change from applying
 
@@ -203,11 +207,11 @@ 
 ensure that we have a merge with unresolved conflicts
 
   $ hg heads -q
-  3:6ea6529cfc65
-  2:ceefc37abe1e
+  4:cebf2b8de087
+  3:2e69b451d1ea
   $ hg parents -q
-  2:ceefc37abe1e
-  3:6ea6529cfc65
+  3:2e69b451d1ea
+  4:cebf2b8de087
   $ hg status
   M a/a
   M b.rename/b
@@ -268,9 +272,9 @@ 
   $ hg unshelve -a
   unshelve of 'default' aborted
   $ hg heads -q
-  2:ceefc37abe1e
+  3:2e69b451d1ea
   $ hg parents
-  changeset:   2:ceefc37abe1e
+  changeset:   3:2e69b451d1ea
   tag:         tip
   user:        test
   date:        Thu Jan 01 00:00:00 1970 +0000
@@ -314,14 +318,14 @@ 
 ensure the repo is as we hope
 
   $ hg parents
-  changeset:   2:ceefc37abe1e
+  changeset:   3:2e69b451d1ea
   tag:         tip
   user:        test
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     second
   
   $ hg heads -q
-  2:ceefc37abe1e
+  3:2e69b451d1ea
 
   $ hg status -C
   M a/a
@@ -386,7 +390,7 @@ 
   merging a/a
   0 files updated, 1 files merged, 0 files removed, 0 files unresolved
   $ hg parents -q
-  4:be7e79683c99
+  5:01ba9745dc5a
   $ hg shelve -l
   $ hg status
   M a/a