##// END OF EJS Templates
identify: add template support...
identify: add template support This is based on a patch proposed last year by Mathias De Maré[1], with a few changes. - Tags and bookmarks are now formatted lists, for more flexible queries. - The templater is populated whether or not [-nibtB] is specified. (Plain output is unchanged.) This seems more consistent with other templated commands. - The 'id' property is a string, instead of a list. - The parents of 'wdir()' have their own list of attributes. I left 'id' as a string because it seems very useful for generating version info. It's also a bit strange because the value and meaning changes depending on whether or not --debug is passed (short vs full hash), whether the revision is a merge or not (one hash or two, separated by a '+'), the working directory or not (node vs p1node), and local or not (remote defaults to tip, and never has '+'). The equivalent string built with {rev} seems much less useful, and I couldn't think of a reasonable name, so I left it out. The discussion seemed to be pointing towards having a list of nodes, with more than one entry for a merge. It seems simpler to give the nodes a name, and use {node} for the actual commit probed, especially now that there is a virtual node for 'wdir()'. Yuya mentioned using fm.nested() in that thread, so I did for the parent nodes. I'm not sure if the plan is to fill in all of the context attributes in these items, or if these nested items should simply be made {p1node} and {p1rev}. I used ':' as the tag separator for consistency with {tags} in the log templater. Likewise, bookmarks are separated by a space for consistency with the corresponding log template. [1] https://www.mercurial-scm.org/pipermail/mercurial-devel/2016-August/087039.html

File last commit:

