##// END OF EJS Templates
test-revlog: adds a non-root revision with a delta against nullrev...
marmoute -
r50133:6aae0e1e default
parent child Browse files
Show More
@@ -1,36 +1,38 b''
1 #!/bin/bash
1 #!/bin/bash
2 #
2 #
3 # Make sure to patch mercurial to create the delta against nullrev
3 # Make sure to patch mercurial to create the delta against nullrev
4 #
4 #
5 # # Parent cdb85d0512b81031d4a7b30d6a5ddbe69ef1a876
5 # # Parent cdb85d0512b81031d4a7b30d6a5ddbe69ef1a876
6 #
6 #
7 # diff --git a/mercurial/revlogutils/deltas.py b/mercurial/revlogutils/deltas.py
7 # diff --git a/mercurial/revlogutils/deltas.py b/mercurial/revlogutils/deltas.py
8 # --- a/mercurial/revlogutils/deltas.py
8 # --- a/mercurial/revlogutils/deltas.py
9 # +++ b/mercurial/revlogutils/deltas.py
9 # +++ b/mercurial/revlogutils/deltas.py
10 # @@ -1117,7 +1117,10 @@ class deltacomputer:
10 # @@ -1117,7 +1117,10 @@ class deltacomputer:
11 # candidaterevs = next(groups)
11 # candidaterevs = next(groups)
12 #
12 #
13 # if deltainfo is None:
13 # if deltainfo is None:
14 # - deltainfo = self._fullsnapshotinfo(fh, revinfo, target_rev)
14 # - deltainfo = self._fullsnapshotinfo(fh, revinfo, target_rev)
15 # + if revlog._generaldelta:
15 # + if revlog._generaldelta:
16 # + deltainfo = self._builddeltainfo(revinfo, nullrev, fh)
16 # + deltainfo = self._builddeltainfo(revinfo, nullrev, fh)
17 # + else:
17 # + else:
18 # + deltainfo = self._fullsnapshotinfo(fh, revinfo, target_rev)
18 # + deltainfo = self._fullsnapshotinfo(fh, revinfo, target_rev)
19
19
20
20
21 cd "`dirname \"$0\"`"
21 cd "`dirname \"$0\"`"
22 export HGRCPATH=
22 export HGRCPATH=
23 export HGMODULEPOLICY=py
23 export HGMODULEPOLICY=py
24
24
25 rm -rf nullrev-diff
25 rm -rf nullrev-diff
26 ../../hg init nullrev-diff --config format.revlog-compression=zlib
26 ../../hg init nullrev-diff --config format.revlog-compression=zlib
27 cd nullrev-diff
27 cd nullrev-diff
28 echo hi > a
28 echo hi > a
29 ../../../hg commit -Am root-B
29 ../../../hg commit -Am root-B
30 echo ho > a
31 ../../../hg commit -Am child-A
30 ../../../hg debugdeltachain a
32 ../../../hg debugdeltachain a
31 rm -rf .hg/cache/ .hg/wcache/
33 rm -rf .hg/cache/ .hg/wcache/
32 cd ..
34 cd ..
33
35
34 tar cf test-revlog-diff-relative-to-nullrev.tar nullrev-diff
36 tar cf test-revlog-diff-relative-to-nullrev.tar nullrev-diff
35
37
36 rm -rf nullrev-diff
38 rm -rf nullrev-diff
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
@@ -1,83 +1,86 b''
1 $ hg init empty-repo
1 $ hg init empty-repo
2 $ cd empty-repo
2 $ cd empty-repo
3
3
4 Flags on revlog version 0 are rejected
4 Flags on revlog version 0 are rejected
5
5
6 >>> with open('.hg/store/00changelog.i', 'wb') as fh:
6 >>> with open('.hg/store/00changelog.i', 'wb') as fh:
7 ... fh.write(b'\x00\x01\x00\x00') and None
7 ... fh.write(b'\x00\x01\x00\x00') and None
8
8
9 $ hg log
9 $ hg log
10 abort: unknown flags (0x01) in version 0 revlog 00changelog
10 abort: unknown flags (0x01) in version 0 revlog 00changelog
11 [50]
11 [50]
12
12
13 Unknown flags on revlog version 1 are rejected
13 Unknown flags on revlog version 1 are rejected
14
14
15 >>> with open('.hg/store/00changelog.i', 'wb') as fh:
15 >>> with open('.hg/store/00changelog.i', 'wb') as fh:
16 ... fh.write(b'\x00\x04\x00\x01') and None
16 ... fh.write(b'\x00\x04\x00\x01') and None
17
17
18 $ hg log
18 $ hg log
19 abort: unknown flags (0x04) in version 1 revlog 00changelog
19 abort: unknown flags (0x04) in version 1 revlog 00changelog
20 [50]
20 [50]
21
21
22 Unknown version is rejected
22 Unknown version is rejected
23
23
24 >>> with open('.hg/store/00changelog.i', 'wb') as fh:
24 >>> with open('.hg/store/00changelog.i', 'wb') as fh:
25 ... fh.write(b'\x00\x00\xbe\xef') and None
25 ... fh.write(b'\x00\x00\xbe\xef') and None
26
26
27 $ hg log
27 $ hg log
28 abort: unknown version (48879) in revlog 00changelog
28 abort: unknown version (48879) in revlog 00changelog
29 [50]
29 [50]
30
30
31 $ cd ..
31 $ cd ..
32
32
33 Test for CVE-2016-3630
33 Test for CVE-2016-3630
34
34
35 $ mkdir test2; cd test2
35 $ mkdir test2; cd test2
36 $ hg init
36 $ hg init
37
37
38 >>> import codecs
38 >>> import codecs
39 >>> open("a.i", "wb").write(codecs.decode(codecs.decode(
39 >>> open("a.i", "wb").write(codecs.decode(codecs.decode(
40 ... b"""eJxjYGZgZIAAYQYGxhgom+k/FMx8YKx9ZUaKSOyqo4cnuKb8mbqHV5cBCVTMWb1Cwqkhe4Gsg9AD
40 ... b"""eJxjYGZgZIAAYQYGxhgom+k/FMx8YKx9ZUaKSOyqo4cnuKb8mbqHV5cBCVTMWb1Cwqkhe4Gsg9AD
41 ... Joa3dYtcYYYBAQ8Qr4OqZAYRICPTSr5WKd/42rV36d+8/VmrNpv7NP1jQAXrQE4BqQUARngwVA==""",
41 ... Joa3dYtcYYYBAQ8Qr4OqZAYRICPTSr5WKd/42rV36d+8/VmrNpv7NP1jQAXrQE4BqQUARngwVA==""",
42 ... "base64"), "zlib")) and None
42 ... "base64"), "zlib")) and None
43
43
44 $ hg debugrevlogindex a.i
44 $ hg debugrevlogindex a.i
45 rev linkrev nodeid p1 p2
45 rev linkrev nodeid p1 p2
46 0 2 99e0332bd498 000000000000 000000000000
46 0 2 99e0332bd498 000000000000 000000000000
47 1 3 6674f57a23d8 99e0332bd498 000000000000
47 1 3 6674f57a23d8 99e0332bd498 000000000000
48
48
49 >>> from mercurial.revlogutils.constants import KIND_OTHER
49 >>> from mercurial.revlogutils.constants import KIND_OTHER
50 >>> from mercurial import revlog, vfs
50 >>> from mercurial import revlog, vfs
51 >>> tvfs = vfs.vfs(b'.')
51 >>> tvfs = vfs.vfs(b'.')
52 >>> tvfs.options = {b'revlogv1': True}
52 >>> tvfs.options = {b'revlogv1': True}
53 >>> rl = revlog.revlog(tvfs, target=(KIND_OTHER, b'test'), radix=b'a')
53 >>> rl = revlog.revlog(tvfs, target=(KIND_OTHER, b'test'), radix=b'a')
54 >>> rl.revision(1)
54 >>> rl.revision(1)
55 mpatchError(*'patch cannot be decoded'*) (glob)
55 mpatchError(*'patch cannot be decoded'*) (glob)
56
56
57 $ cd ..
57 $ cd ..
58
58
59
59
60 Regression test for support for the old repos with strange diff encoding.
60 Regression test for support for the old repos with strange diff encoding.
61 Apparently it used to be possible (maybe it's still possible, but we don't know how)
61 Apparently it used to be possible (maybe it's still possible, but we don't know how)
62 to create commits whose diffs are encoded relative to a nullrev.
62 to create commits whose diffs are encoded relative to a nullrev.
63 This test checks that a repo with that encoding can still be read.
63 This test checks that a repo with that encoding can still be read.
64
64
65 This is what we did to produce the repo in test-revlog-diff-relative-to-nullrev.tar:
65 This is what we did to produce the repo in test-revlog-diff-relative-to-nullrev.tar:
66
66
67 - tweak the code in mercurial/revlogutils/deltas.py to produce such "trivial" deltas:
67 - tweak the code in mercurial/revlogutils/deltas.py to produce such "trivial" deltas:
68 > if deltainfo is None:
68 > if deltainfo is None:
69 > - deltainfo = self._fullsnapshotinfo(fh, revinfo, target_rev)
69 > - deltainfo = self._fullsnapshotinfo(fh, revinfo, target_rev)
70 > + deltainfo = self._builddeltainfo(revinfo, nullrev, fh)
70 > + deltainfo = self._builddeltainfo(revinfo, nullrev, fh)
71 - hg init
71 - hg init
72 - echo hi > a
72 - echo hi > a
73 - hg commit -Am_
73 - hg commit -Am_
74 - remove some cache files
74 - remove some cache files
75
75
76 $ tar --force-local -xf "$TESTDIR"/bundles/test-revlog-diff-relative-to-nullrev.tar
76 $ tar --force-local -xf "$TESTDIR"/bundles/test-revlog-diff-relative-to-nullrev.tar
77 $ cd nullrev-diff
77 $ cd nullrev-diff
78 $ hg debugdeltachain a
78 $ hg debugdeltachain a
79 rev p1 p2 chain# chainlen prev delta size rawsize chainsize ratio lindist extradist extraratio readsize largestblk rddensity srchunks
79 rev p1 p2 chain# chainlen prev delta size rawsize chainsize ratio lindist extradist extraratio readsize largestblk rddensity srchunks
80 0 -1 -1 1 2 -1 p1 15 3 15 5.00000 15 0 0.00000 15 15 1.00000 1
80 0 -1 -1 1 2 -1 p1 15 3 15 5.00000 15 0 0.00000 15 15 1.00000 1
81 1 0 -1 1 2 -1 p2 15 3 15 5.00000 30 15 1.00000 30 30 0.50000 1
81 $ hg cat --config rhg.cat=true -r 0 a
82 $ hg cat --config rhg.cat=true -r 0 a
82 hi
83 hi
84 $ hg cat --config rhg.cat=true -r 1 a
85 ho
83 $ cd ..
86 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now