14 |
14 |
15 import silenttestrunner |
15 import silenttestrunner |
16 |
16 |
17 # Load the local remotefilelog, not the system one |
17 # Load the local remotefilelog, not the system one |
18 sys.path[0:0] = [os.path.join(os.path.dirname(__file__), '..')] |
18 sys.path[0:0] = [os.path.join(os.path.dirname(__file__), '..')] |
19 from mercurial.node import nullid |
19 from mercurial.node import sha1nodeconstants |
20 from mercurial import policy |
20 from mercurial import policy |
21 |
21 |
22 if not policy._packageprefs.get(policy.policy, (False, False))[1]: |
22 if not policy._packageprefs.get(policy.policy, (False, False))[1]: |
23 if __name__ == '__main__': |
23 if __name__ == '__main__': |
24 msg = "skipped: pure module not available with module policy:" |
24 msg = "skipped: pure module not available with module policy:" |
61 pycompat.bytechr(random.randint(0, 255)) for _ in range(20) |
61 pycompat.bytechr(random.randint(0, 255)) for _ in range(20) |
62 ) |
62 ) |
63 |
63 |
64 def createPack(self, revisions=None, packdir=None): |
64 def createPack(self, revisions=None, packdir=None): |
65 if revisions is None: |
65 if revisions is None: |
66 revisions = [(b"filename", self.getFakeHash(), nullid, b"content")] |
66 revisions = [ |
|
67 ( |
|
68 b"filename", |
|
69 self.getFakeHash(), |
|
70 sha1nodeconstants.nullid, |
|
71 b"content", |
|
72 ) |
|
73 ] |
67 |
74 |
68 if packdir is None: |
75 if packdir is None: |
69 packdir = self.makeTempDir() |
76 packdir = self.makeTempDir() |
70 |
77 |
71 packer = datapack.mutabledatapack(uimod.ui(), packdir, version=2) |
78 packer = datapack.mutabledatapack(uimod.ui(), packdir, version=2) |
84 def _testAddSingle(self, content): |
91 def _testAddSingle(self, content): |
85 """Test putting a simple blob into a pack and reading it out.""" |
92 """Test putting a simple blob into a pack and reading it out.""" |
86 filename = b"foo" |
93 filename = b"foo" |
87 node = self.getHash(content) |
94 node = self.getHash(content) |
88 |
95 |
89 revisions = [(filename, node, nullid, content)] |
96 revisions = [(filename, node, sha1nodeconstants.nullid, content)] |
90 pack = self.createPack(revisions) |
97 pack = self.createPack(revisions) |
91 if self.paramsavailable: |
98 if self.paramsavailable: |
92 self.assertEqual( |
99 self.assertEqual( |
93 pack.params.fanoutprefix, basepack.SMALLFANOUTPREFIX |
100 pack.params.fanoutprefix, basepack.SMALLFANOUTPREFIX |
94 ) |
101 ) |
124 |
131 |
125 def testAddDeltas(self): |
132 def testAddDeltas(self): |
126 """Test putting multiple delta blobs into a pack and read the chain.""" |
133 """Test putting multiple delta blobs into a pack and read the chain.""" |
127 revisions = [] |
134 revisions = [] |
128 filename = b"foo" |
135 filename = b"foo" |
129 lastnode = nullid |
136 lastnode = sha1nodeconstants.nullid |
130 for i in range(10): |
137 for i in range(10): |
131 content = b"abcdef%d" % i |
138 content = b"abcdef%d" % i |
132 node = self.getHash(content) |
139 node = self.getHash(content) |
133 revisions.append((filename, node, lastnode, content)) |
140 revisions.append((filename, node, lastnode, content)) |
134 lastnode = node |
141 lastnode = node |
155 filename = b"filename-%d" % i |
162 filename = b"filename-%d" % i |
156 filerevs = [] |
163 filerevs = [] |
157 for j in range(random.randint(1, 100)): |
164 for j in range(random.randint(1, 100)): |
158 content = b"content-%d" % j |
165 content = b"content-%d" % j |
159 node = self.getHash(content) |
166 node = self.getHash(content) |
160 lastnode = nullid |
167 lastnode = sha1nodeconstants.nullid |
161 if len(filerevs) > 0: |
168 if len(filerevs) > 0: |
162 lastnode = filerevs[random.randint(0, len(filerevs) - 1)] |
169 lastnode = filerevs[random.randint(0, len(filerevs) - 1)] |
163 filerevs.append(node) |
170 filerevs.append(node) |
164 blobs[(filename, node, lastnode)] = content |
171 blobs[(filename, node, lastnode)] = content |
165 revisions.append((filename, node, lastnode, content)) |
172 revisions.append((filename, node, lastnode, content)) |
183 constants.METAKEYFLAG: i ** 4, |
190 constants.METAKEYFLAG: i ** 4, |
184 constants.METAKEYSIZE: len(content), |
191 constants.METAKEYSIZE: len(content), |
185 b'Z': b'random_string', |
192 b'Z': b'random_string', |
186 b'_': b'\0' * i, |
193 b'_': b'\0' * i, |
187 } |
194 } |
188 revisions.append((filename, node, nullid, content, meta)) |
195 revisions.append( |
|
196 (filename, node, sha1nodeconstants.nullid, content, meta) |
|
197 ) |
189 pack = self.createPack(revisions) |
198 pack = self.createPack(revisions) |
190 for name, node, x, content, origmeta in revisions: |
199 for name, node, x, content, origmeta in revisions: |
191 parsedmeta = pack.getmeta(name, node) |
200 parsedmeta = pack.getmeta(name, node) |
192 # flag == 0 should be optimized out |
201 # flag == 0 should be optimized out |
193 if origmeta[constants.METAKEYFLAG] == 0: |
202 if origmeta[constants.METAKEYFLAG] == 0: |
196 |
205 |
197 def testGetMissing(self): |
206 def testGetMissing(self): |
198 """Test the getmissing() api.""" |
207 """Test the getmissing() api.""" |
199 revisions = [] |
208 revisions = [] |
200 filename = b"foo" |
209 filename = b"foo" |
201 lastnode = nullid |
210 lastnode = sha1nodeconstants.nullid |
202 for i in range(10): |
211 for i in range(10): |
203 content = b"abcdef%d" % i |
212 content = b"abcdef%d" % i |
204 node = self.getHash(content) |
213 node = self.getHash(content) |
205 revisions.append((filename, node, lastnode, content)) |
214 revisions.append((filename, node, lastnode, content)) |
206 lastnode = node |
215 lastnode = node |
223 |
232 |
224 def testAddThrows(self): |
233 def testAddThrows(self): |
225 pack = self.createPack() |
234 pack = self.createPack() |
226 |
235 |
227 try: |
236 try: |
228 pack.add(b'filename', nullid, b'contents') |
237 pack.add(b'filename', sha1nodeconstants.nullid, b'contents') |
229 self.assertTrue(False, "datapack.add should throw") |
238 self.assertTrue(False, "datapack.add should throw") |
230 except RuntimeError: |
239 except RuntimeError: |
231 pass |
240 pass |
232 |
241 |
233 def testBadVersionThrows(self): |
242 def testBadVersionThrows(self): |
262 for i in pycompat.xrange(total): |
271 for i in pycompat.xrange(total): |
263 filename = b"filename-%d" % i |
272 filename = b"filename-%d" % i |
264 content = filename |
273 content = filename |
265 node = self.getHash(content) |
274 node = self.getHash(content) |
266 blobs[(filename, node)] = content |
275 blobs[(filename, node)] = content |
267 revisions.append((filename, node, nullid, content)) |
276 revisions.append( |
|
277 (filename, node, sha1nodeconstants.nullid, content) |
|
278 ) |
268 |
279 |
269 pack = self.createPack(revisions) |
280 pack = self.createPack(revisions) |
270 if self.paramsavailable: |
281 if self.paramsavailable: |
271 self.assertEqual( |
282 self.assertEqual( |
272 pack.params.fanoutprefix, basepack.LARGEFANOUTPREFIX |
283 pack.params.fanoutprefix, basepack.LARGEFANOUTPREFIX |
286 numpacks = 10 |
297 numpacks = 10 |
287 revisionsperpack = 100 |
298 revisionsperpack = 100 |
288 |
299 |
289 for i in range(numpacks): |
300 for i in range(numpacks): |
290 chain = [] |
301 chain = [] |
291 revision = (b'%d' % i, self.getFakeHash(), nullid, b"content") |
302 revision = ( |
|
303 b'%d' % i, |
|
304 self.getFakeHash(), |
|
305 sha1nodeconstants.nullid, |
|
306 b"content", |
|
307 ) |
292 |
308 |
293 for _ in range(revisionsperpack): |
309 for _ in range(revisionsperpack): |
294 chain.append(revision) |
310 chain.append(revision) |
295 revision = ( |
311 revision = ( |
296 b'%d' % i, |
312 b'%d' % i, |
344 revisions = [] |
360 revisions = [] |
345 for i in pycompat.xrange(packsize): |
361 for i in pycompat.xrange(packsize): |
346 filename = b"filename-%d" % i |
362 filename = b"filename-%d" % i |
347 content = b"content-%d" % i |
363 content = b"content-%d" % i |
348 node = self.getHash(content) |
364 node = self.getHash(content) |
349 revisions.append((filename, node, nullid, content)) |
365 revisions.append( |
|
366 (filename, node, sha1nodeconstants.nullid, content) |
|
367 ) |
350 |
368 |
351 path = self.createPack(revisions).path |
369 path = self.createPack(revisions).path |
352 |
370 |
353 # Perf of large multi-get |
371 # Perf of large multi-get |
354 import gc |
372 import gc |