[PATCH] backout of d04ba50e104d: allow to qpop/push with a dirty working copy

Idan Kamara idankk86 at gmail.com
Fri Jun 24 15:40:34 CDT 2011


# HG changeset patch
# User Idan Kamara <idankk86 at gmail.com>
# Date 1308947142 -10800
# Branch stable
# Node ID e9ed3506f066fe5ca88db31fbdea76e0244a9d7f
# Parent  f5765353d4300a879ec44590ee658cd78736053c
backout of d04ba50e104d: allow to qpop/push with a dirty working copy

The new behavior was breaking existing tools that relied on a sequence such as
this:

1) start with a dirty working copy
2) qimport some patch
3) try to qpush it
4) old behavior would fail at this point due to outstanding changes.
   (new behavior would only fail if the outstanding changes and the patches
   changes intersect)
5) innocent user qrefreshes, gets his local changes in the imported patch

It's worth considering if we can move this behavior to -f in the future.

diff -r f5765353d430 -r e9ed3506f066 hgext/mq.py
--- a/hgext/mq.py	Fri Jun 24 13:35:03 2011 -0500
+++ b/hgext/mq.py	Fri Jun 24 23:25:42 2011 +0300
@@ -1134,6 +1134,8 @@
             if start == len(self.series):
                 self.ui.warn(_('patch series already fully applied\n'))
                 return 1
+            if not force:
+                self.checklocalchanges(repo, refresh=self.applied)
 
             if exact:
                 if move:
@@ -1172,19 +1174,6 @@
                 end = self.series.index(patch, start) + 1
 
             s = self.series[start:end]
-
-            if not force:
-                mm, aa, rr, dd = repo.status()[:4]
-                wcfiles = set(mm + aa + rr + dd)
-                if wcfiles:
-                    for patchname in s:
-                        pf = os.path.join(self.path, patchname)
-                        patchfiles = patchmod.changedfiles(self.ui, repo, pf)
-                        if wcfiles.intersection(patchfiles):
-                            self.localchangesfound(self.applied)
-            elif mergeq:
-                self.checklocalchanges(refresh=self.applied)
-
             all_files = set()
             try:
                 if mergeq:
@@ -1265,6 +1254,9 @@
                         break
                 update = needupdate
 
+            if not force and update:
+                self.checklocalchanges(repo)
+
             self.applieddirty = 1
             end = len(self.applied)
             rev = self.applied[start].node
@@ -1287,12 +1279,6 @@
                 qp = self.qparents(repo, rev)
                 ctx = repo[qp]
                 m, a, r, d = repo.status(qp, top)[:4]
-                parentfiles = set(m + a + r + d)
-                if not force and parentfiles:
-                    mm, aa, rr, dd = repo.status()[:4]
-                    wcfiles = set(mm + aa + rr + dd)
-                    if wcfiles.intersection(parentfiles):
-                        self.localchangesfound()
                 if d:
                     raise util.Abort(_("deletions found between repo revs"))
                 for f in a:
diff -r f5765353d430 -r e9ed3506f066 tests/test-mq-qpush-exact.t
--- a/tests/test-mq-qpush-exact.t	Fri Jun 24 13:35:03 2011 -0500
+++ b/tests/test-mq-qpush-exact.t	Fri Jun 24 23:25:42 2011 +0300
@@ -163,12 +163,8 @@
   $ hg update 1 -q
   $ echo c0 >> f0
   $ hg qpush -e
-  applying p0
-  now at: p0
-  $ cat f0
-  c0
-  $ hg qpop -aq
-  patch queue now empty
+  abort: local changes found
+  [255]
   $ hg qpush -ef
   applying p0
   now at: p0
@@ -182,13 +178,8 @@
   $ hg update 1 -q
   $ echo c0 >> f0
   $ hg qpush -e p1
-  applying p0
-  applying p1
-  now at: p1
-  $ cat f0
-  c0
-  $ hg qpop -aq
-  patch queue now empty
+  abort: local changes found
+  [255]
   $ hg qpush -e p1 -f
   applying p0
   applying p1
diff -r f5765353d430 -r e9ed3506f066 tests/test-mq.t
--- a/tests/test-mq.t	Fri Jun 24 13:35:03 2011 -0500
+++ b/tests/test-mq.t	Fri Jun 24 23:25:42 2011 +0300
@@ -1259,65 +1259,6 @@
   now at: changea
   $ cd ..
 
-test qpop with local changes, issue2780
-
-  $ hg init forcepop
-  $ cd forcepop
-  $ echo 1 > 1
-  $ hg ci -Am 1
-  adding 1
-  $ hg qnew foo
-  $ echo 2 > 2
-  $ hg add
-  adding 2
-
-unrelated changes
-
-  $ hg qpop
-  popping foo
-  patch queue now empty
-
-related changes
-
-  $ hg forget 2
-  $ rm 2
-  $ hg qpush
-  applying foo
-  patch foo is empty
-  now at: foo
-  $ echo 2 >> 1
-  $ hg qrefresh
-  $ echo 2 >> 1
-  $ hg qpop
-  abort: local changes found, refresh first
-  [255]
-  $ hg st
-  M 1
-
-related changes with force
-  $ hg qpop --force
-  popping foo
-  patch queue now empty
-  $ hg st
-
-related renamed source without change
-  $ hg qpush
-  applying foo
-  now at: foo
-  $ echo 1 > 1
-  $ hg mv 1 2
-  $ hg qref --git
-  $ hg qpop
-  popping foo
-  patch queue now empty
-  $ echo 3 > 1
-  $ hg st
-  M 1
-  $ hg qpush
-  abort: local changes found
-  [255]
-  $ cd ..
-
 test qpush with --force, issue1087
 
   $ hg init forcepush
@@ -1334,9 +1275,16 @@
   $ echo world >> hello.txt
 
 
-apply, should not discard changes with empty patch
+qpush should fail, local changes
 
   $ hg qpush
+  abort: local changes found
+  [255]
+
+
+apply force, should not discard changes with empty patch
+
+  $ hg qpush -f
   applying empty
   patch empty is empty
   now at: empty


More information about the Mercurial-devel mailing list