Mercurial > hg
annotate tests/test-pager.t @ 30435:b86a448a2965
zstd: vendor python-zstandard 0.5.0
As the commit message for the previous changeset says, we wish
for zstd to be a 1st class citizen in Mercurial. To make that
happen, we need to enable Python to talk to the zstd C API. And
that requires bindings.
This commit vendors a copy of existing Python bindings. Why do we
need to vendor? As the commit message of the previous commit says,
relying on systems in the wild to have the bindings or zstd present
is a losing proposition. By distributing the zstd and bindings with
Mercurial, we significantly increase our chances that zstd will
work. Since zstd will deliver a better end-user experience by
achieving better performance, this benefits our users. Another
reason is that the Python bindings still aren't stable and the
API is somewhat fluid. While Mercurial could be coded to target
multiple versions of the Python bindings, it is safer to bundle
an explicit, known working version.
The added Python bindings are mostly a fully-featured interface
to the zstd C API. They allow one-shot operations, streaming,
reading and writing from objects implements the file object
protocol, dictionary compression, control over low-level compression
parameters, and more. The Python bindings work on Python 2.6,
2.7, and 3.3+ and have been tested on Linux and Windows. There are
CFFI bindings, but they are lacking compared to the C extension.
Upstream work will be needed before we can support zstd with PyPy.
But it will be possible.
The files added in this commit come from Git commit
e637c1b214d5f869cf8116c550dcae23ec13b677 from
https://github.com/indygreg/python-zstandard and are added without
modifications. Some files from the upstream repository have been
omitted, namely files related to continuous integration.
In the spirit of full disclosure, I'm the maintainer of the
"python-zstandard" project and have authored 100% of the code
added in this commit. Unfortunately, the Python bindings have
not been formally code reviewed by anyone. While I've tested
much of the code thoroughly (I even have tests that fuzz APIs),
there's a good chance there are bugs, memory leaks, not well
thought out APIs, etc. If someone wants to review the code and
send feedback to the GitHub project, it would be greatly
appreciated.
Despite my involvement with both projects, my opinions of code
style differ from Mercurial's. The code in this commit introduces
numerous code style violations in Mercurial's linters. So, the code
is excluded from most lints. However, some violations I agree with.
These have been added to the known violations ignore list for now.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Thu, 10 Nov 2016 22:15:58 -0800 |
parents | bb3d5c20eaf6 |
children | e12553cfd0a4 |
rev | line source |
---|---|
28319 | 1 $ cat >> fakepager.py <<EOF |
2 > import sys | |
3 > for line in sys.stdin: | |
4 > sys.stdout.write('paged! %r\n' % line) | |
5 > EOF | |
6 | |
7 Enable ui.formatted because pager won't fire without it, and set up | |
8 pager and tell it to use our fake pager that lets us see when the | |
9 pager was running. | |
10 $ cat >> $HGRCPATH <<EOF | |
11 > [ui] | |
12 > formatted = yes | |
13 > [extensions] | |
14 > pager= | |
15 > [pager] | |
16 > pager = python $TESTTMP/fakepager.py | |
17 > EOF | |
18 | |
19 $ hg init repo | |
20 $ cd repo | |
21 $ echo a >> a | |
22 $ hg add a | |
23 $ hg ci -m 'add a' | |
24 $ for x in `python $TESTDIR/seq.py 1 10`; do | |
25 > echo a $x >> a | |
26 > hg ci -m "modify a $x" | |
27 > done | |
28 | |
29 By default diff and log are paged, but summary is not: | |
30 | |
31 $ hg diff -c 2 --pager=yes | |
32 paged! 'diff -r f4be7687d414 -r bce265549556 a\n' | |
33 paged! '--- a/a\tThu Jan 01 00:00:00 1970 +0000\n' | |
34 paged! '+++ b/a\tThu Jan 01 00:00:00 1970 +0000\n' | |
35 paged! '@@ -1,2 +1,3 @@\n' | |
36 paged! ' a\n' | |
37 paged! ' a 1\n' | |
38 paged! '+a 2\n' | |
39 | |
40 $ hg log --limit 2 | |
41 paged! 'changeset: 10:46106edeeb38\n' | |
42 paged! 'tag: tip\n' | |
43 paged! 'user: test\n' | |
44 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n' | |
45 paged! 'summary: modify a 10\n' | |
46 paged! '\n' | |
47 paged! 'changeset: 9:6dd8ea7dd621\n' | |
48 paged! 'user: test\n' | |
49 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n' | |
50 paged! 'summary: modify a 9\n' | |
51 paged! '\n' | |
52 | |
53 $ hg summary | |
54 parent: 10:46106edeeb38 tip | |
55 modify a 10 | |
56 branch: default | |
57 commit: (clean) | |
58 update: (current) | |
59 phases: 11 draft | |
60 | |
61 We can enable the pager on summary: | |
62 | |
63 $ hg --config pager.attend-summary=yes summary | |
64 paged! 'parent: 10:46106edeeb38 tip\n' | |
65 paged! ' modify a 10\n' | |
66 paged! 'branch: default\n' | |
67 paged! 'commit: (clean)\n' | |
68 paged! 'update: (current)\n' | |
69 paged! 'phases: 11 draft\n' | |
70 | |
71 If we completely change the attend list that's respected: | |
72 | |
73 $ hg --config pager.attend-diff=no diff -c 2 | |
74 diff -r f4be7687d414 -r bce265549556 a | |
75 --- a/a Thu Jan 01 00:00:00 1970 +0000 | |
76 +++ b/a Thu Jan 01 00:00:00 1970 +0000 | |
77 @@ -1,2 +1,3 @@ | |
78 a | |
79 a 1 | |
80 +a 2 | |
81 | |
82 $ hg --config pager.attend=summary diff -c 2 | |
83 diff -r f4be7687d414 -r bce265549556 a | |
84 --- a/a Thu Jan 01 00:00:00 1970 +0000 | |
85 +++ b/a Thu Jan 01 00:00:00 1970 +0000 | |
86 @@ -1,2 +1,3 @@ | |
87 a | |
88 a 1 | |
89 +a 2 | |
90 | |
91 If 'log' is in attend, then 'history' should also be paged: | |
92 $ hg history --limit 2 --config pager.attend=log | |
93 paged! 'changeset: 10:46106edeeb38\n' | |
94 paged! 'tag: tip\n' | |
95 paged! 'user: test\n' | |
96 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n' | |
97 paged! 'summary: modify a 10\n' | |
98 paged! '\n' | |
99 paged! 'changeset: 9:6dd8ea7dd621\n' | |
100 paged! 'user: test\n' | |
101 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n' | |
102 paged! 'summary: modify a 9\n' | |
103 paged! '\n' | |
104 | |
105 Possible bug: history is explicitly ignored in pager config, but | |
106 because log is in the attend list it still gets pager treatment. | |
107 | |
108 $ hg history --limit 2 --config pager.attend=log \ | |
109 > --config pager.ignore=history | |
110 paged! 'changeset: 10:46106edeeb38\n' | |
111 paged! 'tag: tip\n' | |
112 paged! 'user: test\n' | |
113 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n' | |
114 paged! 'summary: modify a 10\n' | |
115 paged! '\n' | |
116 paged! 'changeset: 9:6dd8ea7dd621\n' | |
117 paged! 'user: test\n' | |
118 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n' | |
119 paged! 'summary: modify a 9\n' | |
120 paged! '\n' | |
121 | |
122 Possible bug: history is explicitly marked as attend-history=no, but | |
123 it doesn't fail to get paged because log is still in the attend list. | |
124 | |
125 $ hg history --limit 2 --config pager.attend-history=no | |
126 paged! 'changeset: 10:46106edeeb38\n' | |
127 paged! 'tag: tip\n' | |
128 paged! 'user: test\n' | |
129 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n' | |
130 paged! 'summary: modify a 10\n' | |
131 paged! '\n' | |
132 paged! 'changeset: 9:6dd8ea7dd621\n' | |
133 paged! 'user: test\n' | |
134 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n' | |
135 paged! 'summary: modify a 9\n' | |
136 paged! '\n' | |
137 | |
138 Possible bug: disabling pager for log but enabling it for history | |
139 doesn't result in history being paged. | |
140 | |
141 $ hg history --limit 2 --config pager.attend-log=no \ | |
142 > --config pager.attend-history=yes | |
143 changeset: 10:46106edeeb38 | |
144 tag: tip | |
145 user: test | |
146 date: Thu Jan 01 00:00:00 1970 +0000 | |
147 summary: modify a 10 | |
148 | |
149 changeset: 9:6dd8ea7dd621 | |
150 user: test | |
151 date: Thu Jan 01 00:00:00 1970 +0000 | |
152 summary: modify a 9 | |
153 | |
28531
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
154 |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
155 Pager with color enabled allows colors to come through by default, |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
156 even though stdout is no longer a tty. |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
157 $ cat >> $HGRCPATH <<EOF |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
158 > [extensions] |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
159 > color= |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
160 > [color] |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
161 > mode = ansi |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
162 > EOF |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
163 $ hg log --limit 3 |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
164 paged! '\x1b[0;33mchangeset: 10:46106edeeb38\x1b[0m\n' |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
165 paged! 'tag: tip\n' |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
166 paged! 'user: test\n' |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
167 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n' |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
168 paged! 'summary: modify a 10\n' |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
169 paged! '\n' |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
170 paged! '\x1b[0;33mchangeset: 9:6dd8ea7dd621\x1b[0m\n' |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
171 paged! 'user: test\n' |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
172 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n' |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
173 paged! 'summary: modify a 9\n' |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
174 paged! '\n' |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
175 paged! '\x1b[0;33mchangeset: 8:cff05a6312fe\x1b[0m\n' |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
176 paged! 'user: test\n' |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
177 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n' |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
178 paged! 'summary: modify a 8\n' |
fe79a5821e5a
test-pager: add a test for pager with color enabled
Augie Fackler <augie@google.com>
parents:
28319
diff
changeset
|
179 paged! '\n' |
29132
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
28531
diff
changeset
|
180 |
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
28531
diff
changeset
|
181 Pager works with shell aliases. |
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
28531
diff
changeset
|
182 |
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
28531
diff
changeset
|
183 $ cat >> $HGRCPATH <<EOF |
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
28531
diff
changeset
|
184 > [alias] |
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
28531
diff
changeset
|
185 > echoa = !echo a |
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
28531
diff
changeset
|
186 > EOF |
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
28531
diff
changeset
|
187 |
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
28531
diff
changeset
|
188 $ hg echoa |
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
28531
diff
changeset
|
189 a |
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
28531
diff
changeset
|
190 $ hg --config pager.attend-echoa=yes echoa |
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
28531
diff
changeset
|
191 paged! 'a\n' |
29343
e095b9e753f7
tests: move chg pager test to test-pager.t
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
192 |
e095b9e753f7
tests: move chg pager test to test-pager.t
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
193 Pager works with hg aliases including environment variables. |
e095b9e753f7
tests: move chg pager test to test-pager.t
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
194 |
e095b9e753f7
tests: move chg pager test to test-pager.t
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
195 $ cat >> $HGRCPATH <<'EOF' |
e095b9e753f7
tests: move chg pager test to test-pager.t
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
196 > [alias] |
e095b9e753f7
tests: move chg pager test to test-pager.t
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
197 > printa = log -T "$A\n" -r 0 |
e095b9e753f7
tests: move chg pager test to test-pager.t
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
198 > EOF |
e095b9e753f7
tests: move chg pager test to test-pager.t
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
199 |
e095b9e753f7
tests: move chg pager test to test-pager.t
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
200 $ A=1 hg --config pager.attend-printa=yes printa |
e095b9e753f7
tests: move chg pager test to test-pager.t
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
201 paged! '1\n' |
e095b9e753f7
tests: move chg pager test to test-pager.t
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
202 $ A=2 hg --config pager.attend-printa=yes printa |
e095b9e753f7
tests: move chg pager test to test-pager.t
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
203 paged! '2\n' |
29344 | 204 |
205 Pager should not override the exit code of other commands | |
206 | |
207 $ cat >> $TESTTMP/fortytwo.py <<'EOF' | |
208 > from mercurial import cmdutil, commands | |
209 > cmdtable = {} | |
210 > command = cmdutil.command(cmdtable) | |
211 > @command('fortytwo', [], 'fortytwo', norepo=True) | |
212 > def fortytwo(ui, *opts): | |
213 > ui.write('42\n') | |
214 > return 42 | |
215 > EOF | |
216 | |
217 $ cat >> $HGRCPATH <<'EOF' | |
218 > [extensions] | |
219 > fortytwo = $TESTTMP/fortytwo.py | |
220 > EOF | |
221 | |
222 $ hg fortytwo --pager=on | |
223 paged! '42\n' | |
224 [42] |