##// END OF EJS Templates
wireprotov2: implement commands as a generator of objects...
wireprotov2: implement commands as a generator of objects Previously, wire protocol version 2 inherited version 1's model of having separate types to represent the results of different wire protocol commands. As I implemented more powerful commands in future commits, I found I was using a common pattern of returning a special type to hold a generator. This meant the command function required a closure to do most of the work. That made logic flow more difficult to follow. I also noticed that many commands were effectively a sequence of objects to be CBOR encoded. I think it makes sense to define version 2 commands as generators. This way, commands can simply emit the data structures they wish to send to the client. This eliminates the need for a closure in command functions and removes encoding from the bodies of commands. As part of this commit, the handling of response objects has been moved into the serverreactor class. This puts the reactor in the driver's seat with regards to CBOR encoding and error handling. Having error handling in the function that emits frames is particularly important because exceptions in that function can lead to things getting in a bad state: I'm fairly certain that uncaught exceptions in the frame generator were causing deadlocks. I also introduced a dedicated error type for explicit error reporting in command handlers. This will be used in subsequent commits. There's still a bit of work to be done here, especially around formalizing the error handling "protocol." I've added yet another TODO to track this so we don't forget. Test output changed because we're using generators and no longer know we are at the end of the data until we hit the end of the generator. This means we can't emit the end-of-stream flag until we've exhausted the generator. Hence the introduction of 0-sized end-of-stream frames. Differential Revision: https://phab.mercurial-scm.org/D4472

File last commit:

