update: make --check abort with dirty subrepos
Aka "we could use dirty() but... yeah let's use it"
--- a/mercurial/commands.py Mon Apr 23 12:09:54 2012 +0200
+++ b/mercurial/commands.py Mon Apr 23 12:12:04 2012 +0200
@@ -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()
--- a/mercurial/context.py Mon Apr 23 12:09:54 2012 +0200
+++ b/mercurial/context.py Mon Apr 23 12:12:04 2012 +0200
@@ -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()))
--- a/tests/test-update-branches.t Mon Apr 23 12:09:54 2012 +0200
+++ b/tests/test-update-branches.t Mon Apr 23 12:12:04 2012 +0200
@@ -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