Show More
This diff has been collapsed as it changes many lines, (869 lines changed) Show them Hide them | |||
@@ -0,0 +1,869 b'' | |||
|
1 | $ cat >> $HGRCPATH << EOF | |
|
2 | > [diff] | |
|
3 | > git = true | |
|
4 | > EOF | |
|
5 | ||
|
6 | $ hg init | |
|
7 | $ cat > foo << EOF | |
|
8 | > 0 | |
|
9 | > 1 | |
|
10 | > 2 | |
|
11 | > 3 | |
|
12 | > 4 | |
|
13 | > EOF | |
|
14 | $ hg ci -Am init | |
|
15 | adding foo | |
|
16 | $ cat > foo << EOF | |
|
17 | > 0 | |
|
18 | > 0 | |
|
19 | > 0 | |
|
20 | > 0 | |
|
21 | > 1 | |
|
22 | > 2 | |
|
23 | > 3 | |
|
24 | > 4 | |
|
25 | > EOF | |
|
26 | $ hg ci -m 'more 0' | |
|
27 | $ sed 's/2/2+/' foo > foo.new | |
|
28 | $ mv foo.new foo | |
|
29 | $ cat > bar << EOF | |
|
30 | > a | |
|
31 | > b | |
|
32 | > c | |
|
33 | > d | |
|
34 | > e | |
|
35 | > EOF | |
|
36 | $ hg add bar | |
|
37 | $ hg ci -Am "2 -> 2+; added bar" | |
|
38 | $ cat >> foo << EOF | |
|
39 | > 5 | |
|
40 | > 6 | |
|
41 | > 7 | |
|
42 | > 8 | |
|
43 | > 9 | |
|
44 | > 10 | |
|
45 | > 11 | |
|
46 | > EOF | |
|
47 | $ hg ci -m "to 11" | |
|
48 | ||
|
49 | Add some changes with two diff hunks | |
|
50 | ||
|
51 | $ sed 's/^1$/ 1/' foo > foo.new | |
|
52 | $ mv foo.new foo | |
|
53 | $ sed 's/^11$/11+/' foo > foo.new | |
|
54 | $ mv foo.new foo | |
|
55 | $ hg ci -m '11 -> 11+; leading space before "1"' | |
|
56 | (make sure there are two hunks in "foo") | |
|
57 | $ hg diff -c . | |
|
58 | diff --git a/foo b/foo | |
|
59 | --- a/foo | |
|
60 | +++ b/foo | |
|
61 | @@ -2,7 +2,7 @@ | |
|
62 | 0 | |
|
63 | 0 | |
|
64 | 0 | |
|
65 | -1 | |
|
66 | + 1 | |
|
67 | 2+ | |
|
68 | 3 | |
|
69 | 4 | |
|
70 | @@ -12,4 +12,4 @@ | |
|
71 | 8 | |
|
72 | 9 | |
|
73 | 10 | |
|
74 | -11 | |
|
75 | +11+ | |
|
76 | $ sed 's/3/3+/' foo > foo.new | |
|
77 | $ mv foo.new foo | |
|
78 | $ sed 's/^11+$/11-/' foo > foo.new | |
|
79 | $ mv foo.new foo | |
|
80 | $ sed 's/a/a+/' bar > bar.new | |
|
81 | $ mv bar.new bar | |
|
82 | $ hg ci -m 'foo: 3 -> 3+ and 11+ -> 11-; bar: a -> a+' | |
|
83 | (make sure there are two hunks in "foo") | |
|
84 | $ hg diff -c . foo | |
|
85 | diff --git a/foo b/foo | |
|
86 | --- a/foo | |
|
87 | +++ b/foo | |
|
88 | @@ -4,7 +4,7 @@ | |
|
89 | 0 | |
|
90 | 1 | |
|
91 | 2+ | |
|
92 | -3 | |
|
93 | +3+ | |
|
94 | 4 | |
|
95 | 5 | |
|
96 | 6 | |
|
97 | @@ -12,4 +12,4 @@ | |
|
98 | 8 | |
|
99 | 9 | |
|
100 | 10 | |
|
101 | -11+ | |
|
102 | +11- | |
|
103 | ||
|
104 | $ hg log -f -L foo,5-7 -p | |
|
105 | changeset: 5:cfdf972b3971 | |
|
106 | tag: tip | |
|
107 | user: test | |
|
108 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
109 | summary: foo: 3 -> 3+ and 11+ -> 11-; bar: a -> a+ | |
|
110 | ||
|
111 | diff --git a/foo b/foo | |
|
112 | --- a/foo | |
|
113 | +++ b/foo | |
|
114 | @@ -4,7 +4,7 @@ | |
|
115 | 0 | |
|
116 | 1 | |
|
117 | 2+ | |
|
118 | -3 | |
|
119 | +3+ | |
|
120 | 4 | |
|
121 | 5 | |
|
122 | 6 | |
|
123 | ||
|
124 | changeset: 4:eaec41c1a0c9 | |
|
125 | user: test | |
|
126 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
127 | summary: 11 -> 11+; leading space before "1" | |
|
128 | ||
|
129 | diff --git a/foo b/foo | |
|
130 | --- a/foo | |
|
131 | +++ b/foo | |
|
132 | @@ -2,7 +2,7 @@ | |
|
133 | 0 | |
|
134 | 0 | |
|
135 | 0 | |
|
136 | -1 | |
|
137 | + 1 | |
|
138 | 2+ | |
|
139 | 3 | |
|
140 | 4 | |
|
141 | ||
|
142 | changeset: 2:63a884426fd0 | |
|
143 | user: test | |
|
144 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
145 | summary: 2 -> 2+; added bar | |
|
146 | ||
|
147 | diff --git a/foo b/foo | |
|
148 | --- a/foo | |
|
149 | +++ b/foo | |
|
150 | @@ -3,6 +3,6 @@ | |
|
151 | 0 | |
|
152 | 0 | |
|
153 | 1 | |
|
154 | -2 | |
|
155 | +2+ | |
|
156 | 3 | |
|
157 | 4 | |
|
158 | ||
|
159 | changeset: 0:5ae1f82b9a00 | |
|
160 | user: test | |
|
161 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
162 | summary: init | |
|
163 | ||
|
164 | diff --git a/foo b/foo | |
|
165 | new file mode 100644 | |
|
166 | --- /dev/null | |
|
167 | +++ b/foo | |
|
168 | @@ -0,0 +1,5 @@ | |
|
169 | +0 | |
|
170 | +1 | |
|
171 | +2 | |
|
172 | +3 | |
|
173 | +4 | |
|
174 | ||
|
175 | ||
|
176 | With --template. | |
|
177 | ||
|
178 | $ hg log -f -L foo,5-7 -T '{rev}:{node|short} {desc|firstline}\n' | |
|
179 | 5:cfdf972b3971 foo: 3 -> 3+ and 11+ -> 11-; bar: a -> a+ | |
|
180 | 4:eaec41c1a0c9 11 -> 11+; leading space before "1" | |
|
181 | 2:63a884426fd0 2 -> 2+; added bar | |
|
182 | 0:5ae1f82b9a00 init | |
|
183 | $ hg log -f -L foo,5-7 -T json | |
|
184 | [ | |
|
185 | { | |
|
186 | "rev": 5, | |
|
187 | "node": "cfdf972b3971a2a59638bf9583c0debbffee5404", | |
|
188 | "branch": "default", | |
|
189 | "phase": "draft", | |
|
190 | "user": "test", | |
|
191 | "date": [0, 0], | |
|
192 | "desc": "foo: 3 -> 3+ and 11+ -> 11-; bar: a -> a+", | |
|
193 | "bookmarks": [], | |
|
194 | "tags": ["tip"], | |
|
195 | "parents": ["eaec41c1a0c9ad0a5e999611d0149d171beffb8c"] | |
|
196 | }, | |
|
197 | { | |
|
198 | "rev": 4, | |
|
199 | "node": "eaec41c1a0c9ad0a5e999611d0149d171beffb8c", | |
|
200 | "branch": "default", | |
|
201 | "phase": "draft", | |
|
202 | "user": "test", | |
|
203 | "date": [0, 0], | |
|
204 | "desc": "11 -> 11+; leading space before \"1\"", | |
|
205 | "bookmarks": [], | |
|
206 | "tags": [], | |
|
207 | "parents": ["730a61fbaecf426c17c2c66bc42d195b5d5b0ba8"] | |
|
208 | }, | |
|
209 | { | |
|
210 | "rev": 2, | |
|
211 | "node": "63a884426fd0b277fcd55895bbb2f230434576eb", | |
|
212 | "branch": "default", | |
|
213 | "phase": "draft", | |
|
214 | "user": "test", | |
|
215 | "date": [0, 0], | |
|
216 | "desc": "2 -> 2+; added bar", | |
|
217 | "bookmarks": [], | |
|
218 | "tags": [], | |
|
219 | "parents": ["29a1e7c6b80024f63f310a2d71de979e9d2996d7"] | |
|
220 | }, | |
|
221 | { | |
|
222 | "rev": 0, | |
|
223 | "node": "5ae1f82b9a000ff1e0967d0dac1c58b9d796e1b4", | |
|
224 | "branch": "default", | |
|
225 | "phase": "draft", | |
|
226 | "user": "test", | |
|
227 | "date": [0, 0], | |
|
228 | "desc": "init", | |
|
229 | "bookmarks": [], | |
|
230 | "tags": [], | |
|
231 | "parents": ["0000000000000000000000000000000000000000"] | |
|
232 | } | |
|
233 | ] | |
|
234 | ||
|
235 | With some white-space diff option, respective revisions are skipped. | |
|
236 | ||
|
237 | $ hg log -f -L foo,5-7 -p --config diff.ignorews=true | |
|
238 | changeset: 5:cfdf972b3971 | |
|
239 | tag: tip | |
|
240 | user: test | |
|
241 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
242 | summary: foo: 3 -> 3+ and 11+ -> 11-; bar: a -> a+ | |
|
243 | ||
|
244 | diff --git a/foo b/foo | |
|
245 | --- a/foo | |
|
246 | +++ b/foo | |
|
247 | @@ -4,7 +4,7 @@ | |
|
248 | 0 | |
|
249 | 1 | |
|
250 | 2+ | |
|
251 | -3 | |
|
252 | +3+ | |
|
253 | 4 | |
|
254 | 5 | |
|
255 | 6 | |
|
256 | ||
|
257 | changeset: 2:63a884426fd0 | |
|
258 | user: test | |
|
259 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
260 | summary: 2 -> 2+; added bar | |
|
261 | ||
|
262 | diff --git a/foo b/foo | |
|
263 | --- a/foo | |
|
264 | +++ b/foo | |
|
265 | @@ -3,6 +3,6 @@ | |
|
266 | 0 | |
|
267 | 0 | |
|
268 | 1 | |
|
269 | -2 | |
|
270 | +2+ | |
|
271 | 3 | |
|
272 | 4 | |
|
273 | ||
|
274 | changeset: 0:5ae1f82b9a00 | |
|
275 | user: test | |
|
276 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
277 | summary: init | |
|
278 | ||
|
279 | diff --git a/foo b/foo | |
|
280 | new file mode 100644 | |
|
281 | --- /dev/null | |
|
282 | +++ b/foo | |
|
283 | @@ -0,0 +1,5 @@ | |
|
284 | +0 | |
|
285 | +1 | |
|
286 | +2 | |
|
287 | +3 | |
|
288 | +4 | |
|
289 | ||
|
290 | ||
|
291 | Regular file patterns are allowed with -L and their diff shows all lines. | |
|
292 | ||
|
293 | $ hg log -f -L foo,5-7 -p bar | |
|
294 | changeset: 5:cfdf972b3971 | |
|
295 | tag: tip | |
|
296 | user: test | |
|
297 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
298 | summary: foo: 3 -> 3+ and 11+ -> 11-; bar: a -> a+ | |
|
299 | ||
|
300 | diff --git a/bar b/bar | |
|
301 | --- a/bar | |
|
302 | +++ b/bar | |
|
303 | @@ -1,4 +1,4 @@ | |
|
304 | -a | |
|
305 | +a+ | |
|
306 | b | |
|
307 | c | |
|
308 | d | |
|
309 | diff --git a/foo b/foo | |
|
310 | --- a/foo | |
|
311 | +++ b/foo | |
|
312 | @@ -4,7 +4,7 @@ | |
|
313 | 0 | |
|
314 | 1 | |
|
315 | 2+ | |
|
316 | -3 | |
|
317 | +3+ | |
|
318 | 4 | |
|
319 | 5 | |
|
320 | 6 | |
|
321 | ||
|
322 | changeset: 2:63a884426fd0 | |
|
323 | user: test | |
|
324 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
325 | summary: 2 -> 2+; added bar | |
|
326 | ||
|
327 | diff --git a/bar b/bar | |
|
328 | new file mode 100644 | |
|
329 | --- /dev/null | |
|
330 | +++ b/bar | |
|
331 | @@ -0,0 +1,5 @@ | |
|
332 | +a | |
|
333 | +b | |
|
334 | +c | |
|
335 | +d | |
|
336 | +e | |
|
337 | diff --git a/foo b/foo | |
|
338 | --- a/foo | |
|
339 | +++ b/foo | |
|
340 | @@ -3,6 +3,6 @@ | |
|
341 | 0 | |
|
342 | 0 | |
|
343 | 1 | |
|
344 | -2 | |
|
345 | +2+ | |
|
346 | 3 | |
|
347 | 4 | |
|
348 | ||
|
349 | ||
|
350 | Option --rev acts as a restriction. | |
|
351 | ||
|
352 | $ hg log -f -L foo,5-7 -p -r 'desc(2)' | |
|
353 | changeset: 2:63a884426fd0 | |
|
354 | user: test | |
|
355 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
356 | summary: 2 -> 2+; added bar | |
|
357 | ||
|
358 | diff --git a/foo b/foo | |
|
359 | --- a/foo | |
|
360 | +++ b/foo | |
|
361 | @@ -3,6 +3,6 @@ | |
|
362 | 0 | |
|
363 | 0 | |
|
364 | 1 | |
|
365 | -2 | |
|
366 | +2+ | |
|
367 | 3 | |
|
368 | 4 | |
|
369 | ||
|
370 | changeset: 0:5ae1f82b9a00 | |
|
371 | user: test | |
|
372 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
373 | summary: init | |
|
374 | ||
|
375 | diff --git a/foo b/foo | |
|
376 | new file mode 100644 | |
|
377 | --- /dev/null | |
|
378 | +++ b/foo | |
|
379 | @@ -0,0 +1,5 @@ | |
|
380 | +0 | |
|
381 | +1 | |
|
382 | +2 | |
|
383 | +3 | |
|
384 | +4 | |
|
385 | ||
|
386 | ||
|
387 | With several -L patterns, changes touching any files in their respective line | |
|
388 | range are show. | |
|
389 | ||
|
390 | $ hg log -f -L foo,5-7 -L bar,1-2 -p | |
|
391 | changeset: 5:cfdf972b3971 | |
|
392 | tag: tip | |
|
393 | user: test | |
|
394 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
395 | summary: foo: 3 -> 3+ and 11+ -> 11-; bar: a -> a+ | |
|
396 | ||
|
397 | diff --git a/bar b/bar | |
|
398 | --- a/bar | |
|
399 | +++ b/bar | |
|
400 | @@ -1,4 +1,4 @@ | |
|
401 | -a | |
|
402 | +a+ | |
|
403 | b | |
|
404 | c | |
|
405 | d | |
|
406 | diff --git a/foo b/foo | |
|
407 | --- a/foo | |
|
408 | +++ b/foo | |
|
409 | @@ -4,7 +4,7 @@ | |
|
410 | 0 | |
|
411 | 1 | |
|
412 | 2+ | |
|
413 | -3 | |
|
414 | +3+ | |
|
415 | 4 | |
|
416 | 5 | |
|
417 | 6 | |
|
418 | ||
|
419 | changeset: 4:eaec41c1a0c9 | |
|
420 | user: test | |
|
421 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
422 | summary: 11 -> 11+; leading space before "1" | |
|
423 | ||
|
424 | diff --git a/foo b/foo | |
|
425 | --- a/foo | |
|
426 | +++ b/foo | |
|
427 | @@ -2,7 +2,7 @@ | |
|
428 | 0 | |
|
429 | 0 | |
|
430 | 0 | |
|
431 | -1 | |
|
432 | + 1 | |
|
433 | 2+ | |
|
434 | 3 | |
|
435 | 4 | |
|
436 | ||
|
437 | changeset: 2:63a884426fd0 | |
|
438 | user: test | |
|
439 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
440 | summary: 2 -> 2+; added bar | |
|
441 | ||
|
442 | diff --git a/bar b/bar | |
|
443 | new file mode 100644 | |
|
444 | --- /dev/null | |
|
445 | +++ b/bar | |
|
446 | @@ -0,0 +1,5 @@ | |
|
447 | +a | |
|
448 | +b | |
|
449 | +c | |
|
450 | +d | |
|
451 | +e | |
|
452 | diff --git a/foo b/foo | |
|
453 | --- a/foo | |
|
454 | +++ b/foo | |
|
455 | @@ -3,6 +3,6 @@ | |
|
456 | 0 | |
|
457 | 0 | |
|
458 | 1 | |
|
459 | -2 | |
|
460 | +2+ | |
|
461 | 3 | |
|
462 | 4 | |
|
463 | ||
|
464 | changeset: 0:5ae1f82b9a00 | |
|
465 | user: test | |
|
466 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
467 | summary: init | |
|
468 | ||
|
469 | diff --git a/foo b/foo | |
|
470 | new file mode 100644 | |
|
471 | --- /dev/null | |
|
472 | +++ b/foo | |
|
473 | @@ -0,0 +1,5 @@ | |
|
474 | +0 | |
|
475 | +1 | |
|
476 | +2 | |
|
477 | +3 | |
|
478 | +4 | |
|
479 | ||
|
480 | ||
|
481 | Multiple -L options with the same file yields changes touching any of | |
|
482 | specified line ranges. | |
|
483 | ||
|
484 | $ hg log -f -L foo,5-7 -L foo,14-15 -p | |
|
485 | changeset: 5:cfdf972b3971 | |
|
486 | tag: tip | |
|
487 | user: test | |
|
488 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
489 | summary: foo: 3 -> 3+ and 11+ -> 11-; bar: a -> a+ | |
|
490 | ||
|
491 | diff --git a/foo b/foo | |
|
492 | --- a/foo | |
|
493 | +++ b/foo | |
|
494 | @@ -4,7 +4,7 @@ | |
|
495 | 0 | |
|
496 | 1 | |
|
497 | 2+ | |
|
498 | -3 | |
|
499 | +3+ | |
|
500 | 4 | |
|
501 | 5 | |
|
502 | 6 | |
|
503 | @@ -12,4 +12,4 @@ | |
|
504 | 8 | |
|
505 | 9 | |
|
506 | 10 | |
|
507 | -11+ | |
|
508 | +11- | |
|
509 | ||
|
510 | changeset: 4:eaec41c1a0c9 | |
|
511 | user: test | |
|
512 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
513 | summary: 11 -> 11+; leading space before "1" | |
|
514 | ||
|
515 | diff --git a/foo b/foo | |
|
516 | --- a/foo | |
|
517 | +++ b/foo | |
|
518 | @@ -2,7 +2,7 @@ | |
|
519 | 0 | |
|
520 | 0 | |
|
521 | 0 | |
|
522 | -1 | |
|
523 | + 1 | |
|
524 | 2+ | |
|
525 | 3 | |
|
526 | 4 | |
|
527 | @@ -12,4 +12,4 @@ | |
|
528 | 8 | |
|
529 | 9 | |
|
530 | 10 | |
|
531 | -11 | |
|
532 | +11+ | |
|
533 | ||
|
534 | changeset: 3:730a61fbaecf | |
|
535 | user: test | |
|
536 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
537 | summary: to 11 | |
|
538 | ||
|
539 | diff --git a/foo b/foo | |
|
540 | --- a/foo | |
|
541 | +++ b/foo | |
|
542 | @@ -6,3 +6,10 @@ | |
|
543 | 2+ | |
|
544 | 3 | |
|
545 | 4 | |
|
546 | +5 | |
|
547 | +6 | |
|
548 | +7 | |
|
549 | +8 | |
|
550 | +9 | |
|
551 | +10 | |
|
552 | +11 | |
|
553 | ||
|
554 | changeset: 2:63a884426fd0 | |
|
555 | user: test | |
|
556 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
557 | summary: 2 -> 2+; added bar | |
|
558 | ||
|
559 | diff --git a/foo b/foo | |
|
560 | --- a/foo | |
|
561 | +++ b/foo | |
|
562 | @@ -3,6 +3,6 @@ | |
|
563 | 0 | |
|
564 | 0 | |
|
565 | 1 | |
|
566 | -2 | |
|
567 | +2+ | |
|
568 | 3 | |
|
569 | 4 | |
|
570 | ||
|
571 | changeset: 0:5ae1f82b9a00 | |
|
572 | user: test | |
|
573 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
574 | summary: init | |
|
575 | ||
|
576 | diff --git a/foo b/foo | |
|
577 | new file mode 100644 | |
|
578 | --- /dev/null | |
|
579 | +++ b/foo | |
|
580 | @@ -0,0 +1,5 @@ | |
|
581 | +0 | |
|
582 | +1 | |
|
583 | +2 | |
|
584 | +3 | |
|
585 | +4 | |
|
586 | ||
|
587 | ||
|
588 | A file with a comma in its name. | |
|
589 | ||
|
590 | $ cat > ba,z << EOF | |
|
591 | > q | |
|
592 | > w | |
|
593 | > e | |
|
594 | > r | |
|
595 | > t | |
|
596 | > y | |
|
597 | > EOF | |
|
598 | $ hg ci -Am 'querty' | |
|
599 | adding ba,z | |
|
600 | $ cat >> ba,z << EOF | |
|
601 | > u | |
|
602 | > i | |
|
603 | > o | |
|
604 | > p | |
|
605 | > EOF | |
|
606 | $ hg ci -m 'more keys' | |
|
607 | $ cat > ba,z << EOF | |
|
608 | > a | |
|
609 | > z | |
|
610 | > e | |
|
611 | > r | |
|
612 | > t | |
|
613 | > y | |
|
614 | > u | |
|
615 | > i | |
|
616 | > o | |
|
617 | > p | |
|
618 | > EOF | |
|
619 | $ hg ci -m 'azerty' | |
|
620 | $ hg log -f -L ba,z,1-2 -p | |
|
621 | changeset: 8:52373265138b | |
|
622 | tag: tip | |
|
623 | user: test | |
|
624 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
625 | summary: azerty | |
|
626 | ||
|
627 | diff --git a/ba,z b/ba,z | |
|
628 | --- a/ba,z | |
|
629 | +++ b/ba,z | |
|
630 | @@ -1,5 +1,5 @@ | |
|
631 | -q | |
|
632 | -w | |
|
633 | +a | |
|
634 | +z | |
|
635 | e | |
|
636 | r | |
|
637 | t | |
|
638 | ||
|
639 | changeset: 6:96ba8850f316 | |
|
640 | user: test | |
|
641 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
642 | summary: querty | |
|
643 | ||
|
644 | diff --git a/ba,z b/ba,z | |
|
645 | new file mode 100644 | |
|
646 | --- /dev/null | |
|
647 | +++ b/ba,z | |
|
648 | @@ -0,0 +1,6 @@ | |
|
649 | +q | |
|
650 | +w | |
|
651 | +e | |
|
652 | +r | |
|
653 | +t | |
|
654 | +y | |
|
655 | ||
|
656 | ||
|
657 | Exact prefix kinds work in -L options. | |
|
658 | ||
|
659 | $ mkdir dir | |
|
660 | $ cd dir | |
|
661 | $ hg log -f -L path:foo,5-7 -p | |
|
662 | changeset: 5:cfdf972b3971 | |
|
663 | user: test | |
|
664 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
665 | summary: foo: 3 -> 3+ and 11+ -> 11-; bar: a -> a+ | |
|
666 | ||
|
667 | diff --git a/foo b/foo | |
|
668 | --- a/foo | |
|
669 | +++ b/foo | |
|
670 | @@ -4,7 +4,7 @@ | |
|
671 | 0 | |
|
672 | 1 | |
|
673 | 2+ | |
|
674 | -3 | |
|
675 | +3+ | |
|
676 | 4 | |
|
677 | 5 | |
|
678 | 6 | |
|
679 | ||
|
680 | changeset: 4:eaec41c1a0c9 | |
|
681 | user: test | |
|
682 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
683 | summary: 11 -> 11+; leading space before "1" | |
|
684 | ||
|
685 | diff --git a/foo b/foo | |
|
686 | --- a/foo | |
|
687 | +++ b/foo | |
|
688 | @@ -2,7 +2,7 @@ | |
|
689 | 0 | |
|
690 | 0 | |
|
691 | 0 | |
|
692 | -1 | |
|
693 | + 1 | |
|
694 | 2+ | |
|
695 | 3 | |
|
696 | 4 | |
|
697 | ||
|
698 | changeset: 2:63a884426fd0 | |
|
699 | user: test | |
|
700 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
701 | summary: 2 -> 2+; added bar | |
|
702 | ||
|
703 | diff --git a/foo b/foo | |
|
704 | --- a/foo | |
|
705 | +++ b/foo | |
|
706 | @@ -3,6 +3,6 @@ | |
|
707 | 0 | |
|
708 | 0 | |
|
709 | 1 | |
|
710 | -2 | |
|
711 | +2+ | |
|
712 | 3 | |
|
713 | 4 | |
|
714 | ||
|
715 | changeset: 0:5ae1f82b9a00 | |
|
716 | user: test | |
|
717 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
718 | summary: init | |
|
719 | ||
|
720 | diff --git a/foo b/foo | |
|
721 | new file mode 100644 | |
|
722 | --- /dev/null | |
|
723 | +++ b/foo | |
|
724 | @@ -0,0 +1,5 @@ | |
|
725 | +0 | |
|
726 | +1 | |
|
727 | +2 | |
|
728 | +3 | |
|
729 | +4 | |
|
730 | ||
|
731 | ||
|
732 | Renames are followed. | |
|
733 | ||
|
734 | $ hg mv ../foo baz | |
|
735 | $ sed 's/1/1+/' baz > baz.new | |
|
736 | $ mv baz.new baz | |
|
737 | $ hg ci -m 'foo -> dir/baz; 1-1+' | |
|
738 | $ hg diff -c . | |
|
739 | diff --git a/foo b/dir/baz | |
|
740 | rename from foo | |
|
741 | rename to dir/baz | |
|
742 | --- a/foo | |
|
743 | +++ b/dir/baz | |
|
744 | @@ -2,7 +2,7 @@ | |
|
745 | 0 | |
|
746 | 0 | |
|
747 | 0 | |
|
748 | - 1 | |
|
749 | + 1+ | |
|
750 | 2+ | |
|
751 | 3+ | |
|
752 | 4 | |
|
753 | @@ -11,5 +11,5 @@ | |
|
754 | 7 | |
|
755 | 8 | |
|
756 | 9 | |
|
757 | -10 | |
|
758 | -11- | |
|
759 | +1+0 | |
|
760 | +1+1- | |
|
761 | $ hg log -f -L relpath:baz,5-7 -p | |
|
762 | changeset: 9:6af29c3a778f | |
|
763 | tag: tip | |
|
764 | user: test | |
|
765 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
766 | summary: foo -> dir/baz; 1-1+ | |
|
767 | ||
|
768 | diff --git a/foo b/dir/baz | |
|
769 | copy from foo | |
|
770 | copy to dir/baz | |
|
771 | --- a/foo | |
|
772 | +++ b/dir/baz | |
|
773 | @@ -2,7 +2,7 @@ | |
|
774 | 0 | |
|
775 | 0 | |
|
776 | 0 | |
|
777 | - 1 | |
|
778 | + 1+ | |
|
779 | 2+ | |
|
780 | 3+ | |
|
781 | 4 | |
|
782 | ||
|
783 | changeset: 5:cfdf972b3971 | |
|
784 | user: test | |
|
785 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
786 | summary: foo: 3 -> 3+ and 11+ -> 11-; bar: a -> a+ | |
|
787 | ||
|
788 | diff --git a/foo b/foo | |
|
789 | --- a/foo | |
|
790 | +++ b/foo | |
|
791 | @@ -4,7 +4,7 @@ | |
|
792 | 0 | |
|
793 | 1 | |
|
794 | 2+ | |
|
795 | -3 | |
|
796 | +3+ | |
|
797 | 4 | |
|
798 | 5 | |
|
799 | 6 | |
|
800 | ||
|
801 | changeset: 4:eaec41c1a0c9 | |
|
802 | user: test | |
|
803 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
804 | summary: 11 -> 11+; leading space before "1" | |
|
805 | ||
|
806 | diff --git a/foo b/foo | |
|
807 | --- a/foo | |
|
808 | +++ b/foo | |
|
809 | @@ -2,7 +2,7 @@ | |
|
810 | 0 | |
|
811 | 0 | |
|
812 | 0 | |
|
813 | -1 | |
|
814 | + 1 | |
|
815 | 2+ | |
|
816 | 3 | |
|
817 | 4 | |
|
818 | ||
|
819 | changeset: 2:63a884426fd0 | |
|
820 | user: test | |
|
821 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
822 | summary: 2 -> 2+; added bar | |
|
823 | ||
|
824 | diff --git a/foo b/foo | |
|
825 | --- a/foo | |
|
826 | +++ b/foo | |
|
827 | @@ -3,6 +3,6 @@ | |
|
828 | 0 | |
|
829 | 0 | |
|
830 | 1 | |
|
831 | -2 | |
|
832 | +2+ | |
|
833 | 3 | |
|
834 | 4 | |
|
835 | ||
|
836 | changeset: 0:5ae1f82b9a00 | |
|
837 | user: test | |
|
838 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
839 | summary: init | |
|
840 | ||
|
841 | diff --git a/foo b/foo | |
|
842 | new file mode 100644 | |
|
843 | --- /dev/null | |
|
844 | +++ b/foo | |
|
845 | @@ -0,0 +1,5 @@ | |
|
846 | +0 | |
|
847 | +1 | |
|
848 | +2 | |
|
849 | +3 | |
|
850 | +4 | |
|
851 | ||
|
852 | Option --follow is required. | |
|
853 | ||
|
854 | $ hg log -L foo,5-7 | |
|
855 | abort: --line-range requires --follow | |
|
856 | [255] | |
|
857 | ||
|
858 | Non-exact pattern kinds are not allowed. | |
|
859 | ||
|
860 | $ cd .. | |
|
861 | $ hg log -f -L glob:*a*,1-2 | |
|
862 | hg: parse error: line range pattern 'glob:*a*' must match exactly one file | |
|
863 | [255] | |
|
864 | ||
|
865 | Graph log does work yet. | |
|
866 | ||
|
867 | $ hg log -f -L dir/baz,5-7 --graph | |
|
868 | abort: graph not supported with line range patterns | |
|
869 | [255] |
@@ -26,12 +26,14 b' from . import (' | |||
|
26 | 26 | changelog, |
|
27 | 27 | copies, |
|
28 | 28 | crecord as crecordmod, |
|
29 | dagop, | |
|
29 | 30 | dirstateguard, |
|
30 | 31 | encoding, |
|
31 | 32 | error, |
|
32 | 33 | formatter, |
|
33 | 34 | graphmod, |
|
34 | 35 | match as matchmod, |
|
36 | mdiff, | |
|
35 | 37 | obsolete, |
|
36 | 38 | patch, |
|
37 | 39 | pathutil, |
@@ -2585,6 +2587,87 b' def getlogrevs(repo, pats, opts):' | |||
|
2585 | 2587 | |
|
2586 | 2588 | return revs, expr, filematcher |
|
2587 | 2589 | |
|
2590 | def _parselinerangelogopt(repo, opts): | |
|
2591 | """Parse --line-range log option and return a list of tuples (filename, | |
|
2592 | (fromline, toline)). | |
|
2593 | """ | |
|
2594 | linerangebyfname = [] | |
|
2595 | for pat in opts.get('line_range', []): | |
|
2596 | try: | |
|
2597 | pat, linerange = pat.rsplit(',', 1) | |
|
2598 | except ValueError: | |
|
2599 | raise error.Abort(_('malformatted line-range pattern %s') % pat) | |
|
2600 | try: | |
|
2601 | fromline, toline = map(int, linerange.split('-')) | |
|
2602 | except ValueError: | |
|
2603 | raise error.Abort(_("invalid line range for %s") % pat) | |
|
2604 | msg = _("line range pattern '%s' must match exactly one file") % pat | |
|
2605 | fname = scmutil.parsefollowlinespattern(repo, None, pat, msg) | |
|
2606 | linerangebyfname.append( | |
|
2607 | (fname, util.processlinerange(fromline, toline))) | |
|
2608 | return linerangebyfname | |
|
2609 | ||
|
2610 | def getloglinerangerevs(repo, userrevs, opts): | |
|
2611 | """Return (revs, filematcher, hunksfilter). | |
|
2612 | ||
|
2613 | "revs" are revisions obtained by processing "line-range" log options and | |
|
2614 | walking block ancestors of each specified file/line-range. | |
|
2615 | ||
|
2616 | "filematcher(rev) -> match" is a factory function returning a match object | |
|
2617 | for a given revision for file patterns specified in --line-range option. | |
|
2618 | If neither --stat nor --patch options are passed, "filematcher" is None. | |
|
2619 | ||
|
2620 | "hunksfilter(rev) -> filterfn(fctx, hunks)" is a factory function | |
|
2621 | returning a hunks filtering function. | |
|
2622 | If neither --stat nor --patch options are passed, "filterhunks" is None. | |
|
2623 | """ | |
|
2624 | wctx = repo[None] | |
|
2625 | ||
|
2626 | # Two-levels map of "rev -> file ctx -> [line range]". | |
|
2627 | linerangesbyrev = {} | |
|
2628 | for fname, (fromline, toline) in _parselinerangelogopt(repo, opts): | |
|
2629 | fctx = wctx.filectx(fname) | |
|
2630 | for fctx, linerange in dagop.blockancestors(fctx, fromline, toline): | |
|
2631 | rev = fctx.introrev() | |
|
2632 | if rev not in userrevs: | |
|
2633 | continue | |
|
2634 | linerangesbyrev.setdefault( | |
|
2635 | rev, {}).setdefault( | |
|
2636 | fctx.path(), []).append(linerange) | |
|
2637 | ||
|
2638 | filematcher = None | |
|
2639 | hunksfilter = None | |
|
2640 | if opts.get('patch') or opts.get('stat'): | |
|
2641 | ||
|
2642 | def nofilterhunksfn(fctx, hunks): | |
|
2643 | return hunks | |
|
2644 | ||
|
2645 | def hunksfilter(rev): | |
|
2646 | fctxlineranges = linerangesbyrev.get(rev) | |
|
2647 | if fctxlineranges is None: | |
|
2648 | return nofilterhunksfn | |
|
2649 | ||
|
2650 | def filterfn(fctx, hunks): | |
|
2651 | lineranges = fctxlineranges.get(fctx.path()) | |
|
2652 | if lineranges is not None: | |
|
2653 | for hr, lines in hunks: | |
|
2654 | if any(mdiff.hunkinrange(hr[2:], lr) | |
|
2655 | for lr in lineranges): | |
|
2656 | yield hr, lines | |
|
2657 | else: | |
|
2658 | for hunk in hunks: | |
|
2659 | yield hunk | |
|
2660 | ||
|
2661 | return filterfn | |
|
2662 | ||
|
2663 | def filematcher(rev): | |
|
2664 | files = list(linerangesbyrev.get(rev, [])) | |
|
2665 | return scmutil.matchfiles(repo, files) | |
|
2666 | ||
|
2667 | revs = sorted(linerangesbyrev, reverse=True) | |
|
2668 | ||
|
2669 | return revs, filematcher, hunksfilter | |
|
2670 | ||
|
2588 | 2671 | def _graphnodeformatter(ui, displayer): |
|
2589 | 2672 | spec = ui.config('ui', 'graphnodetemplate') |
|
2590 | 2673 | if not spec: |
@@ -3234,6 +3234,9 b' def locate(ui, repo, *pats, **opts):' | |||
|
3234 | 3234 | ('k', 'keyword', [], |
|
3235 | 3235 | _('do case-insensitive search for a given text'), _('TEXT')), |
|
3236 | 3236 | ('r', 'rev', [], _('show the specified revision or revset'), _('REV')), |
|
3237 | ('L', 'line-range', [], | |
|
3238 | _('follow line range of specified file (EXPERIMENTAL)'), | |
|
3239 | _('FILE,RANGE')), | |
|
3237 | 3240 | ('', 'removed', None, _('include revisions where files were removed')), |
|
3238 | 3241 | ('m', 'only-merges', None, _('show only merges (DEPRECATED)')), |
|
3239 | 3242 | ('u', 'user', [], _('revisions committed by user'), _('USER')), |
@@ -3275,6 +3278,14 b' def log(ui, repo, *pats, **opts):' | |||
|
3275 | 3278 | Paths in the DAG are represented with '|', '/' and so forth. ':' in place |
|
3276 | 3279 | of a '|' indicates one or more revisions in a path are omitted. |
|
3277 | 3280 | |
|
3281 | .. container:: verbose | |
|
3282 | ||
|
3283 | Use -L/--line-range FILE,M-N options to follow the history of lines | |
|
3284 | from M to N in FILE. With -p/--patch only diff hunks affecting | |
|
3285 | specified line range will be shown. This option requires --follow; | |
|
3286 | it can be specified multiple times. Currently, this option is not | |
|
3287 | compatible with --graph. This option is experimental. | |
|
3288 | ||
|
3278 | 3289 | .. note:: |
|
3279 | 3290 | |
|
3280 | 3291 | :hg:`log --patch` may generate unexpected diff output for merge |
@@ -3290,6 +3301,14 b' def log(ui, repo, *pats, **opts):' | |||
|
3290 | 3301 | |
|
3291 | 3302 | .. container:: verbose |
|
3292 | 3303 | |
|
3304 | .. note:: | |
|
3305 | ||
|
3306 | The history resulting from -L/--line-range options depends on diff | |
|
3307 | options; for instance if white-spaces are ignored, respective changes | |
|
3308 | with only white-spaces in specified line range will not be listed. | |
|
3309 | ||
|
3310 | .. container:: verbose | |
|
3311 | ||
|
3293 | 3312 | Some examples: |
|
3294 | 3313 | |
|
3295 | 3314 | - changesets with full descriptions and file lists:: |
@@ -3336,6 +3355,15 b' def log(ui, repo, *pats, **opts):' | |||
|
3336 | 3355 | |
|
3337 | 3356 | hg log -r "last(tagged())::" --template "{desc|firstline}\\n" |
|
3338 | 3357 | |
|
3358 | - changesets touching lines 13 to 23 for file.c:: | |
|
3359 | ||
|
3360 | hg log -L file.c,13-23 | |
|
3361 | ||
|
3362 | - changesets touching lines 13 to 23 for file.c and lines 2 to 6 of | |
|
3363 | main.c with patch:: | |
|
3364 | ||
|
3365 | hg log -L file.c,13-23 -L main.c,2-6 -p | |
|
3366 | ||
|
3339 | 3367 | See :hg:`help dates` for a list of formats valid for -d/--date. |
|
3340 | 3368 | |
|
3341 | 3369 | See :hg:`help revisions` for more about specifying and ordering |
@@ -3350,14 +3378,38 b' def log(ui, repo, *pats, **opts):' | |||
|
3350 | 3378 | |
|
3351 | 3379 | """ |
|
3352 | 3380 | opts = pycompat.byteskwargs(opts) |
|
3381 | linerange = opts.get('line_range') | |
|
3382 | ||
|
3383 | if linerange and not opts.get('follow'): | |
|
3384 | raise error.Abort(_('--line-range requires --follow')) | |
|
3385 | ||
|
3353 | 3386 | if opts.get('follow') and opts.get('rev'): |
|
3354 | 3387 | opts['rev'] = [revsetlang.formatspec('reverse(::%lr)', opts.get('rev'))] |
|
3355 | 3388 | del opts['follow'] |
|
3356 | 3389 | |
|
3357 | 3390 | if opts.get('graph'): |
|
3391 | if linerange: | |
|
3392 | raise error.Abort(_('graph not supported with line range patterns')) | |
|
3358 | 3393 | return cmdutil.graphlog(ui, repo, pats, opts) |
|
3359 | 3394 | |
|
3360 | 3395 | revs, expr, filematcher = cmdutil.getlogrevs(repo, pats, opts) |
|
3396 | hunksfilter = None | |
|
3397 | ||
|
3398 | if linerange: | |
|
3399 | revs, lrfilematcher, hunksfilter = cmdutil.getloglinerangerevs( | |
|
3400 | repo, revs, opts) | |
|
3401 | ||
|
3402 | if filematcher is not None and lrfilematcher is not None: | |
|
3403 | basefilematcher = filematcher | |
|
3404 | ||
|
3405 | def filematcher(rev): | |
|
3406 | files = (basefilematcher(rev).files() | |
|
3407 | + lrfilematcher(rev).files()) | |
|
3408 | return scmutil.matchfiles(repo, files) | |
|
3409 | ||
|
3410 | elif filematcher is None: | |
|
3411 | filematcher = lrfilematcher | |
|
3412 | ||
|
3361 | 3413 | limit = cmdutil.loglimit(opts) |
|
3362 | 3414 | count = 0 |
|
3363 | 3415 | |
@@ -3385,7 +3437,12 b' def log(ui, repo, *pats, **opts):' | |||
|
3385 | 3437 | revmatchfn = filematcher(ctx.rev()) |
|
3386 | 3438 | else: |
|
3387 | 3439 | revmatchfn = None |
|
3388 | displayer.show(ctx, copies=copies, matchfn=revmatchfn) | |
|
3440 | if hunksfilter: | |
|
3441 | revhunksfilter = hunksfilter(rev) | |
|
3442 | else: | |
|
3443 | revhunksfilter = None | |
|
3444 | displayer.show(ctx, copies=copies, matchfn=revmatchfn, | |
|
3445 | hunksfilterfn=revhunksfilter) | |
|
3389 | 3446 | if displayer.flush(ctx): |
|
3390 | 3447 | count += 1 |
|
3391 | 3448 |
@@ -225,7 +225,7 b' Show all commands + options' | |||
|
225 | 225 | export: output, switch-parent, rev, text, git, binary, nodates |
|
226 | 226 | forget: include, exclude |
|
227 | 227 | init: ssh, remotecmd, insecure |
|
228 | log: follow, follow-first, date, copies, keyword, rev, removed, only-merges, user, only-branch, branch, prune, patch, git, limit, no-merges, stat, graph, style, template, include, exclude | |
|
228 | log: follow, follow-first, date, copies, keyword, rev, line-range, removed, only-merges, user, only-branch, branch, prune, patch, git, limit, no-merges, stat, graph, style, template, include, exclude | |
|
229 | 229 | merge: force, rev, preview, tool |
|
230 | 230 | pull: update, force, rev, bookmark, branch, ssh, remotecmd, insecure |
|
231 | 231 | push: force, rev, bookmark, branch, new-branch, pushvars, ssh, remotecmd, insecure |
General Comments 0
You need to be logged in to leave comments.
Login now