tests/test-update-branches.t
author spectral <spectral@google.com>
Thu, 27 Sep 2018 20:16:48 -0700
changeset 39985 731961d972ba
parent 37964 ea63a2004d09
child 42899 34a46d48d24e
permissions -rw-r--r--
treemanifests: remove _loadalllazy in _diff() The benchmarks below use a similar setup as in ee7ee0c516ca and my other recent commits. Yes, in some cases this runs in literally 5% of the time it previously took. before = a6f8ab53 diff --git: repo | N | T | before (mean +- stdev) | after (mean +- stdev) | % of before ------+---+---+------------------------+-----------------------+------------ m-u | | | 1.301 s +- 0.004 s | 1.309 s +- 0.012 s | 100.6% m-u | | x | 1.303 s +- 0.009 s | 1.302 s +- 0.006 s | 99.9% m-u | x | | 1.308 s +- 0.006 s | 1.309 s +- 0.007 s | 100.1% m-u | x | x | 85.7 ms +- 0.6 ms | 86.0 ms +- 0.3 ms | 100.4% l-d-r | | | 197.5 ms +- 0.7 ms | 197.8 ms +- 2.2 ms | 100.2% l-d-r | | x | 199.4 ms +- 0.6 ms | 199.3 ms +- 0.9 ms | 99.9% l-d-r | x | | 86.1 ms +- 0.5 ms | 85.8 ms +- 0.9 ms | 99.7% l-d-r | x | x | 64.4 ms +- 0.4 ms | 64.4 ms +- 0.3 ms | 100.0% diff -c . --git: repo | N | T | before (mean +- stdev) | after (mean +- stdev) | % of before ------+---+---+------------------------+-----------------------+------------ m-u | | | 236.7 ms +- 1.1 ms | 236.5 ms +- 1.3 ms | 99.9% m-u | | x | 158.7 ms +- 1.0 ms | 128.0 ms +- 1.0 ms | 80.7% <-- m-u | x | | 239.7 ms +- 1.8 ms | 238.1 ms +- 1.5 ms | 99.3% m-u | x | x | 132.4 ms +- 0.9 ms | 132.3 ms +- 0.6 ms | 99.9% l-d-r | | | 81.8 ms +- 0.4 ms | 81.8 ms +- 0.3 ms | 100.0% l-d-r | | x | 3.894 s +- 0.017 s | 193.6 ms +- 0.4 ms | 5.0% <-- l-d-r | x | | 106.9 ms +- 0.4 ms | 106.6 ms +- 0.3 ms | 99.7% l-d-r | x | x | 182.7 ms +- 0.8 ms | 183.3 ms +- 0.9 ms | 100.3% rebase -r . --keep -d .^^: repo | N | T | before (mean +- stdev) | after (mean +- stdev) | % of before ------+---+---+------------------------+-----------------------+------------ m-u | | | 5.615 s +- 0.109 s | 5.562 s +- 0.015 s | 99.1% m-u | | x | 5.701 s +- 0.027 s | 5.715 s +- 0.023 s | 100.2% m-u | x | | 5.572 s +- 0.128 s | 5.613 s +- 0.182 s | 100.7% m-u | x | x | 633.3 ms +- 28.7 ms | 636.2 ms +- 13.8 ms | 100.5% l-d-r | | | 666.4 ms +- 17.0 ms | 658.5 ms +- 9.3 ms | 98.8% l-d-r | | x | 6.520 s +- 0.070 s | 6.505 s +- 0.026 s | 99.8% l-d-r | x | | 279.0 ms +- 13.0 ms | 276.5 ms +- 4.7 ms | 99.1% l-d-r | x | x | 1.636 s +- 0.058 s | 1.657 s +- 0.014 s | 101.3% status --change . --copies: repo | N | T | before (mean +- stdev) | after (mean +- stdev) | % of before ------+---+---+------------------------+-----------------------+------------ m-u | | | 218.6 ms +- 1.4 ms | 217.9 ms +- 1.5 ms | 99.7% m-u | | x | 138.5 ms +- 0.4 ms | 108.4 ms +- 0.2 ms | 78.3% <-- m-u | x | | 220.1 ms +- 1.3 ms | 219.7 ms +- 1.5 ms | 99.8% m-u | x | x | 113.2 ms +- 0.4 ms | 112.4 ms +- 0.8 ms | 99.3% l-d-r | | | 80.2 ms +- 0.3 ms | 80.6 ms +- 0.6 ms | 100.5% l-d-r | | x | 3.899 s +- 0.020 s | 194.8 ms +- 4.0 ms | 5.0% <-- l-d-r | x | | 83.4 ms +- 0.8 ms | 83.2 ms +- 0.2 ms | 99.8% l-d-r | x | x | 732.2 ms +- 4.3 ms | 194.9 ms +- 1.0 ms | 26.6% <-- status --copies: repo | N | T | before (mean +- stdev) | after (mean +- stdev) | % of before ------+---+---+------------------------+-----------------------+------------ m-u | | | 1.917 s +- 0.005 s | 1.914 s +- 0.004 s | 99.8% m-u | | x | 1.909 s +- 0.012 s | 1.934 s +- 0.004 s | 101.3% m-u | x | | 1.915 s +- 0.005 s | 1.904 s +- 0.004 s | 99.4% m-u | x | x | 94.8 ms +- 0.3 ms | 94.7 ms +- 0.2 ms | 99.9% l-d-r | | | 593.9 ms +- 1.2 ms | 594.6 ms +- 9.4 ms | 100.1% l-d-r | | x | 595.2 ms +- 3.8 ms | 597.2 ms +- 2.6 ms | 100.3% l-d-r | x | | 182.5 ms +- 1.6 ms | 182.1 ms +- 0.6 ms | 99.8% l-d-r | x | x | 149.6 ms +- 0.9 ms | 149.1 ms +- 0.8 ms | 99.7% update $rev^; ~/src/hg/hg{hg}/hg update $rev: repo | N | T | before (mean +- stdev) | after (mean +- stdev) | % of before ------+---+---+------------------------+-----------------------+------------ m-u | | | 3.121 s +- 0.007 s | 3.129 s +- 0.012 s | 100.3% m-u | | x | 2.972 s +- 0.011 s | 2.981 s +- 0.012 s | 100.3% m-u | x | | 3.144 s +- 0.014 s | 3.141 s +- 0.011 s | 99.9% m-u | x | x | 312.2 ms +- 2.4 ms | 312.3 ms +- 2.1 ms | 100.0% l-d-r | | | 444.4 ms +- 4.3 ms | 446.9 ms +- 5.3 ms | 100.6% l-d-r | | x | 9.159 s +- 0.069 s | 9.182 s +- 0.040 s | 100.3% l-d-r | x | | 254.6 ms +- 1.6 ms | 255.2 ms +- 1.6 ms | 100.2% l-d-r | x | x | 1.525 s +- 0.007 s | 1.577 s +- 0.007 s | 103.4% <--? Differential Revision: https://phab.mercurial-scm.org/D4845