r39405:34ba4711 default
r39595:07b58266 default
Show More
test-annotate.t
1071 lines | 20.5 KiB | text/troff | Tads3Lexer
Martin Geisler
tests: unify test-annotate
r11852 $ HGMERGE=true; export HGMERGE
init
Patrick Mezard
annotate: support diff whitespace filtering flags (issue3030)...
r15528 $ hg init repo
$ cd repo
Martin Geisler
tests: unify test-annotate
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
Yuya Nishihara
annotate: port to generic templater enabled by hidden -T option...
r22480 annotate (JSON)
$ hg annotate -Tjson a
[
{
Yuya Nishihara
annotate: restructure formatter output to be nested list (BC)...
r32649 "lines": [{"line": "a\n", "rev": 0}],
"path": "a"
Yuya Nishihara
annotate: port to generic templater enabled by hidden -T option...
r22480 }
]
$ hg annotate -Tjson -cdfnul a
[
{
Yuya Nishihara
formatter: rename {abspath}/{file} to {path}, and drop relative {path} (BC)...
r39405 "lines": [{"date": [1.0, 0], "line": "a\n", "line_number": 1, "node": "8435f90966e442695d2ded29fdade2bac5ad8065", "path": "a", "rev": 0, "user": "nobody"}],
Yuya Nishihara
annotate: restructure formatter output to be nested list (BC)...
r32649 "path": "a"
Yuya Nishihara
annotate: port to generic templater enabled by hidden -T option...
r22480 }
]
Yuya Nishihara
annotate: add support for template keywords and functions depending on ctx
r37000 log-like templating
$ hg annotate -T'{lines % "{rev} {node|shortest}: {line}"}' a
0 8435: a
Yuya Nishihara
annotate: automatically populate fields referenced from template...
r38377 '{line_number}' field should be populated as necessary
$ hg annotate -T'{lines % "{rev}:{line_number}: {line}"}' a
0:1: a
Yuya Nishihara
formatter: look for template symbols from the associated name...
r38465 $ hg annotate -Ta a \
> --config templates.a='"{lines % "{rev}:{line_number}: {line}"}"'
0:1: a
Yuya Nishihara
annotate: automatically populate fields referenced from template...
r38377
Martin Geisler
tests: unify test-annotate
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'
Yuya Nishihara
formatter: make nested items somewhat readable in template output
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}'
Yuya Nishihara
formatter: remove template resources from nested items before generating JSON
r37520 $ hg annotate -T'{lines|json}\n' a
[{"line": "a\n", "rev": 0}, {"line": "a\n", "rev": 1}, {"line": "a\n", "rev": 1}]
Yuya Nishihara
formatter: make nested items somewhat readable in template output
r37518 $ hg annotate -T'{lines|stringify}' a
0: a
1: a
1: a
$ hg annotate -T'{lines|count}\n' a
3
Yuya Nishihara
annotate: restructure formatter output to be nested list (BC)...
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)
Yuya Nishihara
formatter: rename {abspath}/{file} to {path}, and drop relative {path} (BC)...
r39405 $ hg annotate -T'== {path} ==\n{lines % "{rev}: {line}"}' a b
Yuya Nishihara
annotate: restructure formatter output to be nested list (BC)...
r32649 == a ==
0: a
1: a
1: a
== b ==
0: a
1: a
1: a
3: b4
3: b5
3: b6
Martin Geisler
tests: unify test-annotate
r11852 annotate -n b
$ hg annotate -n b
Mads Kiilerich
bdiff: give slight preference to appending lines...
r30432 0: a
Mads Kiilerich
bdiff: give slight preference to longest matches in the middle of the B side...
r30431 1: a
Martin Geisler
tests: unify test-annotate
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
Mads Kiilerich
bdiff: give slight preference to appending lines...
r30432 1:2: a
Martin Geisler
tests: unify test-annotate
r11852 1:3: a
3:4: b4
3:5: b5
3:6: b6
annotate -nf b
$ hg annotate -nf b
Mads Kiilerich
bdiff: give slight preference to appending lines...
r30432 0 a: a
Mads Kiilerich
bdiff: give slight preference to longest matches in the middle of the B side...
r30431 1 a: a
Martin Geisler
tests: unify test-annotate
r11852 1 a: a
3 b: b4
3 b: b5
3 b: b6
annotate -nlf b
$ hg annotate -nlf b
0 a:1: a
Mads Kiilerich
bdiff: give slight preference to appending lines...
r30432 1 a:2: a
Martin Geisler
tests: unify test-annotate
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
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg ci -mmergeb -d '3 0'
annotate after merge
$ hg annotate -nf b
Mads Kiilerich
bdiff: give slight preference to appending lines...
r30432 0 a: a
Mads Kiilerich
bdiff: give slight preference to longest matches in the middle of the B side...
r30431 1 a: a
Martin Geisler
tests: unify test-annotate
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
Mads Kiilerich
bdiff: give slight preference to appending lines...
r30432 1 a:2: a
Martin Geisler
tests: unify test-annotate
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
$ hg merge
merging b
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ cat <<EOF >> b
> b4
> c
> b5
> EOF
$ echo d >> b
$ hg ci -mmerge2 -d '4 0'
annotate after rename merge
$ hg annotate -nf b
Mads Kiilerich
bdiff: give slight preference to appending lines...
r30432 0 a: a
Martin Geisler
tests: unify test-annotate
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
Mads Kiilerich
bdiff: give slight preference to appending lines...
r30432 0 a:1: a
Martin Geisler
tests: unify test-annotate
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
Siddharth Agarwal
annotate: add a new experimental --skip option to skip revs...
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
Augie Fackler
tests: handle variation between pure and normal output in annotate --skip...
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.
Siddharth Agarwal
annotate: add a new experimental --skip option to skip revs...
r32486
$ hg annotate -nlf b --skip 6
0 a:1: a
Augie Fackler
test-annotate: fix up expected output for pure...
r34488 1 a:2* z (no-pure !)
0 a:1* z (pure !)
Siddharth Agarwal
annotate: add a new experimental --skip option to skip revs...
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
Siddharth Agarwal
annotate: mark lines affected by skip-annotate with *...
r34435 1 a:3* b4
Siddharth Agarwal
annotate: add a new experimental --skip option to skip revs...
r32486 4 b:5: c
Siddharth Agarwal
annotate: mark lines affected by skip-annotate with *...
r34435 1 a:3* b5
Siddharth Agarwal
annotate: add a new experimental --skip option to skip revs...
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
Siddharth Agarwal
annotate: mark lines affected by skip-annotate with *...
r34435 1 a:3* c
Siddharth Agarwal
annotate: add a new experimental --skip option to skip revs...
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
Siddharth Agarwal
annotate: mark lines affected by skip-annotate with *...
r34435 1 a:3* b4
1 a:3* c
1 a:3* b5
Siddharth Agarwal
annotate: add a new experimental --skip option to skip revs...
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
Siddharth Agarwal
annotate: mark lines affected by skip-annotate with *...
r34435 3 b:5* d
Siddharth Agarwal
annotate: add a new experimental --skip option to skip revs...
r32486
--skip everything -- use the revision the file was introduced in
$ hg annotate -nlf b --skip 'all()'
0 a:1: a
Siddharth Agarwal
annotate: mark lines affected by skip-annotate with *...
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
Siddharth Agarwal
annotate: add a new experimental --skip option to skip revs...
r32486
Thomas Arendsen Hein
annotate: fix alignment of columns in front of line numbers (issue2807)
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
Mads Kiilerich
bdiff: give slight preference to appending lines...
r30432 0 a: 1: a
Thomas Arendsen Hein
annotate: fix alignment of columns in front of line numbers (issue2807)
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
Martin Geisler
tests: unify test-annotate
r11852 linkrev vs rev
$ hg annotate -r tip -n a
Mads Kiilerich
bdiff: give slight preference to appending lines...
r30432 0: a
Mads Kiilerich
bdiff: give slight preference to longest matches in the middle of the B side...
r30431 1: a
Martin Geisler
tests: unify test-annotate
r11852 1: a
linkrev vs rev with -l
$ hg annotate -r tip -nl a
0:1: a
Mads Kiilerich
bdiff: give slight preference to appending lines...
r30432 1:2: a
Martin Geisler
tests: unify test-annotate
r11852 1:3: a
Martin Geisler
tests: added a short description to issue numbers...
r12399 Issue589: "undelete" sequence leads to crash
Martin Geisler
tests: unify test-annotate
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
Matt Mackall
annotate: catch nonexistent files using match.bad callback (issue1590)
r13697 missing file
$ hg ann nosuchfile
Thomas Arendsen Hein
annotate: fix alignment of columns in front of line numbers (issue2807)
r14358 abort: nosuchfile: no such file in rev e9e6b4fa872f
Matt Mackall
annotate: catch nonexistent files using match.bad callback (issue1590)
r13697 [255]
Patrick Mezard
annotate: support diff whitespace filtering flags (issue3030)...
r15528
Ion Savin
annotate: append newline after non newline-terminated file listings...
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)
FUJIWARA Katsunori
annotate: increase refcount of each revisions correctly (issue3841)...
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
Augie Fackler
tests: update test-annotate to pass our module import checker
r33945 > from __future__ import absolute_import
> from mercurial import error, node
FUJIWARA Katsunori
annotate: increase refcount of each revisions correctly (issue3841)...
r18993 > def reposetup(ui, repo):
> class legacyrepo(repo.__class__):
> def _filecommit(self, fctx, manifest1, manifest2,
> linkrev, tr, changelist):
> fname = fctx.path()
> text = fctx.data()
> flog = self.file(fname)
> fparent1 = manifest1.get(fname, node.nullid)
> fparent2 = manifest2.get(fname, node.nullid)
> meta = {}
> copy = fctx.renamed()
> if copy and copy[0] != fname:
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 > raise error.Abort('copying is not supported')
FUJIWARA Katsunori
annotate: increase refcount of each revisions correctly (issue3841)...
r18993 > if fparent2 != node.nullid:
> changelist.append(fname)
> return flog.add(text, meta, tr, linkrev,
> fparent1, fparent2)
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 > raise error.Abort('only merging is supported')
FUJIWARA Katsunori
annotate: increase refcount of each revisions correctly (issue3841)...
r18993 > repo.__class__ = legacyrepo
> 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"
Gregory Szorc
tests: don't use revlog paths in tests...
r37298 $ hg debugindexdot baz
FUJIWARA Katsunori
annotate: increase refcount of each revisions correctly (issue3841)...
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"
Gregory Szorc
tests: don't use revlog paths in tests...
r37298 $ hg debugindexdot baz
FUJIWARA Katsunori
annotate: increase refcount of each revisions correctly (issue3841)...
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
Yuya Nishihara
annotate: add option to annotate working-directory files...
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
[
{
Yuya Nishihara
annotate: restructure formatter output to be nested list (BC)...
r32649 "lines": [{"line": "foo\n", "node": "472b18db256d1e8282064eab4bfdaf48cbfe83cd", "rev": 11}, {"line": "foofoo\n", "node": null, "rev": null}],
"path": "foo"
Yuya Nishihara
annotate: add option to annotate working-directory files...
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
Matt Harbison
test-annotate: conditionalize output instead of tests
r33341
Matt Harbison
test-annotate: conditionalize error output for Windows...
r24498 $ hg annotate -ncr "wdir()" baz
Matt Harbison
tests: add a substitution for ENOENT/ERROR_FILE_NOT_FOUND messages...
r35230 abort: $TESTTMP\repo\baz: $ENOENT$ (windows !)
abort: $ENOENT$: $TESTTMP/repo/baz (no-windows !)
Matt Harbison
test-annotate: conditionalize error output for Windows...
r24498 [255]
Yuya Nishihara
annotate: add option to annotate working-directory files...
r24421
annotate removed file
$ hg rm baz
Matt Harbison
test-annotate: conditionalize output instead of tests
r33341
Matt Harbison
test-annotate: conditionalize error output for Windows...
r24498 $ hg annotate -ncr "wdir()" baz
Matt Harbison
tests: add a substitution for ENOENT/ERROR_FILE_NOT_FOUND messages...
r35230 abort: $TESTTMP\repo\baz: $ENOENT$ (windows !)
abort: $ENOENT$: $TESTTMP/repo/baz (no-windows !)
Matt Harbison
test-annotate: conditionalize error output for Windows...
r24498 [255]
Yuya Nishihara
annotate: add option to annotate working-directory files...
r24421
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 $ hg revert --all --no-backup --quiet
$ hg id -n
20
Denis Laxalde
revset: add a 'descend' argument to followlines to return descendants...
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.
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719
Denis Laxalde
context: start walking from "introrev" in blockancestors()...
r32063 $ echo a >> foo
$ hg ci -m 'foo: add a'
Yuya Nishihara
revset: abuse x:y syntax to specify line range of followlines()...
r30804 $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5)'
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 16: baz:0
19: baz:3
20: baz:4
Yuya Nishihara
revset: abuse x:y syntax to specify line range of followlines()...
r30804 $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5, startrev=20)'
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 16: baz:0
19: baz:3
20: baz:4
Denis Laxalde
revset: add a 'descend' argument to followlines to return descendants...
r31938 $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5, startrev=19)'
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 16: baz:0
19: baz:3
Denis Laxalde
revset: add a 'descend' argument to followlines to return descendants...
r31938 $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5, startrev=19, descend=True)'
Denis Laxalde
context: possibly yield initial fctx in blockdescendants()...
r31992 19: baz:3
Denis Laxalde
revset: add a 'descend' argument to followlines to return descendants...
r31938 20: baz:4
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 $ printf "0\n0\n" | cat - baz > baz1
$ mv baz1 baz
$ hg ci -m 'added two lines with 0'
Yuya Nishihara
revset: abuse x:y syntax to specify line range of followlines()...
r30804 $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5:7)'
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 16: baz:0
19: baz:3
20: baz:4
Denis Laxalde
revset: properly parse "descend" argument of followlines()...
r31998 $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5, descend=true, startrev=19)'
Denis Laxalde
context: possibly yield initial fctx in blockdescendants()...
r31992 19: baz:3
Denis Laxalde
revset: add a 'descend' argument to followlines to return descendants...
r31938 20: baz:4
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 $ echo 6 >> baz
$ hg ci -m 'added line 8'
Yuya Nishihara
revset: abuse x:y syntax to specify line range of followlines()...
r30804 $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5:7)'
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 16: baz:0
19: baz:3
20: baz:4
Denis Laxalde
revset: properly parse "descend" argument of followlines()...
r31998 $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5, startrev=19, descend=1)'
Denis Laxalde
context: possibly yield initial fctx in blockdescendants()...
r31992 19: baz:3
Denis Laxalde
revset: add a 'descend' argument to followlines to return descendants...
r31938 20: baz:4
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 $ sed 's/3/3+/' baz > baz.new
$ mv baz.new baz
$ hg ci -m 'baz:3->3+'
Denis Laxalde
revset: properly parse "descend" argument of followlines()...
r31998 $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5:7, descend=0)'
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 16: baz:0
19: baz:3
20: baz:4
Denis Laxalde
context: start walking from "introrev" in blockancestors()...
r32063 24: baz:3->3+
Denis Laxalde
context: possibly yield initial fctx in blockdescendants()...
r31992 $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5, startrev=17, descend=True)'
19: baz:3
Denis Laxalde
revset: add a 'descend' argument to followlines to return descendants...
r31938 20: baz:4
Denis Laxalde
context: start walking from "introrev" in blockancestors()...
r32063 24: baz:3->3+
Denis Laxalde
revset: properly parse "descend" argument of followlines()...
r31998 $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 1:2, descend=false)'
Denis Laxalde
context: start walking from "introrev" in blockancestors()...
r32063 22: added two lines with 0
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719
file patterns are okay
Yuya Nishihara
revset: abuse x:y syntax to specify line range of followlines()...
r30804 $ hg log -T '{rev}: {desc}\n' -r 'followlines("path:baz", 1:2)'
Denis Laxalde
context: start walking from "introrev" in blockancestors()...
r32063 22: added two lines with 0
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
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+'
Yuya Nishihara
revset: abuse x:y syntax to specify line range of followlines()...
r30804 $ hg log -T '{rev}: {desc}\n' -r 'followlines(qux, 5:7)'
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 16: baz:0
19: baz:3
20: baz:4
Denis Laxalde
context: start walking from "introrev" in blockancestors()...
r32063 24: baz:3->3+
25: qux:4->4+
Denis Laxalde
revset: add a 'descend' argument to followlines to return descendants...
r31938
but are missed when following children
$ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5:7, startrev=22, descend=True)'
Denis Laxalde
context: start walking from "introrev" in blockancestors()...
r32063 24: baz:3->3+
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719
merge
Denis Laxalde
context: start walking from "introrev" in blockancestors()...
r32063 $ hg up 24 --quiet
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
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-'
Yuya Nishihara
revset: abuse x:y syntax to specify line range of followlines()...
r30804 $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5:7)'
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 16: baz:0
19: baz:3
20: baz:4
Denis Laxalde
context: start walking from "introrev" in blockancestors()...
r32063 24: baz:3->3+
27: baz:3+->3-
$ hg merge 25
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 merging baz and qux to qux
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg ci -m merge
Yuya Nishihara
revset: abuse x:y syntax to specify line range of followlines()...
r30804 $ hg log -T '{rev}: {desc}\n' -r 'followlines(qux, 5:7)'
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 16: baz:0
19: baz:3
20: baz:4
Denis Laxalde
context: start walking from "introrev" in blockancestors()...
r32063 24: baz:3->3+
25: qux:4->4+
27: baz:3+->3-
28: merge
$ hg up 25 --quiet
$ hg merge 27
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 merging qux and baz to qux
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg ci -m 'merge from other side'
created new head
Yuya Nishihara
revset: abuse x:y syntax to specify line range of followlines()...
r30804 $ hg log -T '{rev}: {desc}\n' -r 'followlines(qux, 5:7)'
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 16: baz:0
19: baz:3
20: baz:4
Denis Laxalde
context: start walking from "introrev" in blockancestors()...
r32063 24: baz:3->3+
25: qux:4->4+
27: baz:3+->3-
29: merge from other side
$ hg up 24 --quiet
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719
Denis Laxalde
revset: add a 'descend' argument to followlines to return descendants...
r31938 we are missing the branch with rename when following children
Denis Laxalde
context: start walking from "introrev" in blockancestors()...
r32063 $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5:7, startrev=26, descend=True)'
27: baz:3+->3-
Denis Laxalde
revset: add a 'descend' argument to followlines to return descendants...
r31938
Denis Laxalde
context: follow all branches in blockdescendants()...
r31955 we follow all branches in descending direction
Denis Laxalde
context: start walking from "introrev" in blockancestors()...
r32063 $ hg up 23 --quiet
Denis Laxalde
context: follow all branches in blockdescendants()...
r31955 $ sed 's/3/+3/' baz > baz.new
$ mv baz.new baz
$ hg ci -m 'baz:3->+3'
created new head
Denis Laxalde
context: add an assertion checking linerange consistency in blockdescendants()...
r31991 $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 2:5, startrev=16, descend=True)' --graph
Denis Laxalde
context: start walking from "introrev" in blockancestors()...
r32063 @ 30: baz:3->+3
Denis Laxalde
context: follow all branches in blockdescendants()...
r31955 :
Denis Laxalde
context: start walking from "introrev" in blockancestors()...
r32063 : o 27: baz:3+->3-
Denis Laxalde
context: follow all branches in blockdescendants()...
r31955 : :
Denis Laxalde
context: start walking from "introrev" in blockancestors()...
r32063 : o 24: baz:3->3+
Denis Laxalde
context: follow all branches in blockdescendants()...
r31955 :/
o 20: baz:4
|\
Denis Laxalde
context: add an assertion checking linerange consistency in blockdescendants()...
r31991 | o 19: baz:3
|/
Denis Laxalde
context: possibly yield initial fctx in blockdescendants()...
r31992 o 18: baz:2
:
o 16: baz:0
|
~
Denis Laxalde
context: follow all branches in blockdescendants()...
r31955
Denis Laxalde
followlines: join merge parents line ranges in blockdescendants() (issue5595)...
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
|\
~ ~
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 check error cases
Denis Laxalde
context: start walking from "introrev" in blockancestors()...
r32063 $ hg up 24 --quiet
Yuya Nishihara
revset: parse variable-length arguments of followlines() by getargsdict()
r30754 $ hg log -r 'followlines()'
hg: parse error: followlines takes at least 1 positional arguments
[255]
$ hg log -r 'followlines(baz)'
Yuya Nishihara
revset: abuse x:y syntax to specify line range of followlines()...
r30804 hg: parse error: followlines requires a line range
Yuya Nishihara
revset: parse variable-length arguments of followlines() by getargsdict()
r30754 [255]
$ hg log -r 'followlines(baz, 1)'
Yuya Nishihara
revset: abuse x:y syntax to specify line range of followlines()...
r30804 hg: parse error: followlines expects a line range
Yuya Nishihara
revset: parse variable-length arguments of followlines() by getargsdict()
r30754 [255]
Yuya Nishihara
revset: abuse x:y syntax to specify line range of followlines()...
r30804 $ hg log -r 'followlines(baz, 1:2, startrev=desc("b"))'
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 hg: parse error: followlines expects exactly one revision
[255]
Yuya Nishihara
revset: abuse x:y syntax to specify line range of followlines()...
r30804 $ hg log -r 'followlines("glob:*", 1:2)'
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 hg: parse error: followlines expects exactly one file
[255]
Yuya Nishihara
revset: abuse x:y syntax to specify line range of followlines()...
r30804 $ hg log -r 'followlines(baz, 1:)'
hg: parse error: line range bounds must be integers
[255]
$ hg log -r 'followlines(baz, :1)'
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 hg: parse error: line range bounds must be integers
[255]
Yuya Nishihara
revset: abuse x:y syntax to specify line range of followlines()...
r30804 $ hg log -r 'followlines(baz, x:4)'
hg: parse error: line range bounds must be integers
[255]
$ hg log -r 'followlines(baz, 5:4)'
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 hg: parse error: line range must be positive
[255]
Yuya Nishihara
revset: abuse x:y syntax to specify line range of followlines()...
r30804 $ hg log -r 'followlines(baz, 0:4)'
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 hg: parse error: fromline must be strictly positive
[255]
Yuya Nishihara
revset: abuse x:y syntax to specify line range of followlines()...
r30804 $ hg log -r 'followlines(baz, 2:40)'
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719 abort: line range exceeds file size
[255]
Denis Laxalde
revset: properly parse "descend" argument of followlines()...
r31998 $ hg log -r 'followlines(baz, 2:4, startrev=20, descend=[1])'
Yuya Nishihara
revset: add experimental relation and subscript operators...
r33416 hg: parse error at 43: not a prefix: [
Ryan McElroy
revsetlang: add a hint for more useful parse errors...
r36703 (followlines(baz, 2:4, startrev=20, descend=[1])
^ here)
Denis Laxalde
revset: properly parse "descend" argument of followlines()...
r31998 [255]
$ hg log -r 'followlines(baz, 2:4, startrev=20, descend=a)'
FUJIWARA Katsunori
revset: add i18n comments to error messages for followlines predicate...
r32086 hg: parse error: descend argument must be a boolean
Denis Laxalde
revset: properly parse "descend" argument of followlines()...
r31998 [255]
Denis Laxalde
revset: add a followlines(file, fromline, toline[, rev]) revset...
r30719
Yuya Nishihara
annotate: restructure formatter output to be nested list (BC)...
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"
}
]
Patrick Mezard
annotate: support diff whitespace filtering flags (issue3030)...
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
Mads Kiilerich
check-code: fix check for trailing whitespace on continued lines too...
r17347 $ sed 's/EOL$//g' > a <<EOF
Patrick Mezard
annotate: support diff whitespace filtering flags (issue3030)...
r15528 > a a
>
Mads Kiilerich
check-code: fix check for trailing whitespace on continued lines too...
r17347 > EOL
Patrick Mezard
annotate: support diff whitespace filtering flags (issue3030)...
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
Mads Kiilerich
tests: add missing trailing 'cd ..'...
r16913 $ cd ..
Pierre-Yves David
filectx.parents: enforce changeid of parent to be in own changectx ancestors...
r23702
Yuya Nishihara
annotate: do not poorly split lines at CR (issue5798)...
r36556 Annotate with orphaned CR (issue5798)
-------------------------------------
$ hg init repo-cr
$ cd repo-cr
Yuya Nishihara
test-annotate: rewrite sed with some python...
r36723 $ cat <<'EOF' >> "$TESTTMP/substcr.py"
> import sys
Yuya Nishihara
procutil: bulk-replace function calls to point to new module
r37138 > from mercurial.utils import procutil
> procutil.setbinary(sys.stdin)
> procutil.setbinary(sys.stdout)
Yuya Nishihara
test-annotate: rewrite sed with some python...
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
Yuya Nishihara
annotate: do not poorly split lines at CR (issue5798)...
r36556
>>> with open('a', 'wb') as f:
Yuya Nishihara
py3: silence f.write() in test-annotate.t
r36845 ... f.write(b'0a\r0b\r\n0c\r0d\r\n0e\n0f\n0g') and None
Yuya Nishihara
annotate: do not poorly split lines at CR (issue5798)...
r36556 $ hg ci -qAm0
>>> with open('a', 'wb') as f:
Yuya Nishihara
py3: silence f.write() in test-annotate.t
r36845 ... f.write(b'0a\r0b\r\n1c\r1d\r\n0e\n1f\n0g') and None
Yuya Nishihara
annotate: do not poorly split lines at CR (issue5798)...
r36556 $ hg ci -m1
Yuya Nishihara
test-annotate: rewrite sed with some python...
r36723 $ hg annotate -r0 a | $PYTHON "$TESTTMP/substcr.py"
Yuya Nishihara
annotate: do not poorly split lines at CR (issue5798)...
r36556 0: 0a[CR]0b[CR]
0: 0c[CR]0d[CR]
0: 0e
0: 0f
0: 0g
Yuya Nishihara
test-annotate: rewrite sed with some python...
r36723 $ hg annotate -r1 a | $PYTHON "$TESTTMP/substcr.py"
Yuya Nishihara
annotate: do not poorly split lines at CR (issue5798)...
r36556 0: 0a[CR]0b[CR]
1: 1c[CR]1d[CR]
0: 0e
1: 1f
0: 0g
$ cd ..
Pierre-Yves David
filectx.parents: enforce changeid of parent to be in own changectx ancestors...
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'
Yuya Nishihara
committablefilectx: propagate ancestry info to parent to fix annotation...
r24817 $ echo W >> a
Pierre-Yves David
filectx.parents: enforce changeid of parent to be in own changectx ancestors...
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
Yuya Nishihara
committablefilectx: propagate ancestry info to parent to fix annotation...
r24817 $ hg annotate a -r 'wdir()'
0 : A
3 : B
4 : C
4+: W
Pierre-Yves David
linkrev: also adjust linkrev when bootstrapping annotate (issue4305)...
r23705 Even when the starting revision is the linkrev-shadowed one:
$ hg annotate a -r 3
0: A
3: B
Pierre-Yves David
filectx.parents: enforce changeid of parent to be in own changectx ancestors...
r23702 $ cd ..
Jun Wu
annotate: pre-calculate the "needed" dictionary (issue5360)...
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
$ cat > a << EOF
> b
> 1
> 2
> 3
> a
> EOF
$ hg resolve --mark -q
$ hg commit -m m
$ hg annotate a
4: b
0: 1
1: 2
3: 3
2: a
$ cd ..