test-annotate.t
1202 lines
| 22.7 KiB
| text/troff
|
Tads3Lexer
/ tests / test-annotate.t
|
r42327 | $ cat >> "$HGRCPATH" << EOF | ||
> [ui] | ||||
> merge = :merge3 | ||||
> EOF | ||||
|
r11852 | |||
init | ||||
|
r15528 | $ hg init repo | ||
$ cd repo | ||||
|
r11852 | |||
commit | ||||
$ echo 'a' > a | ||||
$ hg ci -A -m test -u nobody -d '1 0' | ||||
adding a | ||||
annotate -c | ||||
$ hg annotate -c a | ||||
8435f90966e4: a | ||||
annotate -cl | ||||
$ hg annotate -cl a | ||||
8435f90966e4:1: a | ||||
annotate -d | ||||
$ hg annotate -d a | ||||
Thu Jan 01 00:00:01 1970 +0000: a | ||||
annotate -n | ||||
$ hg annotate -n a | ||||
0: a | ||||
annotate -nl | ||||
$ hg annotate -nl a | ||||
0:1: a | ||||
annotate -u | ||||
$ hg annotate -u a | ||||
nobody: a | ||||
annotate -cdnu | ||||
$ hg annotate -cdnu a | ||||
nobody 0 8435f90966e4 Thu Jan 01 00:00:01 1970 +0000: a | ||||
annotate -cdnul | ||||
$ hg annotate -cdnul a | ||||
nobody 0 8435f90966e4 Thu Jan 01 00:00:01 1970 +0000:1: a | ||||
|
r22480 | annotate (JSON) | ||
$ hg annotate -Tjson a | ||||
[ | ||||
{ | ||||
|
r32649 | "lines": [{"line": "a\n", "rev": 0}], | ||
"path": "a" | ||||
|
r22480 | } | ||
] | ||||
$ hg annotate -Tjson -cdfnul a | ||||
[ | ||||
{ | ||||
|
r39965 | "lines": [{"date": [1.0, 0], "line": "a\n", "lineno": 1, "node": "8435f90966e442695d2ded29fdade2bac5ad8065", "path": "a", "rev": 0, "user": "nobody"}], | ||
|
r32649 | "path": "a" | ||
|
r22480 | } | ||
] | ||||
|
r37000 | log-like templating | ||
$ hg annotate -T'{lines % "{rev} {node|shortest}: {line}"}' a | ||||
0 8435: a | ||||
|
r39965 | '{lineno}' field should be populated as necessary | ||
|
r38377 | |||
|
r39965 | $ hg annotate -T'{lines % "{rev}:{lineno}: {line}"}' a | ||
|
r38377 | 0:1: a | ||
|
r38465 | $ hg annotate -Ta a \ | ||
|
r39965 | > --config templates.a='"{lines % "{rev}:{lineno}: {line}"}"' | ||
|
r38465 | 0:1: a | ||
|
r38377 | |||
|
r11852 | $ cat <<EOF >>a | ||
> a | ||||
> a | ||||
> EOF | ||||
$ hg ci -ma1 -d '1 0' | ||||
$ hg cp a b | ||||
$ hg ci -mb -d '1 0' | ||||
$ cat <<EOF >> b | ||||
> b4 | ||||
> b5 | ||||
> b6 | ||||
> EOF | ||||
$ hg ci -mb2 -d '2 0' | ||||
|
r37518 | default output of '{lines}' should be readable | ||
$ hg annotate -T'{lines}' a | ||||
0: a | ||||
1: a | ||||
1: a | ||||
$ hg annotate -T'{join(lines, "\n")}' a | ||||
0: a | ||||
1: a | ||||
1: a | ||||
several filters can be applied to '{lines}' | ||||
|
r37520 | $ hg annotate -T'{lines|json}\n' a | ||
[{"line": "a\n", "rev": 0}, {"line": "a\n", "rev": 1}, {"line": "a\n", "rev": 1}] | ||||
|
r37518 | $ hg annotate -T'{lines|stringify}' a | ||
0: a | ||||
1: a | ||||
1: a | ||||
$ hg annotate -T'{lines|count}\n' a | ||||
3 | ||||
|
r32649 | annotate multiple files (JSON) | ||
$ hg annotate -Tjson a b | ||||
[ | ||||
{ | ||||
"lines": [{"line": "a\n", "rev": 0}, {"line": "a\n", "rev": 1}, {"line": "a\n", "rev": 1}], | ||||
"path": "a" | ||||
}, | ||||
{ | ||||
"lines": [{"line": "a\n", "rev": 0}, {"line": "a\n", "rev": 1}, {"line": "a\n", "rev": 1}, {"line": "b4\n", "rev": 3}, {"line": "b5\n", "rev": 3}, {"line": "b6\n", "rev": 3}], | ||||
"path": "b" | ||||
} | ||||
] | ||||
annotate multiple files (template) | ||||
|
r39405 | $ hg annotate -T'== {path} ==\n{lines % "{rev}: {line}"}' a b | ||
|
r32649 | == a == | ||
0: a | ||||
1: a | ||||
1: a | ||||
== b == | ||||
0: a | ||||
1: a | ||||
1: a | ||||
3: b4 | ||||
3: b5 | ||||
3: b6 | ||||
|
r11852 | annotate -n b | ||
$ hg annotate -n b | ||||
|
r30432 | 0: a | ||
|
r30431 | 1: a | ||
|
r11852 | 1: a | ||
3: b4 | ||||
3: b5 | ||||
3: b6 | ||||
annotate --no-follow b | ||||
$ hg annotate --no-follow b | ||||
2: a | ||||
2: a | ||||
2: a | ||||
3: b4 | ||||
3: b5 | ||||
3: b6 | ||||
annotate -nl b | ||||
$ hg annotate -nl b | ||||
0:1: a | ||||
|
r30432 | 1:2: a | ||
|
r11852 | 1:3: a | ||
3:4: b4 | ||||
3:5: b5 | ||||
3:6: b6 | ||||
annotate -nf b | ||||
$ hg annotate -nf b | ||||
|
r30432 | 0 a: a | ||
|
r30431 | 1 a: a | ||
|
r11852 | 1 a: a | ||
3 b: b4 | ||||
3 b: b5 | ||||
3 b: b6 | ||||
annotate -nlf b | ||||
$ hg annotate -nlf b | ||||
0 a:1: a | ||||
|
r30432 | 1 a:2: a | ||
|
r11852 | 1 a:3: a | ||
3 b:4: b4 | ||||
3 b:5: b5 | ||||
3 b:6: b6 | ||||
$ hg up -C 2 | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ cat <<EOF >> b | ||||
> b4 | ||||
> c | ||||
> b5 | ||||
> EOF | ||||
$ hg ci -mb2.1 -d '2 0' | ||||
created new head | ||||
$ hg merge | ||||
merging b | ||||
|
r42327 | warning: conflicts while merging b! (edit, then use 'hg resolve --mark') | ||
0 files updated, 0 files merged, 0 files removed, 1 files unresolved | ||||
use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon | ||||
[1] | ||||
$ cat b | ||||
a | ||||
a | ||||
a | ||||
<<<<<<< working copy: 5fbdc1152d97 - test: b2.1 | ||||
b4 | ||||
c | ||||
b5 | ||||
||||||| base | ||||
======= | ||||
b4 | ||||
b5 | ||||
b6 | ||||
>>>>>>> merge rev: 37ec9f5c3d1f - test: b2 | ||||
$ cat <<EOF > b | ||||
> a | ||||
> a | ||||
> a | ||||
> b4 | ||||
> c | ||||
> b5 | ||||
> EOF | ||||
$ hg resolve --mark -q | ||||
$ rm b.orig | ||||
|
r11852 | $ hg ci -mmergeb -d '3 0' | ||
annotate after merge | ||||
$ hg annotate -nf b | ||||
|
r30432 | 0 a: a | ||
|
r30431 | 1 a: a | ||
|
r11852 | 1 a: a | ||
3 b: b4 | ||||
4 b: c | ||||
3 b: b5 | ||||
annotate after merge with -l | ||||
$ hg annotate -nlf b | ||||
0 a:1: a | ||||
|
r30432 | 1 a:2: a | ||
|
r11852 | 1 a:3: a | ||
3 b:4: b4 | ||||
4 b:5: c | ||||
3 b:5: b5 | ||||
$ hg up -C 1 | ||||
0 files updated, 0 files merged, 1 files removed, 0 files unresolved | ||||
$ hg cp a b | ||||
$ cat <<EOF > b | ||||
> a | ||||
> z | ||||
> a | ||||
> EOF | ||||
$ hg ci -mc -d '3 0' | ||||
created new head | ||||
|
r42446 | Work around the pure version not resolving the conflict like native code | ||
#if pure | ||||
$ hg merge | ||||
merging b | ||||
warning: conflicts while merging b! (edit, then use 'hg resolve --mark') | ||||
0 files updated, 0 files merged, 0 files removed, 1 files unresolved | ||||
use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon | ||||
[1] | ||||
$ cat <<EOF > b | ||||
> a | ||||
> z | ||||
> a | ||||
> b4 | ||||
> c | ||||
> b5 | ||||
> EOF | ||||
$ hg resolve -m b | ||||
(no more unresolved files) | ||||
$ rm b.orig | ||||
#else | ||||
|
r11852 | $ hg merge | ||
merging b | ||||
|
r42408 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | ||
(branch merge, don't forget to commit) | ||||
|
r42446 | #endif | ||
|
r11852 | $ echo d >> b | ||
$ hg ci -mmerge2 -d '4 0' | ||||
annotate after rename merge | ||||
$ hg annotate -nf b | ||||
|
r30432 | 0 a: a | ||
|
r11852 | 6 b: z | ||
1 a: a | ||||
3 b: b4 | ||||
4 b: c | ||||
3 b: b5 | ||||
7 b: d | ||||
annotate after rename merge with -l | ||||
$ hg annotate -nlf b | ||||
|
r30432 | 0 a:1: a | ||
|
r11852 | 6 b:2: z | ||
1 a:3: a | ||||
3 b:4: b4 | ||||
4 b:5: c | ||||
3 b:5: b5 | ||||
7 b:7: d | ||||
|
r32486 | --skip nothing (should be the same as no --skip at all) | ||
$ hg annotate -nlf b --skip '1::0' | ||||
0 a:1: a | ||||
6 b:2: z | ||||
1 a:3: a | ||||
3 b:4: b4 | ||||
4 b:5: c | ||||
3 b:5: b5 | ||||
7 b:7: d | ||||
|
r32767 | --skip a modified line. Note a slight behavior difference in pure - this is | ||
because the pure code comes up with slightly different deltas internally. | ||||
|
r32486 | |||
$ hg annotate -nlf b --skip 6 | ||||
0 a:1: a | ||||
|
r34488 | 1 a:2* z (no-pure !) | ||
0 a:1* z (pure !) | ||||
|
r32486 | 1 a:3: a | ||
3 b:4: b4 | ||||
4 b:5: c | ||||
3 b:5: b5 | ||||
7 b:7: d | ||||
--skip added lines (and test multiple skip) | ||||
$ hg annotate -nlf b --skip 3 | ||||
0 a:1: a | ||||
6 b:2: z | ||||
1 a:3: a | ||||
|
r34435 | 1 a:3* b4 | ||
|
r32486 | 4 b:5: c | ||
|
r34435 | 1 a:3* b5 | ||
|
r32486 | 7 b:7: d | ||
$ hg annotate -nlf b --skip 4 | ||||
0 a:1: a | ||||
6 b:2: z | ||||
1 a:3: a | ||||
3 b:4: b4 | ||||
|
r34435 | 1 a:3* c | ||
|
r32486 | 3 b:5: b5 | ||
7 b:7: d | ||||
$ hg annotate -nlf b --skip 3 --skip 4 | ||||
0 a:1: a | ||||
6 b:2: z | ||||
1 a:3: a | ||||
|
r34435 | 1 a:3* b4 | ||
1 a:3* c | ||||
1 a:3* b5 | ||||
|
r32486 | 7 b:7: d | ||
$ hg annotate -nlf b --skip 'merge()' | ||||
0 a:1: a | ||||
6 b:2: z | ||||
1 a:3: a | ||||
3 b:4: b4 | ||||
4 b:5: c | ||||
3 b:5: b5 | ||||
|
r34435 | 3 b:5* d | ||
|
r32486 | |||
--skip everything -- use the revision the file was introduced in | ||||
$ hg annotate -nlf b --skip 'all()' | ||||
0 a:1: a | ||||
|
r34435 | 0 a:1* z | ||
0 a:1* a | ||||
0 a:1* b4 | ||||
0 a:1* c | ||||
0 a:1* b5 | ||||
0 a:1* d | ||||
|
r32486 | |||
|
r14358 | Issue2807: alignment of line numbers with -l | ||
$ echo more >> b | ||||
$ hg ci -mmore -d '5 0' | ||||
$ echo more >> b | ||||
$ hg ci -mmore -d '6 0' | ||||
$ echo more >> b | ||||
$ hg ci -mmore -d '7 0' | ||||
$ hg annotate -nlf b | ||||
|
r30432 | 0 a: 1: a | ||
|
r14358 | 6 b: 2: z | ||
1 a: 3: a | ||||
3 b: 4: b4 | ||||
4 b: 5: c | ||||
3 b: 5: b5 | ||||
7 b: 7: d | ||||
8 b: 8: more | ||||
9 b: 9: more | ||||
10 b:10: more | ||||
|
r11852 | linkrev vs rev | ||
$ hg annotate -r tip -n a | ||||
|
r30432 | 0: a | ||
|
r30431 | 1: a | ||
|
r11852 | 1: a | ||
linkrev vs rev with -l | ||||
$ hg annotate -r tip -nl a | ||||
0:1: a | ||||
|
r30432 | 1:2: a | ||
|
r11852 | 1:3: a | ||
|
r12399 | Issue589: "undelete" sequence leads to crash | ||
|
r11852 | |||
annotate was crashing when trying to --follow something | ||||
like A -> B -> A | ||||
generate ABA rename configuration | ||||
$ echo foo > foo | ||||
$ hg add foo | ||||
$ hg ci -m addfoo | ||||
$ hg rename foo bar | ||||
$ hg ci -m renamefoo | ||||
$ hg rename bar foo | ||||
$ hg ci -m renamebar | ||||
annotate after ABA with follow | ||||
$ hg annotate --follow foo | ||||
foo: foo | ||||
|
r13697 | missing file | ||
$ hg ann nosuchfile | ||||
|
r14358 | abort: nosuchfile: no such file in rev e9e6b4fa872f | ||
|
r48846 | [10] | ||
|
r15528 | |||
|
r15829 | annotate file without '\n' on last line | ||
$ printf "" > c | ||||
$ hg ci -A -m test -u nobody -d '1 0' | ||||
adding c | ||||
$ hg annotate c | ||||
$ printf "a\nb" > c | ||||
$ hg ci -m test | ||||
$ hg annotate c | ||||
[0-9]+: a (re) | ||||
[0-9]+: b (re) | ||||
|
r18993 | Issue3841: check annotation of the file of which filelog includes | ||
merging between the revision and its ancestor | ||||
to reproduce the situation with recent Mercurial, this script uses (1) | ||||
"hg debugsetparents" to merge without ancestor check by "hg merge", | ||||
and (2) the extension to allow filelog merging between the revision | ||||
and its ancestor by overriding "repo._filecommit". | ||||
$ cat > ../legacyrepo.py <<EOF | ||||
|
r33945 | > from __future__ import absolute_import | ||
|
r47771 | > from mercurial import commit, error, extensions | ||
r45760 | > def _filecommit(orig, repo, fctx, manifest1, manifest2, | |||
|
r46014 | > linkrev, tr, includecopymeta, ms): | ||
r45760 | > fname = fctx.path() | |||
> text = fctx.data() | ||||
> flog = repo.file(fname) | ||||
|
r47771 | > fparent1 = manifest1.get(fname, repo.nullid) | ||
> fparent2 = manifest2.get(fname, repo.nullid) | ||||
r45760 | > meta = {} | |||
> copy = fctx.copysource() | ||||
> if copy and copy != fname: | ||||
> raise error.Abort('copying is not supported') | ||||
|
r47771 | > if fparent2 != repo.nullid: | ||
r45760 | > return flog.add(text, meta, tr, linkrev, | |||
> fparent1, fparent2), 'modified' | ||||
> raise error.Abort('only merging is supported') | ||||
> def uisetup(ui): | ||||
> extensions.wrapfunction(commit, '_filecommit', _filecommit) | ||||
|
r18993 | > EOF | ||
$ cat > baz <<EOF | ||||
> 1 | ||||
> 2 | ||||
> 3 | ||||
> 4 | ||||
> 5 | ||||
> EOF | ||||
$ hg add baz | ||||
$ hg commit -m "baz:0" | ||||
$ cat > baz <<EOF | ||||
> 1 baz:1 | ||||
> 2 | ||||
> 3 | ||||
> 4 | ||||
> 5 | ||||
> EOF | ||||
$ hg commit -m "baz:1" | ||||
$ cat > baz <<EOF | ||||
> 1 baz:1 | ||||
> 2 baz:2 | ||||
> 3 | ||||
> 4 | ||||
> 5 | ||||
> EOF | ||||
$ hg debugsetparents 17 17 | ||||
$ hg --config extensions.legacyrepo=../legacyrepo.py commit -m "baz:2" | ||||
|
r37298 | $ hg debugindexdot baz | ||
|
r18993 | digraph G { | ||
-1 -> 0 | ||||
0 -> 1 | ||||
1 -> 2 | ||||
1 -> 2 | ||||
} | ||||
$ hg annotate baz | ||||
17: 1 baz:1 | ||||
18: 2 baz:2 | ||||
16: 3 | ||||
16: 4 | ||||
16: 5 | ||||
$ cat > baz <<EOF | ||||
> 1 baz:1 | ||||
> 2 baz:2 | ||||
> 3 baz:3 | ||||
> 4 | ||||
> 5 | ||||
> EOF | ||||
$ hg commit -m "baz:3" | ||||
$ cat > baz <<EOF | ||||
> 1 baz:1 | ||||
> 2 baz:2 | ||||
> 3 baz:3 | ||||
> 4 baz:4 | ||||
> 5 | ||||
> EOF | ||||
$ hg debugsetparents 19 18 | ||||
$ hg --config extensions.legacyrepo=../legacyrepo.py commit -m "baz:4" | ||||
|
r37298 | $ hg debugindexdot baz | ||
|
r18993 | digraph G { | ||
-1 -> 0 | ||||
0 -> 1 | ||||
1 -> 2 | ||||
1 -> 2 | ||||
2 -> 3 | ||||
3 -> 4 | ||||
2 -> 4 | ||||
} | ||||
$ hg annotate baz | ||||
17: 1 baz:1 | ||||
18: 2 baz:2 | ||||
19: 3 baz:3 | ||||
20: 4 baz:4 | ||||
16: 5 | ||||
|
r24421 | annotate clean file | ||
$ hg annotate -ncr "wdir()" foo | ||||
11 472b18db256d : foo | ||||
annotate modified file | ||||
$ echo foofoo >> foo | ||||
$ hg annotate -r "wdir()" foo | ||||
11 : foo | ||||
20+: foofoo | ||||
$ hg annotate -cr "wdir()" foo | ||||
472b18db256d : foo | ||||
b6bedd5477e7+: foofoo | ||||
$ hg annotate -ncr "wdir()" foo | ||||
11 472b18db256d : foo | ||||
20 b6bedd5477e7+: foofoo | ||||
$ hg annotate --debug -ncr "wdir()" foo | ||||
11 472b18db256d1e8282064eab4bfdaf48cbfe83cd : foo | ||||
20 b6bedd5477e797f25e568a6402d4697f3f895a72+: foofoo | ||||
$ hg annotate -udr "wdir()" foo | ||||
test Thu Jan 01 00:00:00 1970 +0000: foo | ||||
test [A-Za-z0-9:+ ]+: foofoo (re) | ||||
$ hg annotate -ncr "wdir()" -Tjson foo | ||||
[ | ||||
{ | ||||
|
r39834 | "lines": [{"line": "foo\n", "node": "472b18db256d1e8282064eab4bfdaf48cbfe83cd", "rev": 11}, {"line": "foofoo\n", "node": "ffffffffffffffffffffffffffffffffffffffff", "rev": 2147483647}], | ||
|
r32649 | "path": "foo" | ||
|
r24421 | } | ||
] | ||||
annotate added file | ||||
$ echo bar > bar | ||||
$ hg add bar | ||||
$ hg annotate -ncr "wdir()" bar | ||||
20 b6bedd5477e7+: bar | ||||
annotate renamed file | ||||
$ hg rename foo renamefoo2 | ||||
$ hg annotate -ncr "wdir()" renamefoo2 | ||||
11 472b18db256d : foo | ||||
20 b6bedd5477e7+: foofoo | ||||
annotate missing file | ||||
$ rm baz | ||||
|
r33341 | |||
|
r24498 | $ hg annotate -ncr "wdir()" baz | ||
r48617 | abort: $TESTTMP\repo/baz: $ENOENT$ (windows !) | |||
|
r41465 | abort: $ENOENT$: '$TESTTMP/repo/baz' (no-windows !) | ||
|
r24498 | [255] | ||
|
r24421 | |||
annotate removed file | ||||
$ hg rm baz | ||||
|
r33341 | |||
|
r24498 | $ hg annotate -ncr "wdir()" baz | ||
r48617 | abort: $TESTTMP\repo/baz: $ENOENT$ (windows !) | |||
|
r41465 | abort: $ENOENT$: '$TESTTMP/repo/baz' (no-windows !) | ||
|
r24498 | [255] | ||
|
r24421 | |||
|
r30719 | $ hg revert --all --no-backup --quiet | ||
$ hg id -n | ||||
20 | ||||
|
r31938 | Test followlines() revset; we usually check both followlines(pat, range) and | ||
followlines(pat, range, descend=True) to make sure both give the same result | ||||
when they should. | ||||
|
r30719 | |||
|
r32063 | $ echo a >> foo | ||
$ hg ci -m 'foo: add a' | ||||
|
r30804 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5)' | ||
|
r30719 | 16: baz:0 | ||
19: baz:3 | ||||
20: baz:4 | ||||
|
r30804 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5, startrev=20)' | ||
|
r30719 | 16: baz:0 | ||
19: baz:3 | ||||
20: baz:4 | ||||
|
r31938 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5, startrev=19)' | ||
|
r30719 | 16: baz:0 | ||
19: baz:3 | ||||
|
r31938 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5, startrev=19, descend=True)' | ||
|
r31992 | 19: baz:3 | ||
|
r31938 | 20: baz:4 | ||
|
r30719 | $ printf "0\n0\n" | cat - baz > baz1 | ||
$ mv baz1 baz | ||||
$ hg ci -m 'added two lines with 0' | ||||
|
r30804 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5:7)' | ||
|
r30719 | 16: baz:0 | ||
19: baz:3 | ||||
20: baz:4 | ||||
|
r31998 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5, descend=true, startrev=19)' | ||
|
r31992 | 19: baz:3 | ||
|
r31938 | 20: baz:4 | ||
|
r30719 | $ echo 6 >> baz | ||
$ hg ci -m 'added line 8' | ||||
|
r30804 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5:7)' | ||
|
r30719 | 16: baz:0 | ||
19: baz:3 | ||||
20: baz:4 | ||||
|
r31998 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5, startrev=19, descend=1)' | ||
|
r31992 | 19: baz:3 | ||
|
r31938 | 20: baz:4 | ||
|
r30719 | $ sed 's/3/3+/' baz > baz.new | ||
$ mv baz.new baz | ||||
$ hg ci -m 'baz:3->3+' | ||||
|
r31998 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5:7, descend=0)' | ||
|
r30719 | 16: baz:0 | ||
19: baz:3 | ||||
20: baz:4 | ||||
|
r32063 | 24: baz:3->3+ | ||
|
r31992 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5, startrev=17, descend=True)' | ||
19: baz:3 | ||||
|
r31938 | 20: baz:4 | ||
|
r32063 | 24: baz:3->3+ | ||
|
r31998 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 1:2, descend=false)' | ||
|
r32063 | 22: added two lines with 0 | ||
|
r30719 | |||
file patterns are okay | ||||
|
r30804 | $ hg log -T '{rev}: {desc}\n' -r 'followlines("path:baz", 1:2)' | ||
|
r32063 | 22: added two lines with 0 | ||
|
r30719 | |||
renames are followed | ||||
$ hg mv baz qux | ||||
$ sed 's/4/4+/' qux > qux.new | ||||
$ mv qux.new qux | ||||
$ hg ci -m 'qux:4->4+' | ||||
|
r30804 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(qux, 5:7)' | ||
|
r30719 | 16: baz:0 | ||
19: baz:3 | ||||
20: baz:4 | ||||
|
r32063 | 24: baz:3->3+ | ||
25: qux:4->4+ | ||||
|
r31938 | |||
but are missed when following children | ||||
$ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5:7, startrev=22, descend=True)' | ||||
|
r32063 | 24: baz:3->3+ | ||
|
r30719 | |||
merge | ||||
|
r32063 | $ hg up 24 --quiet | ||
|
r30719 | $ echo 7 >> baz | ||
$ hg ci -m 'one more line, out of line range' | ||||
created new head | ||||
$ sed 's/3+/3-/' baz > baz.new | ||||
$ mv baz.new baz | ||||
$ hg ci -m 'baz:3+->3-' | ||||
|
r30804 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5:7)' | ||
|
r30719 | 16: baz:0 | ||
19: baz:3 | ||||
20: baz:4 | ||||
|
r32063 | 24: baz:3->3+ | ||
27: baz:3+->3- | ||||
$ hg merge 25 | ||||
|
r30719 | merging baz and qux to qux | ||
|
r42327 | warning: conflicts while merging qux! (edit, then use 'hg resolve --mark') | ||
0 files updated, 0 files merged, 0 files removed, 1 files unresolved | ||||
use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon | ||||
[1] | ||||
$ cat qux | ||||
0 | ||||
0 | ||||
1 baz:1 | ||||
2 baz:2 | ||||
<<<<<<< working copy: 863de62655ef - test: baz:3+->3- | ||||
3- baz:3 | ||||
4 baz:4 | ||||
||||||| base | ||||
3+ baz:3 | ||||
4 baz:4 | ||||
======= | ||||
3+ baz:3 | ||||
4+ baz:4 | ||||
>>>>>>> merge rev: cb8df70ae185 - test: qux:4->4+ | ||||
5 | ||||
6 | ||||
7 | ||||
$ cat > qux <<EOF | ||||
> 0 | ||||
> 0 | ||||
> 1 baz:1 | ||||
> 2 baz:2 | ||||
> 3- baz:3 | ||||
> 4 baz:4 | ||||
> 5 | ||||
> 6 | ||||
> 7 | ||||
> EOF | ||||
$ hg resolve --mark -q | ||||
$ rm qux.orig | ||||
|
r30719 | $ hg ci -m merge | ||
|
r30804 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(qux, 5:7)' | ||
|
r30719 | 16: baz:0 | ||
19: baz:3 | ||||
20: baz:4 | ||||
|
r32063 | 24: baz:3->3+ | ||
25: qux:4->4+ | ||||
27: baz:3+->3- | ||||
28: merge | ||||
$ hg up 25 --quiet | ||||
$ hg merge 27 | ||||
|
r30719 | merging qux and baz to qux | ||
|
r42327 | warning: conflicts while merging qux! (edit, then use 'hg resolve --mark') | ||
0 files updated, 0 files merged, 0 files removed, 1 files unresolved | ||||
use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon | ||||
[1] | ||||
$ cat qux | ||||
0 | ||||
0 | ||||
1 baz:1 | ||||
2 baz:2 | ||||
<<<<<<< working copy: cb8df70ae185 - test: qux:4->4+ | ||||
3+ baz:3 | ||||
4+ baz:4 | ||||
||||||| base | ||||
3+ baz:3 | ||||
4 baz:4 | ||||
======= | ||||
3- baz:3 | ||||
4 baz:4 | ||||
>>>>>>> merge rev: 863de62655ef - test: baz:3+->3- | ||||
5 | ||||
6 | ||||
7 | ||||
$ cat > qux <<EOF | ||||
> 0 | ||||
> 0 | ||||
> 1 baz:1 | ||||
> 2 baz:2 | ||||
> 3+ baz:3 | ||||
> 4+ baz:4 | ||||
> 5 | ||||
> 6 | ||||
> EOF | ||||
$ hg resolve --mark -q | ||||
$ rm qux.orig | ||||
|
r30719 | $ hg ci -m 'merge from other side' | ||
created new head | ||||
|
r30804 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(qux, 5:7)' | ||
|
r30719 | 16: baz:0 | ||
19: baz:3 | ||||
20: baz:4 | ||||
|
r32063 | 24: baz:3->3+ | ||
25: qux:4->4+ | ||||
27: baz:3+->3- | ||||
29: merge from other side | ||||
$ hg up 24 --quiet | ||||
|
r30719 | |||
|
r31938 | we are missing the branch with rename when following children | ||
|
r32063 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5:7, startrev=26, descend=True)' | ||
27: baz:3+->3- | ||||
|
r31938 | |||
|
r31955 | we follow all branches in descending direction | ||
|
r32063 | $ hg up 23 --quiet | ||
|
r31955 | $ sed 's/3/+3/' baz > baz.new | ||
$ mv baz.new baz | ||||
$ hg ci -m 'baz:3->+3' | ||||
created new head | ||||
|
r31991 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 2:5, startrev=16, descend=True)' --graph | ||
|
r32063 | @ 30: baz:3->+3 | ||
|
r31955 | : | ||
|
r32063 | : o 27: baz:3+->3- | ||
|
r31955 | : : | ||
|
r32063 | : o 24: baz:3->3+ | ||
|
r31955 | :/ | ||
o 20: baz:4 | ||||
|\ | ||||
|
r31991 | | o 19: baz:3 | ||
|/ | ||||
|
r31992 | o 18: baz:2 | ||
: | ||||
o 16: baz:0 | ||||
| | ||||
~ | ||||
|
r31955 | |||
|
r33284 | Issue5595: on a merge changeset with different line ranges depending on | ||
parent, be conservative and use the surrounding interval to avoid loosing | ||||
track of possible further descendants in specified range. | ||||
$ hg up 23 --quiet | ||||
$ hg cat baz -r 24 | ||||
0 | ||||
0 | ||||
1 baz:1 | ||||
2 baz:2 | ||||
3+ baz:3 | ||||
4 baz:4 | ||||
5 | ||||
6 | ||||
$ cat > baz << EOF | ||||
> 0 | ||||
> 0 | ||||
> a | ||||
> b | ||||
> 3+ baz:3 | ||||
> 4 baz:4 | ||||
> y | ||||
> z | ||||
> EOF | ||||
$ hg ci -m 'baz: mostly rewrite with some content from 24' | ||||
created new head | ||||
$ hg merge --tool :merge-other 24 | ||||
merging baz | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
$ hg ci -m 'merge forgetting about baz rewrite' | ||||
$ cat > baz << EOF | ||||
> 0 | ||||
> 0 | ||||
> 1 baz:1 | ||||
> 2+ baz:2 | ||||
> 3+ baz:3 | ||||
> 4 baz:4 | ||||
> 5 | ||||
> 6 | ||||
> EOF | ||||
$ hg ci -m 'baz: narrow change (2->2+)' | ||||
$ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:4, startrev=20, descend=True)' --graph | ||||
@ 33: baz: narrow change (2->2+) | ||||
| | ||||
o 32: merge forgetting about baz rewrite | ||||
|\ | ||||
| o 31: baz: mostly rewrite with some content from 24 | ||||
| : | ||||
| : o 30: baz:3->+3 | ||||
| :/ | ||||
+---o 27: baz:3+->3- | ||||
| : | ||||
o : 24: baz:3->3+ | ||||
:/ | ||||
o 20: baz:4 | ||||
|\ | ||||
~ ~ | ||||
|
r41703 | An integer as a line range, which is parsed as '1:1' | ||
$ hg log -r 'followlines(baz, 1)' | ||||
changeset: 22:2174d0bf352a | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: added two lines with 0 | ||||
|
r30719 | check error cases | ||
|
r32063 | $ hg up 24 --quiet | ||
|
r30754 | $ hg log -r 'followlines()' | ||
hg: parse error: followlines takes at least 1 positional arguments | ||||
|
r46507 | [10] | ||
|
r30754 | $ hg log -r 'followlines(baz)' | ||
|
r30804 | hg: parse error: followlines requires a line range | ||
|
r46507 | [10] | ||
|
r41703 | $ hg log -r 'followlines(baz, x)' | ||
hg: parse error: followlines expects a line number or a range | ||||
|
r46507 | [10] | ||
|
r30804 | $ hg log -r 'followlines(baz, 1:2, startrev=desc("b"))' | ||
|
r30719 | hg: parse error: followlines expects exactly one revision | ||
|
r46507 | [10] | ||
|
r30804 | $ hg log -r 'followlines("glob:*", 1:2)' | ||
|
r30719 | hg: parse error: followlines expects exactly one file | ||
|
r46507 | [10] | ||
|
r30804 | $ hg log -r 'followlines(baz, 1:)' | ||
hg: parse error: line range bounds must be integers | ||||
|
r46507 | [10] | ||
|
r30804 | $ hg log -r 'followlines(baz, :1)' | ||
|
r30719 | hg: parse error: line range bounds must be integers | ||
|
r46507 | [10] | ||
|
r30804 | $ hg log -r 'followlines(baz, x:4)' | ||
hg: parse error: line range bounds must be integers | ||||
|
r46507 | [10] | ||
|
r30804 | $ hg log -r 'followlines(baz, 5:4)' | ||
|
r30719 | hg: parse error: line range must be positive | ||
|
r46507 | [10] | ||
|
r30804 | $ hg log -r 'followlines(baz, 0:4)' | ||
|
r30719 | hg: parse error: fromline must be strictly positive | ||
|
r46507 | [10] | ||
|
r30804 | $ hg log -r 'followlines(baz, 2:40)' | ||
|
r30719 | abort: line range exceeds file size | ||
|
r46485 | [10] | ||
|
r31998 | $ hg log -r 'followlines(baz, 2:4, startrev=20, descend=[1])' | ||
|
r33416 | hg: parse error at 43: not a prefix: [ | ||
|
r36703 | (followlines(baz, 2:4, startrev=20, descend=[1]) | ||
^ here) | ||||
|
r46507 | [10] | ||
|
r31998 | $ hg log -r 'followlines(baz, 2:4, startrev=20, descend=a)' | ||
|
r32086 | hg: parse error: descend argument must be a boolean | ||
|
r46507 | [10] | ||
|
r30719 | |||
|
r32649 | Test empty annotate output | ||
$ printf '\0' > binary | ||||
$ touch empty | ||||
$ hg ci -qAm 'add binary and empty files' | ||||
$ hg annotate binary empty | ||||
binary: binary file | ||||
$ hg annotate -Tjson binary empty | ||||
[ | ||||
{ | ||||
"path": "binary" | ||||
}, | ||||
{ | ||||
"lines": [], | ||||
"path": "empty" | ||||
} | ||||
] | ||||
|
r15528 | Test annotate with whitespace options | ||
$ cd .. | ||||
$ hg init repo-ws | ||||
$ cd repo-ws | ||||
$ cat > a <<EOF | ||||
> aa | ||||
> | ||||
> b b | ||||
> EOF | ||||
$ hg ci -Am "adda" | ||||
adding a | ||||
|
r17347 | $ sed 's/EOL$//g' > a <<EOF | ||
|
r15528 | > a a | ||
> | ||||
|
r17347 | > EOL | ||
|
r15528 | > b b | ||
> EOF | ||||
$ hg ci -m "changea" | ||||
Annotate with no option | ||||
$ hg annotate a | ||||
1: a a | ||||
0: | ||||
1: | ||||
1: b b | ||||
Annotate with --ignore-space-change | ||||
$ hg annotate --ignore-space-change a | ||||
1: a a | ||||
1: | ||||
0: | ||||
0: b b | ||||
Annotate with --ignore-all-space | ||||
$ hg annotate --ignore-all-space a | ||||
0: a a | ||||
0: | ||||
1: | ||||
0: b b | ||||
Annotate with --ignore-blank-lines (similar to no options case) | ||||
$ hg annotate --ignore-blank-lines a | ||||
1: a a | ||||
0: | ||||
1: | ||||
1: b b | ||||
|
r16913 | $ cd .. | ||
|
r23702 | |||
|
r36556 | Annotate with orphaned CR (issue5798) | ||
------------------------------------- | ||||
$ hg init repo-cr | ||||
$ cd repo-cr | ||||
|
r36723 | $ cat <<'EOF' >> "$TESTTMP/substcr.py" | ||
> import sys | ||||
|
r37138 | > from mercurial.utils import procutil | ||
> procutil.setbinary(sys.stdin) | ||||
> procutil.setbinary(sys.stdout) | ||||
|
r36723 | > stdin = getattr(sys.stdin, 'buffer', sys.stdin) | ||
> stdout = getattr(sys.stdout, 'buffer', sys.stdout) | ||||
> stdout.write(stdin.read().replace(b'\r', b'[CR]')) | ||||
> EOF | ||||
|
r36556 | |||
>>> with open('a', 'wb') as f: | ||||
|
r36845 | ... f.write(b'0a\r0b\r\n0c\r0d\r\n0e\n0f\n0g') and None | ||
|
r36556 | $ hg ci -qAm0 | ||
>>> with open('a', 'wb') as f: | ||||
|
r36845 | ... f.write(b'0a\r0b\r\n1c\r1d\r\n0e\n1f\n0g') and None | ||
|
r36556 | $ hg ci -m1 | ||
|
r39743 | $ hg annotate -r0 a | "$PYTHON" "$TESTTMP/substcr.py" | ||
|
r36556 | 0: 0a[CR]0b[CR] | ||
0: 0c[CR]0d[CR] | ||||
0: 0e | ||||
0: 0f | ||||
0: 0g | ||||
|
r39743 | $ hg annotate -r1 a | "$PYTHON" "$TESTTMP/substcr.py" | ||
|
r36556 | 0: 0a[CR]0b[CR] | ||
1: 1c[CR]1d[CR] | ||||
0: 0e | ||||
1: 1f | ||||
0: 0g | ||||
$ cd .. | ||||
|
r23702 | Annotate with linkrev pointing to another branch | ||
------------------------------------------------ | ||||
create history with a filerev whose linkrev points to another branch | ||||
$ hg init branchedlinkrev | ||||
$ cd branchedlinkrev | ||||
$ echo A > a | ||||
$ hg commit -Am 'contentA' | ||||
adding a | ||||
$ echo B >> a | ||||
$ hg commit -m 'contentB' | ||||
$ hg up --rev 'desc(contentA)' | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ echo unrelated > unrelated | ||||
$ hg commit -Am 'unrelated' | ||||
adding unrelated | ||||
created new head | ||||
$ hg graft -r 'desc(contentB)' | ||||
grafting 1:fd27c222e3e6 "contentB" | ||||
$ echo C >> a | ||||
$ hg commit -m 'contentC' | ||||
|
r24817 | $ echo W >> a | ||
|
r23702 | $ hg log -G | ||
@ changeset: 4:072f1e8df249 | ||||
| tag: tip | ||||
| user: test | ||||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| summary: contentC | ||||
| | ||||
o changeset: 3:ff38df03cc4b | ||||
| user: test | ||||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| summary: contentB | ||||
| | ||||
o changeset: 2:62aaf3f6fc06 | ||||
| parent: 0:f0932f74827e | ||||
| user: test | ||||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| summary: unrelated | ||||
| | ||||
| o changeset: 1:fd27c222e3e6 | ||||
|/ user: test | ||||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| summary: contentB | ||||
| | ||||
o changeset: 0:f0932f74827e | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: contentA | ||||
Annotate should list ancestor of starting revision only | ||||
$ hg annotate a | ||||
0: A | ||||
3: B | ||||
4: C | ||||
|
r24817 | $ hg annotate a -r 'wdir()' | ||
0 : A | ||||
3 : B | ||||
4 : C | ||||
4+: W | ||||
|
r23705 | Even when the starting revision is the linkrev-shadowed one: | ||
$ hg annotate a -r 3 | ||||
0: A | ||||
3: B | ||||
|
r23702 | $ cd .. | ||
|
r29861 | |||
Issue5360: Deleted chunk in p1 of a merge changeset | ||||
$ hg init repo-5360 | ||||
$ cd repo-5360 | ||||
$ echo 1 > a | ||||
$ hg commit -A a -m 1 | ||||
$ echo 2 >> a | ||||
$ hg commit -m 2 | ||||
$ echo a > a | ||||
$ hg commit -m a | ||||
$ hg update '.^' -q | ||||
$ echo 3 >> a | ||||
$ hg commit -m 3 -q | ||||
$ hg merge 2 -q | ||||
|
r42327 | warning: conflicts while merging a! (edit, then use 'hg resolve --mark') | ||
[1] | ||||
$ cat a | ||||
<<<<<<< working copy: 0a068f0261cf - test: 3 | ||||
1 | ||||
2 | ||||
3 | ||||
||||||| base | ||||
1 | ||||
2 | ||||
======= | ||||
a | ||||
>>>>>>> merge rev: 9409851bc20a - test: a | ||||
|
r29861 | $ cat > a << EOF | ||
> b | ||||
> 1 | ||||
> 2 | ||||
> 3 | ||||
> a | ||||
> EOF | ||||
$ hg resolve --mark -q | ||||
|
r42327 | $ rm a.orig | ||
|
r29861 | $ hg commit -m m | ||
$ hg annotate a | ||||
4: b | ||||
0: 1 | ||||
1: 2 | ||||
3: 3 | ||||
2: a | ||||
$ cd .. | ||||