# HG changeset patch # User Patrick Mezard # Date 1335175924 -7200 # Node ID bfe89d65d651c9b83a15164e36c738c613b12666 # Parent c8ee349170459ccf565ab6524994712f6047733c update: make --check abort with dirty subrepos Aka "we could use dirty() but... yeah let's use it" diff -r c8ee34917045 -r bfe89d65d651 mercurial/commands.py --- 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() diff -r c8ee34917045 -r bfe89d65d651 mercurial/context.py --- 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())) diff -r c8ee34917045 -r bfe89d65d651 tests/test-update-branches.t --- 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