##// END OF EJS Templates
hgweb: support constructing URLs from an alternate base URL...
hgweb: support constructing URLs from an alternate base URL The web.baseurl config option allows server operators to define a custom URL for hosted content. The way it works today is that hgwebdir parses this config option into URL components then updates the appropriate WSGI environment variables so the request "lies" about its details. For example, SERVER_NAME is updated to reflect the alternate base URL's hostname. The WSGI environment should not be modified because WSGI applications may want to know the original request details (for debugging, etc). This commit teaches our request parser about the existence of an alternate base URL. If defined, the advertised URL and other self-reflected paths will take the alternate base URL into account. The hgweb WSGI application didn't use web.baseurl. But hgwebdir did. We update hgwebdir to alter the environment parsing accordingly. The old code around environment manipulation has been removed. With this change, parserequestfromenv() has grown to a bit unwieldy. Now that practically everyone is using it, it is obvious that there is some unused features that can be trimmed. So look for this in follow-up commits. Differential Revision: https://phab.mercurial-scm.org/D2822

File last commit:

r34792:03033e44 default
r36916:219b2335 default
Show More
test-pager.t
385 lines | 9.2 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: make sure commands name are bytes in tests
r33097 > @command(b'fortytwo', [], 'fortytwo', norepo=True)
Jun Wu
chg: exec pager in child process...
r29344 > def fortytwo(ui, *opts):
> ui.write('42\n')
> 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
$ 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()
> ui.pager('mycmd')
> ui.write('content\n')
> 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