##// END OF EJS Templates
test-pager: make it compatible with chg...
Jun Wu -
r34443:73d8a528 default
parent child Browse files
Show More
@@ -1,383 +1,395 b''
1 1 $ cat >> fakepager.py <<EOF
2 2 > import sys
3 3 > printed = False
4 4 > for line in sys.stdin:
5 5 > sys.stdout.write('paged! %r\n' % line)
6 6 > printed = True
7 7 > if not printed:
8 8 > sys.stdout.write('paged empty output!\n')
9 9 > EOF
10 10
11 11 Enable ui.formatted because pager won't fire without it, and set up
12 12 pager and tell it to use our fake pager that lets us see when the
13 13 pager was running.
14 14 $ cat >> $HGRCPATH <<EOF
15 15 > [ui]
16 16 > formatted = yes
17 17 > color = no
18 18 > [pager]
19 19 > pager = $PYTHON $TESTTMP/fakepager.py
20 20 > EOF
21 21
22 22 $ hg init repo
23 23 $ cd repo
24 24 $ echo a >> a
25 25 $ hg add a
26 26 $ hg ci -m 'add a'
27 27 $ for x in `$PYTHON $TESTDIR/seq.py 1 10`; do
28 28 > echo a $x >> a
29 29 > hg ci -m "modify a $x"
30 30 > done
31 31
32 32 By default diff and log are paged, but id is not:
33 33
34 34 $ hg diff -c 2 --pager=yes
35 35 paged! 'diff -r f4be7687d414 -r bce265549556 a\n'
36 36 paged! '--- a/a\tThu Jan 01 00:00:00 1970 +0000\n'
37 37 paged! '+++ b/a\tThu Jan 01 00:00:00 1970 +0000\n'
38 38 paged! '@@ -1,2 +1,3 @@\n'
39 39 paged! ' a\n'
40 40 paged! ' a 1\n'
41 41 paged! '+a 2\n'
42 42
43 43 $ hg log --limit 2
44 44 paged! 'changeset: 10:46106edeeb38\n'
45 45 paged! 'tag: tip\n'
46 46 paged! 'user: test\n'
47 47 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
48 48 paged! 'summary: modify a 10\n'
49 49 paged! '\n'
50 50 paged! 'changeset: 9:6dd8ea7dd621\n'
51 51 paged! 'user: test\n'
52 52 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
53 53 paged! 'summary: modify a 9\n'
54 54 paged! '\n'
55 55
56 56 $ hg id
57 57 46106edeeb38 tip
58 58
59 59 We can control the pager from the config
60 60
61 61 $ hg log --limit 1 --config 'ui.paginate=False'
62 62 changeset: 10:46106edeeb38
63 63 tag: tip
64 64 user: test
65 65 date: Thu Jan 01 00:00:00 1970 +0000
66 66 summary: modify a 10
67 67
68 68 $ hg log --limit 1 --config 'ui.paginate=0'
69 69 changeset: 10:46106edeeb38
70 70 tag: tip
71 71 user: test
72 72 date: Thu Jan 01 00:00:00 1970 +0000
73 73 summary: modify a 10
74 74
75 75 $ hg log --limit 1 --config 'ui.paginate=1'
76 76 paged! 'changeset: 10:46106edeeb38\n'
77 77 paged! 'tag: tip\n'
78 78 paged! 'user: test\n'
79 79 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
80 80 paged! 'summary: modify a 10\n'
81 81 paged! '\n'
82 82
83 83 explicit --pager=on should take precedence over other configurations
84 84 (issue5580)
85 85
86 86 $ cat >> $HGRCPATH <<EOF
87 87 > [ui]
88 88 > paginate = false
89 89 > EOF
90 90 $ hg log --limit 1 --pager=on
91 91 paged! 'changeset: 10:46106edeeb38\n'
92 92 paged! 'tag: tip\n'
93 93 paged! 'user: test\n'
94 94 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
95 95 paged! 'summary: modify a 10\n'
96 96 paged! '\n'
97 97
98 98 $ cat >> $HGRCPATH <<EOF
99 99 > [ui]
100 100 > # true is default value of ui.paginate
101 101 > paginate = true
102 102 > EOF
103 103 $ hg log --limit 1 --pager=off
104 104 changeset: 10:46106edeeb38
105 105 tag: tip
106 106 user: test
107 107 date: Thu Jan 01 00:00:00 1970 +0000
108 108 summary: modify a 10
109 109
110 110
111 111 We can enable the pager on id:
112 112
113 113 BROKEN: should be paged
114 114 $ hg --config pager.attend-id=yes id
115 115 46106edeeb38 tip
116 116
117 117 Setting attend-$COMMAND to a false value works, even with pager in
118 118 core:
119 119 $ hg --config pager.attend-diff=no diff -c 2
120 120 diff -r f4be7687d414 -r bce265549556 a
121 121 --- a/a Thu Jan 01 00:00:00 1970 +0000
122 122 +++ b/a Thu Jan 01 00:00:00 1970 +0000
123 123 @@ -1,2 +1,3 @@
124 124 a
125 125 a 1
126 126 +a 2
127 127
128 128 Command aliases should have same behavior as main command
129 129
130 130 $ hg history --limit 2
131 131 paged! 'changeset: 10:46106edeeb38\n'
132 132 paged! 'tag: tip\n'
133 133 paged! 'user: test\n'
134 134 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
135 135 paged! 'summary: modify a 10\n'
136 136 paged! '\n'
137 137 paged! 'changeset: 9:6dd8ea7dd621\n'
138 138 paged! 'user: test\n'
139 139 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
140 140 paged! 'summary: modify a 9\n'
141 141 paged! '\n'
142 142
143 143 Abbreviated command alias should also be paged
144 144
145 145 $ hg hist -l 1
146 146 paged! 'changeset: 10:46106edeeb38\n'
147 147 paged! 'tag: tip\n'
148 148 paged! 'user: test\n'
149 149 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
150 150 paged! 'summary: modify a 10\n'
151 151 paged! '\n'
152 152
153 153 Attend for an abbreviated command does not work
154 154
155 155 $ hg --config pager.attend-ident=true ident
156 156 46106edeeb38 tip
157 157
158 158 $ hg --config extensions.pager= --config pager.attend-ident=true ident
159 159 46106edeeb38 tip
160 160
161 161 Pager should not start if stdout is not a tty.
162 162
163 163 $ hg log -l1 -q --config ui.formatted=False
164 164 10:46106edeeb38
165 165
166 166 Pager should be disabled if pager.pager is empty (otherwise the output would
167 167 be silently lost.)
168 168
169 169 $ hg log -l1 -q --config pager.pager=
170 170 10:46106edeeb38
171 171
172 172 Pager with color enabled allows colors to come through by default,
173 173 even though stdout is no longer a tty.
174 174 $ cat >> $HGRCPATH <<EOF
175 175 > [ui]
176 176 > color = always
177 177 > [color]
178 178 > mode = ansi
179 179 > EOF
180 180 $ hg log --limit 3
181 181 paged! '\x1b[0;33mchangeset: 10:46106edeeb38\x1b[0m\n'
182 182 paged! 'tag: tip\n'
183 183 paged! 'user: test\n'
184 184 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
185 185 paged! 'summary: modify a 10\n'
186 186 paged! '\n'
187 187 paged! '\x1b[0;33mchangeset: 9:6dd8ea7dd621\x1b[0m\n'
188 188 paged! 'user: test\n'
189 189 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
190 190 paged! 'summary: modify a 9\n'
191 191 paged! '\n'
192 192 paged! '\x1b[0;33mchangeset: 8:cff05a6312fe\x1b[0m\n'
193 193 paged! 'user: test\n'
194 194 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
195 195 paged! 'summary: modify a 8\n'
196 196 paged! '\n'
197 197
198 #if no-chg
198 199 An invalid pager command name is reported sensibly if we don't have to
199 200 use shell=True in the subprocess call:
200 201 $ hg log --limit 3 --config pager.pager=this-command-better-never-exist
201 202 missing pager command 'this-command-better-never-exist', skipping pager
202 203 \x1b[0;33mchangeset: 10:46106edeeb38\x1b[0m (esc)
203 204 tag: tip
204 205 user: test
205 206 date: Thu Jan 01 00:00:00 1970 +0000
206 207 summary: modify a 10
207 208
208 209 \x1b[0;33mchangeset: 9:6dd8ea7dd621\x1b[0m (esc)
209 210 user: test
210 211 date: Thu Jan 01 00:00:00 1970 +0000
211 212 summary: modify a 9
212 213
213 214 \x1b[0;33mchangeset: 8:cff05a6312fe\x1b[0m (esc)
214 215 user: test
215 216 date: Thu Jan 01 00:00:00 1970 +0000
216 217 summary: modify a 8
217 218
219 #else
220 Currently, chg has its own runpager implementation, which does not show the
221 "missing pager" message. The error message is globed out since the shell could
222 print different message.
223 $ hg log --limit 3 --config pager.pager=this-command-better-never-exist
224 /bin/sh: this-command-better-never-exist: command not found (?)
225 * (glob) (?)
226 killed!
227 [255]
228
229 #endif
218 230
219 231 A complicated pager command gets worse behavior. Bonus points if you can
220 232 improve this.
221 233 $ hg log --limit 3 \
222 234 > --config pager.pager='this-command-better-never-exist --seriously' \
223 235 > 2>/dev/null || true
224 236
225 237 Pager works with shell aliases.
226 238
227 239 $ cat >> $HGRCPATH <<EOF
228 240 > [alias]
229 241 > echoa = !echo a
230 242 > EOF
231 243
232 244 $ hg echoa
233 245 a
234 246 BROKEN: should be paged
235 247 $ hg --config pager.attend-echoa=yes echoa
236 248 a
237 249
238 250 Pager works with hg aliases including environment variables.
239 251
240 252 $ cat >> $HGRCPATH <<'EOF'
241 253 > [alias]
242 254 > printa = log -T "$A\n" -r 0
243 255 > EOF
244 256
245 257 $ A=1 hg --config pager.attend-printa=yes printa
246 258 paged! '1\n'
247 259 $ A=2 hg --config pager.attend-printa=yes printa
248 260 paged! '2\n'
249 261
250 262 Something that's explicitly attended is still not paginated if the
251 263 pager is globally set to off using a flag:
252 264 $ A=2 hg --config pager.attend-printa=yes printa --pager=no
253 265 2
254 266
255 267 Pager should not override the exit code of other commands
256 268
257 269 $ cat >> $TESTTMP/fortytwo.py <<'EOF'
258 270 > from mercurial import commands, registrar
259 271 > cmdtable = {}
260 272 > command = registrar.command(cmdtable)
261 273 > @command(b'fortytwo', [], 'fortytwo', norepo=True)
262 274 > def fortytwo(ui, *opts):
263 275 > ui.write('42\n')
264 276 > return 42
265 277 > EOF
266 278
267 279 $ cat >> $HGRCPATH <<'EOF'
268 280 > [extensions]
269 281 > fortytwo = $TESTTMP/fortytwo.py
270 282 > EOF
271 283
272 284 $ hg fortytwo --pager=on
273 285 paged! '42\n'
274 286 [42]
275 287
276 288 A command that asks for paging using ui.pager() directly works:
277 289 $ hg blame a
278 290 paged! ' 0: a\n'
279 291 paged! ' 1: a 1\n'
280 292 paged! ' 2: a 2\n'
281 293 paged! ' 3: a 3\n'
282 294 paged! ' 4: a 4\n'
283 295 paged! ' 5: a 5\n'
284 296 paged! ' 6: a 6\n'
285 297 paged! ' 7: a 7\n'
286 298 paged! ' 8: a 8\n'
287 299 paged! ' 9: a 9\n'
288 300 paged! '10: a 10\n'
289 301 but not with HGPLAIN
290 302 $ HGPLAIN=1 hg blame a
291 303 0: a
292 304 1: a 1
293 305 2: a 2
294 306 3: a 3
295 307 4: a 4
296 308 5: a 5
297 309 6: a 6
298 310 7: a 7
299 311 8: a 8
300 312 9: a 9
301 313 10: a 10
302 314 explicit flags work too:
303 315 $ hg blame --pager=no a
304 316 0: a
305 317 1: a 1
306 318 2: a 2
307 319 3: a 3
308 320 4: a 4
309 321 5: a 5
310 322 6: a 6
311 323 7: a 7
312 324 8: a 8
313 325 9: a 9
314 326 10: a 10
315 327
316 328 A command with --output option:
317 329
318 330 $ hg cat -r0 a
319 331 paged! 'a\n'
320 332 $ hg cat -r0 a --output=-
321 333 paged! 'a\n'
322 334 $ hg cat -r0 a --output=out
323 335 $ rm out
324 336
325 337 Put annotate in the ignore list for pager:
326 338 $ cat >> $HGRCPATH <<EOF
327 339 > [pager]
328 340 > ignore = annotate
329 341 > EOF
330 342 $ hg blame a
331 343 0: a
332 344 1: a 1
333 345 2: a 2
334 346 3: a 3
335 347 4: a 4
336 348 5: a 5
337 349 6: a 6
338 350 7: a 7
339 351 8: a 8
340 352 9: a 9
341 353 10: a 10
342 354
343 355 During pushbuffer, pager should not start:
344 356 $ cat > $TESTTMP/pushbufferpager.py <<EOF
345 357 > def uisetup(ui):
346 358 > ui.pushbuffer()
347 359 > ui.pager('mycmd')
348 360 > ui.write('content\n')
349 361 > ui.write(ui.popbuffer())
350 362 > EOF
351 363
352 364 $ echo append >> a
353 365 $ hg --config extensions.pushbuffer=$TESTTMP/pushbufferpager.py status --color=off
354 366 content
355 367 paged! 'M a\n'
356 368
357 369 Environment variables like LESS and LV are set automatically:
358 370 $ cat > $TESTTMP/printlesslv.py <<EOF
359 371 > from __future__ import absolute_import
360 372 > import os
361 373 > import sys
362 374 > sys.stdin.read()
363 375 > for name in ['LESS', 'LV']:
364 376 > sys.stdout.write(('%s=%s\n') % (name, os.environ.get(name, '-')))
365 377 > sys.stdout.flush()
366 378 > EOF
367 379
368 380 $ cat >> $HGRCPATH <<EOF
369 381 > [alias]
370 382 > noop = log -r 0 -T ''
371 383 > [ui]
372 384 > formatted=1
373 385 > [pager]
374 386 > pager = $PYTHON $TESTTMP/printlesslv.py
375 387 > EOF
376 388 $ unset LESS
377 389 $ unset LV
378 390 $ hg noop --pager=on
379 391 LESS=FRX
380 392 LV=-c
381 393 $ LESS=EFGH hg noop --pager=on
382 394 LESS=EFGH
383 395 LV=-c
General Comments 0
You need to be logged in to leave comments. Login now