# Construct the following history tree:
#
# @  5:e1bb631146ca  b1
# |
# o  4:a4fdb3b883c4 0:b608b9236435  b1
# |
# | o  3:4b57d2520816 1:44592833ba9f
# | |
# | | o  2:063f31070f65
# | |/
# | o  1:44592833ba9f
# |/
# o  0:b608b9236435

  $ mkdir b1
  $ cd b1
  $ 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
  $ hg up -q 1
  $ echo three > a ; hg ci -qm3
  $ hg up -q 0
  $ hg branch -q b1
  $ echo four > a ; hg ci -qm4
  $ echo five > a ; hg ci -qm5

Initial repo state:

  $ hg log -G --template '{rev}:{node|short} {parents} {branches}\n'
  @  5:ff252e8273df  b1
  |
  o  4:d047485b3896 0:60829823a42a  b1
  |
  | o  3:6efa171f091b 1:0786582aa4b1
  | |
  | | o  2:bd10386d478c
  | |/
  | o  1:0786582aa4b1
  |/
  o  0:60829823a42a
  

Make sure update doesn't assume b1 is a repository if invoked from outside:

  $ cd ..
  $ hg update b1
  abort: no repository found in '$TESTTMP' (.hg not found)!
  [255]
  $ cd b1

Test helper functions:

  $ revtest () {
  >     msg=$1
  >     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 -S
  > }

  $ norevtest () {
  >     msg=$1
  >     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 -S
  > }

