##// END OF EJS Templates
repository: define manifest interfaces...
repository: define manifest interfaces The long march towards declaring interfaces for repository primitives continues. This commit essentially defines interfaces based on the following types: * manifest.manifestdict -> imanifestdict * manifest.manifestlog -> imanifestlog * manifest.memmanifestctx -> imanifestrevisionwritable * manifest.manifestctx -> imanifestrevisionstored * manifest.memtreemanifestctx -> imanifestrevisionwritable * manifest.treemanifestctx -> imanifestrevisionstored * util.dirs -> idirs The interfaces are thoroughly documented. Their documentation is now better than the documentation in manifest.py in many cases. With the exception of util.dirs, classes have been annotated with their interfaces. (I didn't feel like util.dirs needed the proper interface treatment.) Tests have been added demonstrating that all classes and instances conform to their interfaces. This work was much easier than filelogs. That's because Durham did an excellent job formalizing the manifest API a while back. There are still some minor kludges with the interfaces that should probably be addressed. But the primary goal with interface declarations is getting something established. Once we have an interface, we can modify it later easily enough. Differential Revision: https://phab.mercurial-scm.org/D3869

File last commit:

r38085:5a3feb2b default
r38549:c82ea938 default
Show More
test-pager.t
416 lines | 10.4 KiB | text/troff | Tads3Lexer
Augie Fackler
pager: add tests...
r28319 $ cat >> fakepager.py <<EOF
> import sys
Yuya Nishihara
cat: do not start pager if output will be written to file
r32541 > printed = False
Augie Fackler
pager: add tests...
r28319 > for line in sys.stdin:
> sys.stdout.write('paged! %r\n' % line)
Yuya Nishihara
cat: do not start pager if output will be written to file
r32541 > printed = True
> if not printed:
> sys.stdout.write('paged empty output!\n')
Augie Fackler
pager: add tests...
r28319 > EOF
Enable ui.formatted because pager won't fire without it, and set up
pager and tell it to use our fake pager that lets us see when the
pager was running.
$ cat >> $HGRCPATH <<EOF
> [ui]
> formatted = yes
Pierre-Yves David
color: turn on by default (but for windows)...
r32026 > color = no
Augie Fackler
pager: add tests...
r28319 > [pager]
Augie Fackler
cleanup: use $PYTHON to run python in many more tests...
r32940 > pager = $PYTHON $TESTTMP/fakepager.py
Augie Fackler
pager: add tests...
r28319 > EOF
$ hg init repo
$ cd repo
$ echo a >> a
$ hg add a
$ hg ci -m 'add a'
Augie Fackler
cleanup: use $PYTHON to run python in many more tests...
r32940 $ for x in `$PYTHON $TESTDIR/seq.py 1 10`; do
Augie Fackler
pager: add tests...
r28319 > echo a $x >> a
> hg ci -m "modify a $x"
> done
Augie Fackler
tests: switch "this command isn't paged" example to id...
r30944 By default diff and log are paged, but id is not:
Augie Fackler
pager: add tests...
r28319
$ hg diff -c 2 --pager=yes
paged! 'diff -r f4be7687d414 -r bce265549556 a\n'
paged! '--- a/a\tThu Jan 01 00:00:00 1970 +0000\n'
paged! '+++ b/a\tThu Jan 01 00:00:00 1970 +0000\n'
paged! '@@ -1,2 +1,3 @@\n'
paged! ' a\n'
paged! ' a 1\n'
paged! '+a 2\n'
$ hg log --limit 2
paged! 'changeset: 10:46106edeeb38\n'
paged! 'tag: tip\n'
paged! 'user: test\n'
paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
paged! 'summary: modify a 10\n'
paged! '\n'
paged! 'changeset: 9:6dd8ea7dd621\n'
paged! 'user: test\n'
paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
paged! 'summary: modify a 9\n'
paged! '\n'
Augie Fackler
tests: switch "this command isn't paged" example to id...
r30944 $ hg id
46106edeeb38 tip
Augie Fackler
pager: add tests...
r28319
Pierre-Yves David
pager: test the 'enable' config option...
r32099 We can control the pager from the config
Pierre-Yves David
pager: rename 'pager.enable' to 'ui.paginate'...
r32105 $ hg log --limit 1 --config 'ui.paginate=False'
Pierre-Yves David
pager: test the 'enable' config option...
r32099 changeset: 10:46106edeeb38
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: modify a 10
Pierre-Yves David
pager: rename 'pager.enable' to 'ui.paginate'...
r32105 $ hg log --limit 1 --config 'ui.paginate=0'
Pierre-Yves David
pager: test the 'enable' config option...
r32099 changeset: 10:46106edeeb38
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: modify a 10
Pierre-Yves David
pager: rename 'pager.enable' to 'ui.paginate'...
r32105 $ hg log --limit 1 --config 'ui.paginate=1'
Pierre-Yves David
pager: test the 'enable' config option...
r32099 paged! 'changeset: 10:46106edeeb38\n'
paged! 'tag: tip\n'
paged! 'user: test\n'
paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
paged! 'summary: modify a 10\n'
paged! '\n'
FUJIWARA Katsunori
ui: enable pager always for explicit --pager=on (issue5580)...
r33622 explicit --pager=on should take precedence over other configurations
(issue5580)
$ cat >> $HGRCPATH <<EOF
> [ui]
> paginate = false
> EOF
$ hg log --limit 1 --pager=on
paged! 'changeset: 10:46106edeeb38\n'
paged! 'tag: tip\n'
paged! 'user: test\n'
paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
paged! 'summary: modify a 10\n'
paged! '\n'
$ cat >> $HGRCPATH <<EOF
> [ui]
> # true is default value of ui.paginate
> paginate = true
> EOF
$ hg log --limit 1 --pager=off
changeset: 10:46106edeeb38
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: modify a 10
Augie Fackler
tests: switch "this command isn't paged" example to id...
r30944 We can enable the pager on id:
Augie Fackler
pager: add tests...
r28319
Martin von Zweigbergk
tests: duplicate test for pager for old extension and for in-core pager...
r31405 BROKEN: should be paged
Augie Fackler
tests: switch "this command isn't paged" example to id...
r30944 $ hg --config pager.attend-id=yes id
Martin von Zweigbergk
tests: duplicate test for pager for old extension and for in-core pager...
r31405 46106edeeb38 tip
Augie Fackler
pager: add tests...
r28319
Augie Fackler
tests: clean up a bunch of pager testing that is about to be invalidated...
r30996 Setting attend-$COMMAND to a false value works, even with pager in
core:
Augie Fackler
pager: add tests...
r28319 $ hg --config pager.attend-diff=no diff -c 2
diff -r f4be7687d414 -r bce265549556 a
--- a/a Thu Jan 01 00:00:00 1970 +0000
+++ b/a Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +1,3 @@
a
a 1
+a 2
Gregory Szorc
tests: drop unnecessary pager attend in test...
r32072 Command aliases should have same behavior as main command
$ hg history --limit 2
Augie Fackler
pager: add tests...
r28319 paged! 'changeset: 10:46106edeeb38\n'
paged! 'tag: tip\n'
paged! 'user: test\n'
paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
paged! 'summary: modify a 10\n'
paged! '\n'
paged! 'changeset: 9:6dd8ea7dd621\n'
paged! 'user: test\n'
paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
paged! 'summary: modify a 9\n'
paged! '\n'
Gregory Szorc
tests: test that abbreviated command alias is also paged...
r32073 Abbreviated command alias should also be paged
$ hg hist -l 1
paged! 'changeset: 10:46106edeeb38\n'
paged! 'tag: tip\n'
paged! 'user: test\n'
paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
paged! 'summary: modify a 10\n'
paged! '\n'
Gregory Szorc
tests: demonstrate that pager.attend-<abbreviated> doesn't work...
r32074 Attend for an abbreviated command does not work
$ hg --config pager.attend-ident=true ident
46106edeeb38 tip
$ hg --config extensions.pager= --config pager.attend-ident=true ident
46106edeeb38 tip
Yuya Nishihara
pager: wrap _runcommand() no matter if stdout is redirected...
r30847 Pager should not start if stdout is not a tty.
$ hg log -l1 -q --config ui.formatted=False
10:46106edeeb38
Yuya Nishihara
pager: do not try to run an empty pager command...
r31079 Pager should be disabled if pager.pager is empty (otherwise the output would
be silently lost.)
$ hg log -l1 -q --config pager.pager=
10:46106edeeb38
Augie Fackler
test-pager: add a test for pager with color enabled
r28531 Pager with color enabled allows colors to come through by default,
even though stdout is no longer a tty.
$ cat >> $HGRCPATH <<EOF
Pierre-Yves David
pager: stop using the color extension in tests...
r32025 > [ui]
Pierre-Yves David
color: special case 'always' in 'ui.color'...
r32104 > color = always
Augie Fackler
test-pager: add a test for pager with color enabled
r28531 > [color]
> mode = ansi
> EOF
$ hg log --limit 3
paged! '\x1b[0;33mchangeset: 10:46106edeeb38\x1b[0m\n'
paged! 'tag: tip\n'
paged! 'user: test\n'
paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
paged! 'summary: modify a 10\n'
paged! '\n'
paged! '\x1b[0;33mchangeset: 9:6dd8ea7dd621\x1b[0m\n'
paged! 'user: test\n'
paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
paged! 'summary: modify a 9\n'
paged! '\n'
paged! '\x1b[0;33mchangeset: 8:cff05a6312fe\x1b[0m\n'
paged! 'user: test\n'
paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
paged! 'summary: modify a 8\n'
paged! '\n'
Jun Wu
dispatch: always load extensions before running shell aliases (issue5230)...
r29132
Jun Wu
test-pager: make it compatible with chg...
r34443 #if no-chg
Augie Fackler
pager: avoid shell=True on subprocess.Popen for better errors (issue5491)...
r31478 An invalid pager command name is reported sensibly if we don't have to
use shell=True in the subprocess call:
$ hg log --limit 3 --config pager.pager=this-command-better-never-exist
missing pager command 'this-command-better-never-exist', skipping pager
\x1b[0;33mchangeset: 10:46106edeeb38\x1b[0m (esc)
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: modify a 10
\x1b[0;33mchangeset: 9:6dd8ea7dd621\x1b[0m (esc)
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: modify a 9
\x1b[0;33mchangeset: 8:cff05a6312fe\x1b[0m (esc)
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: modify a 8
Jun Wu
test-pager: make it compatible with chg...
r34443 #endif
Augie Fackler
pager: avoid shell=True on subprocess.Popen for better errors (issue5491)...
r31478
A complicated pager command gets worse behavior. Bonus points if you can
improve this.
$ hg log --limit 3 \
> --config pager.pager='this-command-better-never-exist --seriously' \
> 2>/dev/null || true
Jun Wu
dispatch: always load extensions before running shell aliases (issue5230)...
r29132 Pager works with shell aliases.
$ cat >> $HGRCPATH <<EOF
> [alias]
> echoa = !echo a
> EOF
$ hg echoa
a
Martin von Zweigbergk
tests: duplicate test for pager for old extension and for in-core pager...
r31405 BROKEN: should be paged
Jun Wu
dispatch: always load extensions before running shell aliases (issue5230)...
r29132 $ hg --config pager.attend-echoa=yes echoa
Martin von Zweigbergk
tests: duplicate test for pager for old extension and for in-core pager...
r31405 a
Jun Wu
tests: move chg pager test to test-pager.t...
r29343
Pager works with hg aliases including environment variables.
$ cat >> $HGRCPATH <<'EOF'
> [alias]
> printa = log -T "$A\n" -r 0
> EOF
$ A=1 hg --config pager.attend-printa=yes printa
paged! '1\n'
$ A=2 hg --config pager.attend-printa=yes printa
paged! '2\n'
Jun Wu
chg: exec pager in child process...
r29344
Augie Fackler
pager: add a test of --pager=no functionality...
r30942 Something that's explicitly attended is still not paginated if the
pager is globally set to off using a flag:
$ A=2 hg --config pager.attend-printa=yes printa --pager=no
2
Jun Wu
chg: exec pager in child process...
r29344 Pager should not override the exit code of other commands
$ cat >> $TESTTMP/fortytwo.py <<'EOF'
Yuya Nishihara
registrar: move cmdutil.command to registrar module (API)...
r32337 > from mercurial import commands, registrar
Jun Wu
chg: exec pager in child process...
r29344 > cmdtable = {}
Yuya Nishihara
registrar: move cmdutil.command to registrar module (API)...
r32337 > command = registrar.command(cmdtable)
Pulkit Goyal
py3: add b'' prefixes in tests/test-pager.t...
r38085 > @command(b'fortytwo', [], b'fortytwo', norepo=True)
Jun Wu
chg: exec pager in child process...
r29344 > def fortytwo(ui, *opts):
Pulkit Goyal
py3: add b'' prefixes in tests/test-pager.t...
r38085 > ui.write(b'42\n')
Jun Wu
chg: exec pager in child process...
r29344 > return 42
> EOF
$ cat >> $HGRCPATH <<'EOF'
> [extensions]
> fortytwo = $TESTTMP/fortytwo.py
> EOF
$ hg fortytwo --pager=on
paged! '42\n'
[42]
Augie Fackler
annotate: migrate to modern pager API
r30999
A command that asks for paging using ui.pager() directly works:
$ hg blame a
paged! ' 0: a\n'
paged! ' 1: a 1\n'
paged! ' 2: a 2\n'
paged! ' 3: a 3\n'
paged! ' 4: a 4\n'
paged! ' 5: a 5\n'
paged! ' 6: a 6\n'
paged! ' 7: a 7\n'
paged! ' 8: a 8\n'
paged! ' 9: a 9\n'
paged! '10: a 10\n'
but not with HGPLAIN
$ HGPLAIN=1 hg blame a
0: a
1: a 1
2: a 2
3: a 3
4: a 4
5: a 5
6: a 6
7: a 7
8: a 8
9: a 9
10: a 10
explicit flags work too:
$ hg blame --pager=no a
0: a
1: a 1
2: a 2
3: a 3
4: a 4
5: a 5
6: a 6
7: a 7
8: a 8
9: a 9
10: a 10
Augie Fackler
tests: prove that ignore works
r31000
Yuya Nishihara
cat: do not start pager if output will be written to file
r32541 A command with --output option:
$ hg cat -r0 a
paged! 'a\n'
$ hg cat -r0 a --output=-
paged! 'a\n'
$ hg cat -r0 a --output=out
Yuya Nishihara
export: do not start pager if output will be written to file...
r37616
$ hg export -r0
paged! '# HG changeset patch\n'
paged! '# User test\n'
paged! '# Date 0 0\n'
paged! '# Thu Jan 01 00:00:00 1970 +0000\n'
paged! '# Node ID 1f0dee641bb7258c56bd60e93edfa2405381c41e\n'
paged! '# Parent 0000000000000000000000000000000000000000\n'
paged! 'add a\n'
paged! '\n'
paged! '\x1b[0;1mdiff -r 000000000000 -r 1f0dee641bb7 a\x1b[0m\n'
paged! '\x1b[0;31;1m--- /dev/null\tThu Jan 01 00:00:00 1970 +0000\x1b[0m\n'
paged! '\x1b[0;32;1m+++ b/a\tThu Jan 01 00:00:00 1970 +0000\x1b[0m\n'
paged! '\x1b[0;35m@@ -0,0 +1,1 @@\x1b[0m\n'
paged! '\x1b[0;32m+a\x1b[0m\n'
$ hg export -r0 -o -
paged! '# HG changeset patch\n'
paged! '# User test\n'
paged! '# Date 0 0\n'
paged! '# Thu Jan 01 00:00:00 1970 +0000\n'
paged! '# Node ID 1f0dee641bb7258c56bd60e93edfa2405381c41e\n'
paged! '# Parent 0000000000000000000000000000000000000000\n'
paged! 'add a\n'
paged! '\n'
paged! '\x1b[0;1mdiff -r 000000000000 -r 1f0dee641bb7 a\x1b[0m\n'
paged! '\x1b[0;31;1m--- /dev/null\tThu Jan 01 00:00:00 1970 +0000\x1b[0m\n'
paged! '\x1b[0;32;1m+++ b/a\tThu Jan 01 00:00:00 1970 +0000\x1b[0m\n'
paged! '\x1b[0;35m@@ -0,0 +1,1 @@\x1b[0m\n'
paged! '\x1b[0;32m+a\x1b[0m\n'
$ hg export -r0 -o out
Yuya Nishihara
cat: do not start pager if output will be written to file
r32541 $ rm out
Augie Fackler
tests: prove that ignore works
r31000 Put annotate in the ignore list for pager:
$ cat >> $HGRCPATH <<EOF
> [pager]
> ignore = annotate
> EOF
$ hg blame a
0: a
1: a 1
2: a 2
3: a 3
4: a 4
5: a 5
6: a 6
7: a 7
8: a 8
9: a 9
10: a 10
Jun Wu
pager: set some environment variables if they're not set...
r31954
Jun Wu
pager: do not start pager if `ui` has been `pushbuffer`-ed...
r34023 During pushbuffer, pager should not start:
$ cat > $TESTTMP/pushbufferpager.py <<EOF
> def uisetup(ui):
> ui.pushbuffer()
Pulkit Goyal
py3: add b'' prefixes in tests/test-pager.t...
r38085 > ui.pager(b'mycmd')
> ui.write(b'content\n')
Jun Wu
pager: do not start pager if `ui` has been `pushbuffer`-ed...
r34023 > ui.write(ui.popbuffer())
> EOF
$ echo append >> a
$ hg --config extensions.pushbuffer=$TESTTMP/pushbufferpager.py status --color=off
content
paged! 'M a\n'
Jun Wu
pager: set some environment variables if they're not set...
r31954 Environment variables like LESS and LV are set automatically:
$ cat > $TESTTMP/printlesslv.py <<EOF
Augie Fackler
tests: update test-pager to pass our import checker
r33973 > from __future__ import absolute_import
> import os
> import sys
Jun Wu
pager: set some environment variables if they're not set...
r31954 > sys.stdin.read()
> for name in ['LESS', 'LV']:
> sys.stdout.write(('%s=%s\n') % (name, os.environ.get(name, '-')))
> sys.stdout.flush()
> EOF
$ cat >> $HGRCPATH <<EOF
> [alias]
> noop = log -r 0 -T ''
> [ui]
> formatted=1
> [pager]
> pager = $PYTHON $TESTTMP/printlesslv.py
> EOF
$ unset LESS
$ unset LV
$ hg noop --pager=on
LESS=FRX
LV=-c
$ LESS=EFGH hg noop --pager=on
LESS=EFGH
LV=-c