r32940:75be1499 default
r33051:15a79ac8 default
Show More
test-parseindex.t
185 lines | 5.5 KiB | text/troff | Tads3Lexer
/ tests / test-parseindex.t
Matt Mackall
tests: unify test-parseindex
r12476 revlog.parseindex must be able to parse the index file even if
an index entry is split between two 64k blocks. The ideal test
would be to create an index file with inline data where
64k < size < 64k + 64 (64k is the size of the read buffer, 64 is
the size of an index entry) and with an index entry starting right
before the 64k block boundary, and try to read it.
We approximate that by reducing the read buffer to 1 byte.
$ hg init a
$ cd a
$ echo abc > foo
$ hg add foo
$ hg commit -m 'add foo'
$ echo >> foo
$ hg commit -m 'change foo'
$ hg log -r 0:
changeset: 0:7c31755bf9b5
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: add foo
changeset: 1:26333235a41c
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: change foo
$ cat >> test.py << EOF
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-parseindex'...
r31250 > from mercurial import changelog, vfs
Matt Mackall
tests: unify test-parseindex
r12476 > from mercurial.node import *
>
> class singlebyteread(object):
> def __init__(self, real):
> self.real = real
>
> def read(self, size=-1):
> if size == 65536:
> size = 1
> return self.real.read(size)
>
> def __getattr__(self, key):
> return getattr(self.real, key)
>
> def opener(*args):
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-parseindex'...
r31250 > o = vfs.vfs(*args)
Matt Mackall
tests: unify test-parseindex
r12476 > def wrapper(*a):
> f = o(*a)
> return singlebyteread(f)
> return wrapper
>
> cl = changelog.changelog(opener('.hg/store'))
> print len(cl), 'revisions:'
> for r in cl:
> print short(cl.node(r))
> EOF
Augie Fackler
cleanup: use $PYTHON to run python in many more tests...
r32940 $ $PYTHON test.py
Matt Mackall
tests: unify test-parseindex
r12476 2 revisions:
7c31755bf9b5
26333235a41c
Mads Kiilerich
tests: add missing trailing 'cd ..'...
r16913
$ cd ..
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810
Yuya Nishihara
reachableroots: verify integer range of heads argument (issue4775)...
r26017 #if no-pure
Test SEGV caused by bad revision passed to reachableroots() (issue4775):
$ cd a
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810
Yuya Nishihara
reachableroots: verify integer range of heads argument (issue4775)...
r26017 $ python <<EOF
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-parseindex'...
r31250 > from mercurial import changelog, vfs
> cl = changelog.changelog(vfs.vfs('.hg/store'))
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 > print 'good heads:'
Yuya Nishihara
reachableroots: verify integer range of heads argument (issue4775)...
r26017 > for head in [0, len(cl) - 1, -1]:
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 > print'%s: %r' % (head, cl.reachableroots(0, [head], [0]))
> print 'bad heads:'
Yuya Nishihara
reachableroots: verify type of each item of heads argument...
r26018 > for head in [len(cl), 10000, -2, -10000, None]:
Yuya Nishihara
reachableroots: verify integer range of heads argument (issue4775)...
r26017 > print '%s:' % head,
> try:
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 > cl.reachableroots(0, [head], [0])
Yuya Nishihara
reachableroots: verify integer range of heads argument (issue4775)...
r26017 > print 'uncaught buffer overflow?'
Yuya Nishihara
reachableroots: verify type of each item of heads argument...
r26018 > except (IndexError, TypeError) as inst:
Yuya Nishihara
reachableroots: verify integer range of heads argument (issue4775)...
r26017 > print inst
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 > print 'good roots:'
> for root in [0, len(cl) - 1, -1]:
> print '%s: %r' % (root, cl.reachableroots(root, [len(cl) - 1], [root]))
> print 'out-of-range roots are ignored:'
> for root in [len(cl), 10000, -2, -10000]:
> print '%s: %r' % (root, cl.reachableroots(root, [len(cl) - 1], [root]))
> print 'bad roots:'
> for root in [None]:
> print '%s:' % root,
> try:
> cl.reachableroots(root, [len(cl) - 1], [root])
> print 'uncaught error?'
> except TypeError as inst:
> print inst
Yuya Nishihara
reachableroots: verify integer range of heads argument (issue4775)...
r26017 > EOF
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 good heads:
Yuya Nishihara
reachableroots: construct and sort baseset in revset module...
r26094 0: [0]
1: [0]
-1: []
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 bad heads:
Yuya Nishihara
reachableroots: verify integer range of heads argument (issue4775)...
r26017 2: head out of range
10000: head out of range
-2: head out of range
-10000: head out of range
Yuya Nishihara
reachableroots: verify type of each item of heads argument...
r26018 None: an integer is required
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 good roots:
Yuya Nishihara
reachableroots: construct and sort baseset in revset module...
r26094 0: [0]
1: [1]
-1: [-1]
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 out-of-range roots are ignored:
Yuya Nishihara
reachableroots: construct and sort baseset in revset module...
r26094 2: []
10000: []
-2: []
-10000: []
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 bad roots:
None: an integer is required
Yuya Nishihara
reachableroots: verify integer range of heads argument (issue4775)...
r26017
$ cd ..
Test corrupted p1/p2 fields that could cause SEGV at parsers.c:
Yuya Nishihara
tests: disable test of buffer overflow in parsers.c if --pure...
r25859
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810 $ mkdir invalidparent
$ cd invalidparent
$ hg clone --pull -q --config phases.publish=False ../a limit
$ hg clone --pull -q --config phases.publish=False ../a segv
$ rm -R limit/.hg/cache segv/.hg/cache
$ python <<EOF
> data = open("limit/.hg/store/00changelog.i", "rb").read()
> for n, p in [('limit', '\0\0\0\x02'), ('segv', '\0\x01\0\0')]:
> # corrupt p1 at rev0 and p2 at rev1
> d = data[:24] + p + data[28:127 + 28] + p + data[127 + 32:]
> open(n + "/.hg/store/00changelog.i", "wb").write(d)
> EOF
$ hg debugindex -f1 limit/.hg/store/00changelog.i
rev flag offset length size base link p1 p2 nodeid
0 0000 0 63 62 0 0 2 -1 7c31755bf9b5
1 0000 63 66 65 1 1 0 2 26333235a41c
$ hg debugindex -f1 segv/.hg/store/00changelog.i
rev flag offset length size base link p1 p2 nodeid
0 0000 0 63 62 0 0 65536 -1 7c31755bf9b5
1 0000 63 66 65 1 1 0 65536 26333235a41c
$ cat <<EOF > test.py
> import sys
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-parseindex'...
r31250 > from mercurial import changelog, vfs
> cl = changelog.changelog(vfs.vfs(sys.argv[1]))
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810 > n0, n1 = cl.node(0), cl.node(1)
> ops = [
Yuya Nishihara
reachableroots: unify bail cases to raise exception correctly...
r26016 > ('reachableroots',
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 > lambda: cl.index.reachableroots2(0, [1], [0], False)),
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810 > ('compute_phases_map_sets', lambda: cl.computephases([[0], []])),
> ('index_headrevs', lambda: cl.headrevs()),
> ('find_gca_candidates', lambda: cl.commonancestorsheads(n0, n1)),
> ('find_deepest', lambda: cl.ancestor(n0, n1)),
> ]
> for l, f in ops:
> print l + ':',
> try:
> f()
> print 'uncaught buffer overflow?'
> except ValueError, inst:
> print inst
> EOF
Augie Fackler
cleanup: use $PYTHON to run python in many more tests...
r32940 $ $PYTHON test.py limit/.hg/store
Yuya Nishihara
reachableroots: unify bail cases to raise exception correctly...
r26016 reachableroots: parent out of range
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810 compute_phases_map_sets: parent out of range
index_headrevs: parent out of range
find_gca_candidates: parent out of range
find_deepest: parent out of range
Augie Fackler
cleanup: use $PYTHON to run python in many more tests...
r32940 $ $PYTHON test.py segv/.hg/store
Yuya Nishihara
reachableroots: unify bail cases to raise exception correctly...
r26016 reachableroots: parent out of range
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810 compute_phases_map_sets: parent out of range
index_headrevs: parent out of range
find_gca_candidates: parent out of range
find_deepest: parent out of range
$ cd ..
Yuya Nishihara
tests: disable test of buffer overflow in parsers.c if --pure...
r25859
#endif