[PATCH 2 of 3] update: make --check abort with dirty subrepos

Patrick Mezard patrick at mezard.eu
Mon Apr 23 07:36:27 CDT 2012


# HG changeset patch
# User Patrick Mezard <patrick at mezard.eu>
# Date 1335175924 -7200
# Branch stable
# Node ID 5707b5278142998ab7d26750bc196f1692fbe666
# Parent  5e70ed4d13ffb1e931b05afc04affe66eb893480
update: make --check abort with dirty subrepos

Aka "we could use dirty() but... yeah let's use it"

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -5660,9 +5660,8 @@
         rev = cmdutil.finddate(ui, repo, date)
 
     if check:
-        # we could use dirty() but we can ignore merge and branch trivia
         c = repo[None]
-        if c.modified() or c.added() or c.removed():
+        if c.dirty(merge=False, branch=False):
             raise util.Abort(_("uncommitted local changes"))
         if rev is None:
             rev = repo[repo[None].branch()].rev()
diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -940,14 +940,15 @@
         return sorted(self._repo.dirstate.walk(match, self.substate.keys(),
                                                True, False))
 
-    def dirty(self, missing=False):
+    def dirty(self, missing=False, merge=True, branch=True):
         "check whether a working directory is modified"
         # check subrepos first
         for s in self.substate:
             if self.sub(s).dirty():
                 return True
         # check current working dir
-        return (self.p2() or self.branch() != self.p1().branch() or
+        return ((merge and self.p2()) or
+                (branch and self.branch() != self.p1().branch()) or
                 self.modified() or self.added() or self.removed() or
                 (missing and self.deleted()))
 
diff --git a/tests/test-update-branches.t b/tests/test-update-branches.t
--- a/tests/test-update-branches.t
+++ b/tests/test-update-branches.t
@@ -15,6 +15,11 @@
   $ hg init
   $ echo foo > foo
   $ echo zero > a
+  $ hg init sub
+  $ echo suba > sub/suba
+  $ hg --cwd sub ci -Am addsuba
+  adding suba
+  $ echo 'sub = sub' > .hgsub
   $ hg ci -qAm0
   $ echo one > a ; hg ci -m1
   $ echo two > a ; hg ci -m2
@@ -29,44 +34,46 @@
 
   $ hg --config 'extensions.graphlog=' \
   >    glog --template '{rev}:{node|short} {parents} {branches}\n'
-  @  5:e1bb631146ca  b1
+  @  5:ff252e8273df  b1
   |
-  o  4:a4fdb3b883c4 0:b608b9236435  b1
+  o  4:d047485b3896 0:60829823a42a  b1
   |
-  | o  3:4b57d2520816 1:44592833ba9f
+  | o  3:6efa171f091b 1:0786582aa4b1
   | |
-  | | o  2:063f31070f65
+  | | o  2:bd10386d478c
   | |/
-  | o  1:44592833ba9f
+  | o  1:0786582aa4b1
   |/
-  o  0:b608b9236435
+  o  0:60829823a42a
   
 
 Test helper functions:
 
   $ revtest () {
   >     msg=$1
-  >     dirtyflag=$2   # 'clean' or 'dirty'
+  >     dirtyflag=$2   # 'clean', 'dirty' or 'dirtysub'
   >     startrev=$3
   >     targetrev=$4
   >     opt=$5
   >     hg up -qC $startrev
   >     test $dirtyflag = dirty && echo dirty > foo
+  >     test $dirtyflag = dirtysub && echo dirty > sub/suba
   >     hg up $opt $targetrev
   >     hg parent --template 'parent={rev}\n'
-  >     hg stat
+  >     hg stat -S
   > }    
 
   $ norevtest () {
   >     msg=$1
-  >     dirtyflag=$2   # 'clean' or 'dirty'
+  >     dirtyflag=$2   # 'clean', 'dirty' or 'dirtysub'
   >     startrev=$3
   >     opt=$4
   >     hg up -qC $startrev
   >     test $dirtyflag = dirty && echo dirty > foo
+  >     test $dirtyflag = dirtysub && echo dirty > sub/suba
   >     hg up $opt
   >     hg parent --template 'parent={rev}\n'
-  >     hg stat
+  >     hg stat -S
   > }    
 
 Test cases are documented in a table in the update function of merge.py.
@@ -99,16 +106,30 @@
   parent=2
   M foo
 
+  $ revtest 'none dirtysub linear' dirtysub 1 2
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  parent=2
+  M sub/suba
+
   $ revtest 'none dirty same'   dirty 2 3
   abort: crosses branches (merge branches or use --clean to discard changes)
   parent=2
   M foo
 
+  $ revtest 'none dirtysub same'   dirtysub 2 3
+  abort: crosses branches (merge branches or use --clean to discard changes)
+  parent=2
+  M sub/suba
+
   $ revtest 'none dirty cross'  dirty 3 4
   abort: crosses branches (merge branches or use --clean to discard changes)
   parent=3
   M foo
 
+  $ revtest 'none dirtysub cross'  dirtysub 3 4
+  abort: crosses branches (merge branches or use --clean to discard changes)
+  parent=3
+  M sub/suba
 
   $ revtest '-C dirty linear'   dirty 1 2 -C
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
@@ -119,6 +140,11 @@
   parent=1
   M foo
 
+  $ revtest '-c dirtysub linear'   dirtysub 1 2 -c
+  abort: uncommitted local changes
+  parent=1
+  M sub/suba
+
   $ norevtest '-c clean same'   clean 2 -c
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   parent=3


More information about the Mercurial-devel mailing list