##// END OF EJS Templates
simplestore: correctly implement flag processors...
Gregory Szorc -
r37454:9d4f09bf default
parent child Browse files
Show More
@@ -9,7 +9,6 b' from mercurial import ('
9 changegroup,
9 changegroup,
10 exchange,
10 exchange,
11 extensions,
11 extensions,
12 filelog,
13 revlog,
12 revlog,
14 util,
13 util,
15 )
14 )
@@ -55,39 +54,41 b' def allsupportedversions(orig, ui):'
55 versions.add(b'03')
54 versions.add(b'03')
56 return versions
55 return versions
57
56
58 def noopaddrevision(orig, self, text, transaction, link, p1, p2,
57 def makewrappedfile(obj):
59 cachedelta=None, node=None,
58 class wrappedfile(obj.__class__):
60 flags=revlog.REVIDX_DEFAULT_FLAGS):
59 def addrevision(self, text, transaction, link, p1, p2,
61 if b'[NOOP]' in text:
60 cachedelta=None, node=None,
62 flags |= REVIDX_NOOP
61 flags=revlog.REVIDX_DEFAULT_FLAGS):
63 return orig(self, text, transaction, link, p1, p2, cachedelta=cachedelta,
62 if b'[NOOP]' in text:
64 node=node, flags=flags)
63 flags |= REVIDX_NOOP
65
64
66 def b64addrevision(orig, self, text, transaction, link, p1, p2,
65 if b'[BASE64]' in text:
67 cachedelta=None, node=None,
66 flags |= REVIDX_BASE64
68 flags=revlog.REVIDX_DEFAULT_FLAGS):
67
69 if b'[BASE64]' in text:
68 if b'[GZIP]' in text:
70 flags |= REVIDX_BASE64
69 flags |= REVIDX_GZIP
71 return orig(self, text, transaction, link, p1, p2, cachedelta=cachedelta,
72 node=node, flags=flags)
73
70
74 def gzipaddrevision(orig, self, text, transaction, link, p1, p2,
71 # This addrevision wrapper is meant to add a flag we will not have
75 cachedelta=None, node=None,
72 # transforms registered for, ensuring we handle this error case.
76 flags=revlog.REVIDX_DEFAULT_FLAGS):
73 if b'[FAIL]' in text:
77 if b'[GZIP]' in text:
74 flags |= REVIDX_FAIL
78 flags |= REVIDX_GZIP
75
79 return orig(self, text, transaction, link, p1, p2, cachedelta=cachedelta,
76 return super(wrappedfile, self).addrevision(text, transaction, link,
80 node=node, flags=flags)
77 p1, p2,
78 cachedelta=cachedelta,
79 node=node,
80 flags=flags)
81
81
82 def failaddrevision(orig, self, text, transaction, link, p1, p2,
82 obj.__class__ = wrappedfile
83 cachedelta=None, node=None,
83
84 flags=revlog.REVIDX_DEFAULT_FLAGS):
84 def reposetup(ui, repo):
85 # This addrevision wrapper is meant to add a flag we will not have
85 class wrappingflagprocessorrepo(repo.__class__):
86 # transforms registered for, ensuring we handle this error case.
86 def file(self, f):
87 if b'[FAIL]' in text:
87 orig = super(wrappingflagprocessorrepo, self).file(f)
88 flags |= REVIDX_FAIL
88 makewrappedfile(orig)
89 return orig(self, text, transaction, link, p1, p2, cachedelta=cachedelta,
89 return orig
90 node=node, flags=flags)
90
91 repo.__class__ = wrappingflagprocessorrepo
91
92
92 def extsetup(ui):
93 def extsetup(ui):
93 # Enable changegroup3 for flags to be sent over the wire
94 # Enable changegroup3 for flags to be sent over the wire
@@ -108,13 +109,6 b' def extsetup(ui):'
108 for k in exchange._bundlespeccontentopts.keys():
109 for k in exchange._bundlespeccontentopts.keys():
109 exchange._bundlespeccontentopts[k]["cg.version"] = "03"
110 exchange._bundlespeccontentopts[k]["cg.version"] = "03"
110
111
111 # Add wrappers for addrevision, responsible to set flags depending on the
112 # revision data contents.
113 wrapfunction(filelog.filelog, 'addrevision', noopaddrevision)
114 wrapfunction(filelog.filelog, 'addrevision', b64addrevision)
115 wrapfunction(filelog.filelog, 'addrevision', gzipaddrevision)
116 wrapfunction(filelog.filelog, 'addrevision', failaddrevision)
117
118 # Register flag processors for each extension
112 # Register flag processors for each extension
119 revlog.addflagprocessor(
113 revlog.addflagprocessor(
120 REVIDX_NOOP,
114 REVIDX_NOOP,
@@ -243,6 +243,10 b' class filestorage(object):'
243 if flags == 0:
243 if flags == 0:
244 return text, True
244 return text, True
245
245
246 if flags & ~revlog.REVIDX_KNOWN_FLAGS:
247 raise error.RevlogError(_("incompatible revision flag '%#x'") %
248 (flags & ~revlog.REVIDX_KNOWN_FLAGS))
249
246 validatehash = True
250 validatehash = True
247 # Depending on the operation (read or write), the order might be
251 # Depending on the operation (read or write), the order might be
248 # reversed due to non-commutative transforms.
252 # reversed due to non-commutative transforms.
@@ -405,15 +409,13 b' class filestorage(object):'
405 return 0, 0
409 return 0, 0
406
410
407 def add(self, text, meta, transaction, linkrev, p1, p2):
411 def add(self, text, meta, transaction, linkrev, p1, p2):
408 transaction.addbackup(self._indexpath)
409
410 if meta or text.startswith(b'\1\n'):
412 if meta or text.startswith(b'\1\n'):
411 text = filelog.packmeta(meta, text)
413 text = filelog.packmeta(meta, text)
412
414
413 return self.addrevision(text, transaction, linkrev, p1, p2)
415 return self.addrevision(text, transaction, linkrev, p1, p2)
414
416
415 def addrevision(self, text, transaction, linkrev, p1, p2, node=None,
417 def addrevision(self, text, transaction, linkrev, p1, p2, node=None,
416 flags=0):
418 flags=revlog.REVIDX_DEFAULT_FLAGS, cachedelta=None):
417 validatenode(p1)
419 validatenode(p1)
418 validatenode(p2)
420 validatenode(p2)
419
421
@@ -430,15 +432,21 b' class filestorage(object):'
430 if validatehash:
432 if validatehash:
431 self.checkhash(rawtext, node, p1=p1, p2=p2)
433 self.checkhash(rawtext, node, p1=p1, p2=p2)
432
434
435 return self._addrawrevision(node, rawtext, transaction, linkrev, p1, p2,
436 flags)
437
438 def _addrawrevision(self, node, rawtext, transaction, link, p1, p2, flags):
439 transaction.addbackup(self._indexpath)
440
433 path = b'/'.join([self._storepath, hex(node)])
441 path = b'/'.join([self._storepath, hex(node)])
434
442
435 self._svfs.write(path, text)
443 self._svfs.write(path, rawtext)
436
444
437 self._indexdata.append({
445 self._indexdata.append({
438 b'node': node,
446 b'node': node,
439 b'p1': p1,
447 b'p1': p1,
440 b'p2': p2,
448 b'p2': p2,
441 b'linkrev': linkrev,
449 b'linkrev': link,
442 b'flags': flags,
450 b'flags': flags,
443 })
451 })
444
452
@@ -457,6 +465,7 b' class filestorage(object):'
457
465
458 for node, p1, p2, linknode, deltabase, delta, flags in deltas:
466 for node, p1, p2, linknode, deltabase, delta, flags in deltas:
459 linkrev = linkmapper(linknode)
467 linkrev = linkmapper(linknode)
468 flags = flags or revlog.REVIDX_DEFAULT_FLAGS
460
469
461 nodes.append(node)
470 nodes.append(node)
462
471
@@ -469,7 +478,8 b' class filestorage(object):'
469 else:
478 else:
470 text = mdiff.patch(self.revision(deltabase), delta)
479 text = mdiff.patch(self.revision(deltabase), delta)
471
480
472 self.addrevision(text, transaction, linkrev, p1, p2, flags)
481 self._addrawrevision(node, text, transaction, linkrev, p1, p2,
482 flags)
473
483
474 if addrevisioncb:
484 if addrevisioncb:
475 addrevisioncb(self, node)
485 addrevisioncb(self, node)
@@ -88,6 +88,44 b''
88 adding file changes
88 adding file changes
89 added 7 changesets with 7 changes to 7 files
89 added 7 changesets with 7 changes to 7 files
90
90
91 Ensure the data got to the server OK
92
93 $ cd ../server
94 $ hg cat -r 6e48f4215d24 noop
95 [NOOP]
96 $ hg debugdata noop 0
97 [NOOP]
98
99 $ hg cat -r 6e48f4215d24 base64
100 [BASE64]
101 $ hg debugdata base64 0
102 W0JBU0U2NF0K (no-eol)
103
104 $ hg cat -r 6e48f4215d24 gzip
105 [GZIP]
106 $ hg debugdata gzip 0
107 x\x9c\x8bv\x8f\xf2\x0c\x88\xe5\x02\x00\x08\xc8\x01\xfd (no-eol) (esc)
108
109 $ hg cat -r 6e48f4215d24 noop-base64
110 [NOOP][BASE64]
111 $ hg debugdata noop-base64 0
112 W05PT1BdW0JBU0U2NF0K (no-eol)
113
114 $ hg cat -r 6e48f4215d24 noop-gzip
115 [NOOP][GZIP]
116 $ hg debugdata noop-gzip 0
117 x\x9c\x8b\xf6\xf3\xf7\x0f\x88\x8dv\x8f\xf2\x0c\x88\xe5\x02\x00\x1dH\x03\xf1 (no-eol) (esc)
118
119 $ hg cat -r 6e48f4215d24 base64-gzip
120 [BASE64][GZIP]
121 $ hg debugdata base64-gzip 0
122 eJyLdnIMdjUziY12j/IMiOUCACLBBDo= (no-eol)
123
124 $ hg cat -r 6e48f4215d24 base64-gzip-noop
125 [BASE64][GZIP][NOOP]
126 $ hg debugdata base64-gzip-noop 0
127 eJyLdnIMdjUziY12j/IMiI328/cPiOUCAESjBi4= (no-eol)
128
91 # Initialize new client (not cloning) and setup extension
129 # Initialize new client (not cloning) and setup extension
92 $ cd ..
130 $ cd ..
93 $ hg init client2
131 $ hg init client2
@@ -197,6 +235,7 b''
197 $ echo '[BASE64]a-bit-longer-branching' > base64
235 $ echo '[BASE64]a-bit-longer-branching' > base64
198 $ hg commit -q -m branching
236 $ hg commit -q -m branching
199
237
238 #if repobundlerepo
200 $ hg bundle --base 1 bundle.hg
239 $ hg bundle --base 1 bundle.hg
201 4 changesets found
240 4 changesets found
202 $ hg --config extensions.strip= strip -r 2 --no-backup --force -q
241 $ hg --config extensions.strip= strip -r 2 --no-backup --force -q
@@ -253,6 +292,7 b''
253 1 files changed, 1 insertions(+), 0 deletions(-)
292 1 files changed, 1 insertions(+), 0 deletions(-)
254
293
255 $ rm bundle.hg bundle-again.hg
294 $ rm bundle.hg bundle-again.hg
295 #endif
256
296
257 # TEST: hg status
297 # TEST: hg status
258
298
General Comments 0
You need to be logged in to leave comments. Login now