Test cases are documented in a table in the update function of merge.py.
Cases are run as shown in that table, row by row.

  $ norevtest 'none clean linear' clean 4
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  parent=5

  $ norevtest 'none clean same'   clean 2
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
  updated to "bd10386d478c: 2"
  1 other heads for branch "default"
  parent=2


  $ revtest 'none clean linear' clean 1 2
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  parent=2

  $ revtest 'none clean same'   clean 2 3
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  parent=3

  $ revtest 'none clean cross'  clean 3 4
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  parent=4


  $ revtest 'none dirty linear' dirty 1 2
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  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: uncommitted changes
  (commit or update --clean to discard changes)
  parent=2
  M foo

  $ revtest 'none dirtysub same'   dirtysub 2 3
  abort: uncommitted changes
  (commit or update --clean to discard changes)
  parent=2
  M sub/suba

  $ revtest 'none dirty cross'  dirty 3 4
  abort: uncommitted changes
  (commit or update --clean to discard changes)
  parent=3
  M foo

  $ norevtest 'none dirty cross'  dirty 2
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
  updated to "bd10386d478c: 2"
  1 other heads for branch "default"
  parent=2
  M foo

  $ revtest 'none dirtysub cross'  dirtysub 3 4
  abort: uncommitted changes
  (commit or update --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
  parent=2

  $ revtest '-c dirty linear'   dirty 1 2 -c
  abort: uncommitted changes
  parent=1
  M foo

  $ revtest '-m dirty linear'   dirty 1 2 -m
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  parent=2
  M foo

  $ revtest '-m dirty cross'  dirty 3 4 -m
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  parent=4
  M foo

  $ revtest '-c dirtysub linear'   dirtysub 1 2 -c
  abort: uncommitted changes in subrepository "sub"
  parent=1
  M sub/suba

  $ norevtest '-c clean same'   clean 2 -c
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
  updated to "bd10386d478c: 2"
  1 other heads for branch "default"
  parent=2

  $ revtest '-cC dirty linear'  dirty 1 2 -cC
  abort: can only specify one of -C/--clean, -c/--check, or -m/--merge
  parent=1
  M foo

  $ revtest '-mc dirty linear'  dirty 1 2 -mc
  abort: can only specify one of -C/--clean, -c/--check, or -m/--merge
  parent=1
  M foo

  $ revtest '-mC dirty linear'  dirty 1 2 -mC
  abort: can only specify one of -C/--clean, -c/--check, or -m/--merge
  parent=1
  M foo

  $ echo '[commands]' >> .hg/hgrc
  $ echo 'update.check = abort' >> .hg/hgrc

  $ revtest 'none dirty linear' dirty 1 2
  abort: uncommitted changes
  parent=1
  M foo

  $ revtest 'none dirty linear' dirty 1 2 -c
  abort: uncommitted changes
  parent=1
  M foo

  $ revtest 'none dirty linear' dirty 1 2 -C
  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
  parent=2

  $ echo 'update.check = none' >> .hg/hgrc

  $ revtest 'none dirty cross'  dirty 3 4
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  parent=4
  M foo

  $ revtest 'none dirty linear' dirty 1 2
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  parent=2
  M foo

  $ revtest 'none dirty linear' dirty 1 2 -c
  abort: uncommitted changes
  parent=1
  M foo

  $ revtest 'none dirty linear' dirty 1 2 -C
  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
  parent=2

  $ hg co -qC 3
  $ echo dirty >> a
  $ hg co --tool :merge3 4
  merging a
  warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
  0 files updated, 0 files merged, 0 files removed, 1 files unresolved
  use 'hg resolve' to retry unresolved file merges
  [1]
  $ hg st
  M a
  ? a.orig
  $ cat a
  <<<<<<< working copy: 6efa171f091b - test: 3
  three
  dirty
  ||||||| base
  three
  =======
  four
  >>>>>>> destination:  d047485b3896 b1 - test: 4
  $ rm a.orig

  $ echo 'update.check = noconflict' >> .hg/hgrc

  $ revtest 'none dirty cross'  dirty 3 4
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  parent=4
  M foo

  $ revtest 'none dirty linear' dirty 1 2
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  parent=2
  M foo

  $ revtest 'none dirty linear' dirty 1 2 -c
  abort: uncommitted changes
  parent=1
  M foo

  $ revtest 'none dirty linear' dirty 1 2 -C
  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
  parent=2

Locally added file is allowed
  $ hg up -qC 3
  $ echo a > bar
  $ hg add bar
  $ hg up -q 4
  $ hg st
  A bar
  $ hg forget bar
  $ rm bar

Locally removed file is allowed
  $ hg up -qC 3
  $ hg rm foo
  $ hg up -q 4

File conflict is not allowed
  $ hg up -qC 3
  $ echo dirty >> a
  $ hg up -q 4
  abort: conflicting changes
  (commit or update --clean to discard changes)
  [255]
  $ hg up -m 4
  merging a
  warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
  0 files updated, 0 files merged, 0 files removed, 1 files unresolved
  use 'hg resolve' to retry unresolved file merges
  [1]
  $ rm a.orig

Change/delete conflict is not allowed
  $ hg up -qC 3
  $ hg rm foo
  $ hg up -q 4

Uses default value of "linear" when value is misspelled
  $ echo 'update.check = linyar' >> .hg/hgrc

  $ revtest 'dirty cross'  dirty 3 4
  abort: uncommitted changes
  (commit or update --clean to discard changes)
  parent=3
  M foo

Setup for later tests
  $ revtest 'none dirty linear' dirty 1 2 -c
  abort: uncommitted changes
  parent=1
  M foo

  $ cd ..

Test updating to null revision

  $ hg init null-repo
  $ cd null-repo
  $ echo a > a
  $ hg add a
  $ hg ci -m a
  $ hg up -qC 0
  $ echo b > b
  $ hg add b
  $ hg up null
  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
  $ hg st
  A b
  $ hg up -q 0
  $ hg st
  A b
  $ hg up -qC null
  $ hg st
  ? b
  $ cd ..

Test updating with closed head
---------------------------------------------------------------------

  $ hg clone -U -q b1 closed-heads
  $ cd closed-heads

Test updating if at least one non-closed branch head exists

if on the closed branch head:
- update to "."
- "updated to a closed branch head ...." message is displayed
- "N other heads for ...." message is displayed

  $ hg update -q -C 3
  $ hg commit --close-branch -m 6
  $ norevtest "on closed branch head" clean 6
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
  no open descendant heads on branch "default", updating to a closed head
  (committing will reopen the head, use 'hg heads .' to see 1 other heads)
  parent=6

if descendant non-closed branch head exists, and it is only one branch head:
- update to it, even if its revision is less than closed one
- "N other heads for ...." message isn't displayed

  $ norevtest "non-closed 2 should be chosen" clean 1
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  parent=2

if all descendant branch heads are closed, but there is another branch head:
- update to the tipmost descendant head
- "updated to a closed branch head ...." message is displayed
- "N other heads for ...." message is displayed

  $ norevtest "all descendant branch heads are closed" clean 3
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
  no open descendant heads on branch "default", updating to a closed head
  (committing will reopen the head, use 'hg heads .' to see 1 other heads)
  parent=6

Test updating if all branch heads are closed

if on the closed branch head:
- update to "."
- "updated to a closed branch head ...." message is displayed
- "all heads of branch ...." message is displayed

  $ hg update -q -C 2
  $ hg commit --close-branch -m 7
  $ norevtest "all heads of branch default are closed" clean 6
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
  no open descendant heads on branch "default", updating to a closed head
  (committing will reopen branch "default")
  parent=6

if not on the closed branch head:
- update to the tipmost descendant (closed) head
- "updated to a closed branch head ...." message is displayed
- "all heads of branch ...." message is displayed

  $ norevtest "all heads of branch default are closed" clean 1
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  no open descendant heads on branch "default", updating to a closed head
  (committing will reopen branch "default")
  parent=7

  $ cd ..

Test updating if "default" branch doesn't exist and no revision is
checked out (= "default" is used as current branch)

  $ hg init no-default-branch
  $ cd no-default-branch

  $ hg branch foobar
  marked working directory as branch foobar
  (branches are permanent and global, did you want a bookmark?)
  $ echo a > a
  $ hg commit -m "#0" -A
  adding a
  $ echo 1 >> a
  $ hg commit -m "#1"
  $ hg update -q 0
  $ echo 3 >> a
  $ hg commit -m "#2"
  created new head
  $ hg commit --close-branch -m "#3"

if there is at least one non-closed branch head:
- update to the tipmost branch head

  $ norevtest "non-closed 1 should be chosen" clean null
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  parent=1

if all branch heads are closed
- update to "tip"
- "updated to a closed branch head ...." message is displayed
- "all heads for branch "XXXX" are closed" message is displayed

  $ hg update -q -C 1
  $ hg commit --close-branch -m "#4"

  $ norevtest "all branches are closed" clean null
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  no open descendant heads on branch "foobar", updating to a closed head
  (committing will reopen branch "foobar")
  parent=4

  $ cd ../b1

Test obsolescence behavior
---------------------------------------------------------------------

successors should be taken in account when checking head destination

  $ cat << EOF >> $HGRCPATH
  > [ui]
  > logtemplate={rev}:{node|short} {desc|firstline}
  > [experimental]
  > evolution.createmarkers=True
  > EOF

Test no-argument update to a successor of an obsoleted changeset

  $ hg log -G
  o  5:ff252e8273df 5
  |
  o  4:d047485b3896 4
  |
  | o  3:6efa171f091b 3
  | |
  | | o  2:bd10386d478c 2
  | |/
  | @  1:0786582aa4b1 1
  |/
  o  0:60829823a42a 0
  
  $ hg book bm -r 3
  $ hg status
  M foo

We add simple obsolescence marker between 3 and 4 (indirect successors)

  $ hg id --debug -i -r 3
  6efa171f091b00a3c35edc15d48c52a498929953
  $ hg id --debug -i -r 4
  d047485b3896813b2a624e86201983520f003206
  $ hg debugobsolete 6efa171f091b00a3c35edc15d48c52a498929953 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  obsoleted 1 changesets
  $ hg debugobsolete aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa d047485b3896813b2a624e86201983520f003206

Test that 5 is detected as a valid destination from 3 and also accepts moving
the bookmark (issue4015)

  $ hg up --quiet --hidden 3
  $ hg up 5
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ hg book bm
  moving bookmark 'bm' forward from 6efa171f091b
  $ hg bookmarks
   * bm                        5:ff252e8273df

Test that we abort before we warn about the hidden commit if the working
directory is dirty
  $ echo conflict > a
  $ hg up --hidden 3
  abort: uncommitted changes
  (commit or update --clean to discard changes)
  [255]

Test that we still warn also when there are conflicts
  $ hg up -m --hidden 3
  merging a
  warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
  0 files updated, 0 files merged, 0 files removed, 1 files unresolved
  use 'hg resolve' to retry unresolved file merges
  (leaving bookmark bm)
  updated to hidden changeset 6efa171f091b
  (hidden revision '6efa171f091b' was rewritten as: d047485b3896)
  [1]
  $ hg revert -r . a
  $ hg resolve -m
  (no more unresolved files)

Test that 4 is detected as the no-argument destination from 3 and also moves
the bookmark with it
  $ hg up --quiet 0          # we should be able to update to 3 directly
  $ hg up --quiet --hidden 3 # but not implemented yet.
  updated to hidden changeset 6efa171f091b
  (hidden revision '6efa171f091b' was rewritten as: d047485b3896)
  $ hg book -f bm
  $ hg up
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  updating bookmark bm
  $ hg book
   * bm                        4:d047485b3896

Test that 5 is detected as a valid destination from 1
  $ hg up --quiet 0          # we should be able to update to 3 directly
  $ hg up --quiet --hidden 3 # but not implemented yet.
  updated to hidden changeset 6efa171f091b
  (hidden revision '6efa171f091b' was rewritten as: d047485b3896)
  $ hg up 5
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved

Test that 5 is not detected as a valid destination from 2
  $ hg up --quiet 0
  $ hg up --quiet 2
  $ hg up 5
  abort: uncommitted changes
  (commit or update --clean to discard changes)
  [255]

Test that we don't crash when updating from a pruned changeset (i.e. has no
successors). Behavior should probably be that we update to the first
non-obsolete parent but that will be decided later.
  $ hg id --debug -r 2
  bd10386d478cd5a9faf2e604114c8e6da62d3889
  $ hg up --quiet 0
  $ hg up --quiet 2
  $ hg debugobsolete bd10386d478cd5a9faf2e604114c8e6da62d3889
  obsoleted 1 changesets
  $ hg up
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved

Test experimental revset support

  $ hg log -r '_destupdate()'
  2:bd10386d478c 2 (no-eol)

Test that boolean flags allow --no-flag specification to override [defaults]
  $ cat >> $HGRCPATH <<EOF
  > [defaults]
  > update = --check
  > EOF
  $ hg co 2
  abort: uncommitted changes
  [255]
  $ hg co --no-check 2
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved