tests/test-simple-update.t
author Manuel Jacob <me@manueljacob.de>
Wed, 10 Jun 2020 13:02:39 +0200
changeset 44991 f9734b2d59cc
parent 42529 d29db0a0c4eb
child 45467 65960fe9a769
permissions -rw-r--r--
py3: make stdout line-buffered if connected to a TTY Status messages that are to be shown on the terminal should be written to the file descriptor before anything further is done, to keep the user updated. One common way to achieve this is to make stdout line-buffered if it is connected to a TTY. This is done on Python 2 (except on Windows, where libc, which the CPython 2 streams depend on, does not properly support this). Python 3 rolls it own I/O streams. On Python 3, buffered binary streams can't be set line-buffered. The previous code (added in 227ba1afcb65) incorrectly assumed that on Python 3, pycompat.stdout (sys.stdout.buffer) is already line-buffered. However the interpreter initializes it with a block-buffered stream or an unbuffered stream (when the -u option or the PYTHONUNBUFFERED environment variable is set), never with a line-buffered stream. One example where the current behavior is unacceptable is when running `hg pull https://www.mercurial-scm.org/repo/hg` on Python 3, where the line "pulling from https://www.mercurial-scm.org/repo/hg" does not appear on the terminal before the hg process blocks while waiting for the server. Various approaches to fix this problem are possible, including: 1. Weaken the contract of procutil.stdout to not give any guarantees about buffering behavior. In this case, users of procutil.stdout need to be changed to do enough flushes. In particular, 1. either ui must insert enough flushes for ui.write() and friends, or 2. ui.write() and friends get split into flushing and fully buffered methods, or 3. users of ui.write() and friends must flush explicitly. 2. Make stdout unbuffered. 3. Make stdout line-buffered. Since Python 3 does not natively support that for binary streams, we must implement it ourselves. (2.) is problematic because using unbuffered I/O changes the performance characteristics significantly compared to line-buffered (which is used on Python 2) and this would be a regression. (1.2.) and (1.3) are a substantial amount of work. It’s unclear whether the added complexity would be justified, given that raw performance doesn’t matter that much when writing to a terminal much faster than the user could read it. (1.1.) pushes complexity into the ui class instead of separating the concern of how stdout is buffered. Other users of procutil.stdout would still need to take care of the flushes. This patch implements (3.). The general performance considerations are very similar to (1.1.). The extra method invocation and method forwarding add a little more overhead if the class is used. In exchange, it doesn’t add overhead if not used. For the benchmarks, I compared the previous implementation (incorrect on Python 3), (1.1.), (3.) and (2.). The command was chosen so that the streams were configured as if they were writing to a TTY, but actually write to a pager, which is also the default: HGRCPATH=/dev/null python3 ./hg --cwd ~/vcs/mozilla-central --time --pager yes --config pager.pager='cat > /dev/null' status --all previous: time: real 7.880 secs (user 7.290+0.050 sys 0.580+0.170) time: real 7.830 secs (user 7.220+0.070 sys 0.590+0.140) time: real 7.800 secs (user 7.210+0.050 sys 0.570+0.170) (1.1.) using Yuya Nishihara’s patch: time: real 9.860 secs (user 8.670+0.350 sys 1.160+0.830) time: real 9.540 secs (user 8.430+0.370 sys 1.100+0.770) time: real 9.830 secs (user 8.630+0.370 sys 1.180+0.840) (3.) using this patch: time: real 9.580 secs (user 8.480+0.350 sys 1.090+0.770) time: real 9.670 secs (user 8.480+0.330 sys 1.170+0.860) time: real 9.640 secs (user 8.500+0.350 sys 1.130+0.810) (2.) using a previous patch by me: time: real 10.480 secs (user 8.850+0.720 sys 1.590+1.500) time: real 10.490 secs (user 8.750+0.750 sys 1.710+1.470) time: real 10.240 secs (user 8.600+0.700 sys 1.590+1.510) As expected, there’s no difference on Python 2, as exactly the same code paths are used: previous: time: real 6.950 secs (user 5.870+0.330 sys 1.070+0.770) time: real 7.040 secs (user 6.040+0.360 sys 0.980+0.750) time: real 7.070 secs (user 5.950+0.360 sys 1.100+0.760) this patch: time: real 7.010 secs (user 5.900+0.390 sys 1.070+0.730) time: real 7.000 secs (user 5.850+0.350 sys 1.120+0.760) time: real 7.000 secs (user 5.790+0.380 sys 1.170+0.710)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13956
ffb5c09ba822 tests: remove redundant mkdir
Martin Geisler <mg@lazybytes.net>
parents: 12365
diff changeset
     1
  $ hg init test
12279
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
     2
  $ cd test
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
     3
  $ echo foo>foo
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
     4
  $ hg addremove
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
     5
  adding foo
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
     6
  $ hg commit -m "1"
331
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
     7
12279
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
     8
  $ hg verify
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
     9
  checking changesets
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    10
  checking manifests
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    11
  crosschecking files in changesets and manifests
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    12
  checking files
39506
f1186c292d03 verify: make output less confusing (issue5924)
Meirambek Omyrzak <meirambek77@gmail.com>
parents: 38731
diff changeset
    13
  checked 1 changesets with 1 changes to 1 files
12279
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    14
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    15
  $ hg clone . ../branch
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    16
  updating to branch default
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    17
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    18
  $ cd ../branch
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    19
  $ hg co
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    20
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    21
  $ echo bar>>foo
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    22
  $ hg commit -m "2"
331
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
    23
12279
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    24
  $ cd ../test
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    25
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    26
  $ hg pull ../branch
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    27
  pulling from ../branch
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    28
  searching for changes
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    29
  adding changesets
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    30
  adding manifests
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    31
  adding file changes
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    32
  added 1 changesets with 1 changes to 1 files
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 32958
diff changeset
    33
  new changesets 30aff43faee1
38262
d0abd7949ea3 phases: use "published" in the phase movement message
Boris Feld <boris.feld@octobus.net>
parents: 38261
diff changeset
    34
  1 local changesets published
12279
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    35
  (run 'hg update' to get a working copy)
331
55f63f3b6a54 Add a simple testing framework
mpm@selenic.com
parents:
diff changeset
    36
12279
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    37
  $ hg verify
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    38
  checking changesets
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    39
  checking manifests
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    40
  crosschecking files in changesets and manifests
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    41
  checking files
39506
f1186c292d03 verify: make output less confusing (issue5924)
Meirambek Omyrzak <meirambek77@gmail.com>
parents: 38731
diff changeset
    42
  checked 2 changesets with 2 changes to 1 files
12279
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    43
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    44
  $ hg co
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    45
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    46
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    47
  $ cat foo
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    48
  foo
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    49
  bar
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    50
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    51
  $ hg manifest --debug
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    52
  6f4310b00b9a147241b071a60c28a650827fb03d 644   foo
28e2e3804f2e combine tests
Adrian Buehlmann <adrian@cadifra.com>
parents: 3736
diff changeset
    53
13960
190e5f2043d9 update: fix check for no rev when a date is given
Idan Kamara <idankk86@gmail.com>
parents: 13956
diff changeset
    54
update to rev 0 with a date
190e5f2043d9 update: fix check for no rev when a date is given
Idan Kamara <idankk86@gmail.com>
parents: 13956
diff changeset
    55
190e5f2043d9 update: fix check for no rev when a date is given
Idan Kamara <idankk86@gmail.com>
parents: 13956
diff changeset
    56
  $ hg upd -d foo 0
190e5f2043d9 update: fix check for no rev when a date is given
Idan Kamara <idankk86@gmail.com>
parents: 13956
diff changeset
    57
  abort: you can't specify a revision and a date
190e5f2043d9 update: fix check for no rev when a date is given
Idan Kamara <idankk86@gmail.com>
parents: 13956
diff changeset
    58
  [255]
16913
f2719b387380 tests: add missing trailing 'cd ..'
Mads Kiilerich <mads@kiilerich.com>
parents: 13960
diff changeset
    59
40476
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    60
update to default destination (with empty revspec)
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    61
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    62
  $ hg update -q null
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    63
  $ hg update
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    64
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    65
  $ hg id
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    66
  30aff43faee1 tip
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    67
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    68
  $ hg update -q null
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    69
  $ hg update -r ''
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    70
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    71
  $ hg id
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    72
  30aff43faee1 tip
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    73
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    74
  $ hg update -q null
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    75
  $ hg update ''
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    76
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    77
  $ hg id
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    78
  30aff43faee1 tip
fbd5e2f0bba7 update: do not pass in user revspec as default destination (issue6044)
Yuya Nishihara <yuya@tcha.org>
parents: 39723
diff changeset
    79
16913
f2719b387380 tests: add missing trailing 'cd ..'
Mads Kiilerich <mads@kiilerich.com>
parents: 13960
diff changeset
    80
  $ cd ..
30881
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    81
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    82
update with worker processes
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    83
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    84
#if no-windows
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    85
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    86
  $ cat <<EOF > forceworker.py
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    87
  > from mercurial import extensions, worker
38731
ef3838a47503 worker: ability to disable thread unsafe tasks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38262
diff changeset
    88
  > def nocost(orig, ui, costperop, nops, threadsafe=True):
30881
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    89
  >     return worker._numworkers(ui) > 1
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    90
  > def uisetup(ui):
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    91
  >     extensions.wrapfunction(worker, 'worthwhile', nocost)
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    92
  > EOF
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    93
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    94
  $ hg init worker
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    95
  $ cd worker
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    96
  $ cat <<EOF >> .hg/hgrc
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    97
  > [extensions]
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    98
  > forceworker = $TESTTMP/forceworker.py
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
    99
  > [worker]
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
   100
  > numcpus = 4
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
   101
  > EOF
39723
5abc47d4ca6b tests: quote PYTHON usage
Matt Harbison <matt_harbison@yahoo.com>
parents: 39506
diff changeset
   102
  $ for i in `"$PYTHON" $TESTDIR/seq.py 1 100`; do
30881
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
   103
  >   echo $i > $i
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
   104
  > done
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
   105
  $ hg ci -qAm 'add 100 files'
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
   106
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
   107
  $ hg update null
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
   108
  0 files updated, 0 files merged, 100 files removed, 0 files unresolved
30882
a91c62752d08 worker: flush messages written by child processes before exit
Yuya Nishihara <yuya@tcha.org>
parents: 30881
diff changeset
   109
  $ hg update -v | grep 100
a91c62752d08 worker: flush messages written by child processes before exit
Yuya Nishihara <yuya@tcha.org>
parents: 30881
diff changeset
   110
  getting 100
30881
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
   111
  100 files updated, 0 files merged, 0 files removed, 0 files unresolved
42528
64a873ca7135 tests: show bug in update introduced in 87a34c767384
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 40476
diff changeset
   112
  $ hg status
30881
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
   113
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
   114
  $ cd ..
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
   115
92bca12328d1 worker: add basic test to ensure child processes are managed well
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
   116
#endif