##// 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 9 changegroup,
10 10 exchange,
11 11 extensions,
12 filelog,
13 12 revlog,
14 13 util,
15 14 )
@@ -55,39 +54,41 b' def allsupportedversions(orig, ui):'
55 54 versions.add(b'03')
56 55 return versions
57 56
58 def noopaddrevision(orig, self, text, transaction, link, p1, p2,
59 cachedelta=None, node=None,
60 flags=revlog.REVIDX_DEFAULT_FLAGS):
61 if b'[NOOP]' in text:
62 flags |= REVIDX_NOOP
63 return orig(self, text, transaction, link, p1, p2, cachedelta=cachedelta,
64 node=node, flags=flags)
57 def makewrappedfile(obj):
58 class wrappedfile(obj.__class__):
59 def addrevision(self, text, transaction, link, p1, p2,
60 cachedelta=None, node=None,
61 flags=revlog.REVIDX_DEFAULT_FLAGS):
62 if b'[NOOP]' in text:
63 flags |= REVIDX_NOOP
65 64
66 def b64addrevision(orig, self, text, transaction, link, p1, p2,
67 cachedelta=None, node=None,
68 flags=revlog.REVIDX_DEFAULT_FLAGS):
69 if b'[BASE64]' in text:
70 flags |= REVIDX_BASE64
71 return orig(self, text, transaction, link, p1, p2, cachedelta=cachedelta,
72 node=node, flags=flags)
65 if b'[BASE64]' in text:
66 flags |= REVIDX_BASE64
67
68 if b'[GZIP]' in text:
69 flags |= REVIDX_GZIP
73 70
74 def gzipaddrevision(orig, self, text, transaction, link, p1, p2,
75 cachedelta=None, node=None,
76 flags=revlog.REVIDX_DEFAULT_FLAGS):
77 if b'[GZIP]' in text:
78 flags |= REVIDX_GZIP
79 return orig(self, text, transaction, link, p1, p2, cachedelta=cachedelta,
80 node=node, flags=flags)
71 # This addrevision wrapper is meant to add a flag we will not have
72 # transforms registered for, ensuring we handle this error case.
73 if b'[FAIL]' in text:
74 flags |= REVIDX_FAIL
75
76 return super(wrappedfile, self).addrevision(text, transaction, link,
77 p1, p2,
78 cachedelta=cachedelta,
79 node=node,
80 flags=flags)
81 81
82 def failaddrevision(orig, self, text, transaction, link, p1, p2,
83 cachedelta=None, node=None,
84 flags=revlog.REVIDX_DEFAULT_FLAGS):
85 # This addrevision wrapper is meant to add a flag we will not have
86 # transforms registered for, ensuring we handle this error case.
87 if b'[FAIL]' in text:
88 flags |= REVIDX_FAIL
89 return orig(self, text, transaction, link, p1, p2, cachedelta=cachedelta,
90 node=node, flags=flags)
82 obj.__class__ = wrappedfile
83
84 def reposetup(ui, repo):
85 class wrappingflagprocessorrepo(repo.__class__):
86 def file(self, f):
87 orig = super(wrappingflagprocessorrepo, self).file(f)
88 makewrappedfile(orig)
89 return orig
90
91 repo.__class__ = wrappingflagprocessorrepo
91 92
92 93 def extsetup(ui):
93 94 # Enable changegroup3 for flags to be sent over the wire
@@ -108,13 +109,6 b' def extsetup(ui):'
108 109 for k in exchange._bundlespeccontentopts.keys():
109 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 112 # Register flag processors for each extension
119 113 revlog.addflagprocessor(
120 114 REVIDX_NOOP,
@@ -243,6 +243,10 b' class filestorage(object):'
243 243 if flags == 0:
244 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 250 validatehash = True
247 251 # Depending on the operation (read or write), the order might be
248 252 # reversed due to non-commutative transforms.
@@ -405,15 +409,13 b' class filestorage(object):'
405 409 return 0, 0
406 410
407 411 def add(self, text, meta, transaction, linkrev, p1, p2):
408 transaction.addbackup(self._indexpath)
409
410 412 if meta or text.startswith(b'\1\n'):
411 413 text = filelog.packmeta(meta, text)
412 414
413 415 return self.addrevision(text, transaction, linkrev, p1, p2)
414 416
415 417 def addrevision(self, text, transaction, linkrev, p1, p2, node=None,
416 flags=0):
418 flags=revlog.REVIDX_DEFAULT_FLAGS, cachedelta=None):
417 419 validatenode(p1)
418 420 validatenode(p2)
419 421
@@ -430,15 +432,21 b' class filestorage(object):'
430 432 if validatehash:
431 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 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 445 self._indexdata.append({
438 446 b'node': node,
439 447 b'p1': p1,
440 448 b'p2': p2,
441 b'linkrev': linkrev,
449 b'linkrev': link,
442 450 b'flags': flags,
443 451 })
444 452
@@ -457,6 +465,7 b' class filestorage(object):'
457 465
458 466 for node, p1, p2, linknode, deltabase, delta, flags in deltas:
459 467 linkrev = linkmapper(linknode)
468 flags = flags or revlog.REVIDX_DEFAULT_FLAGS
460 469
461 470 nodes.append(node)
462 471
@@ -469,7 +478,8 b' class filestorage(object):'
469 478 else:
470 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 484 if addrevisioncb:
475 485 addrevisioncb(self, node)
@@ -88,6 +88,44 b''
88 88 adding file changes
89 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 129 # Initialize new client (not cloning) and setup extension
92 130 $ cd ..
93 131 $ hg init client2
@@ -197,6 +235,7 b''
197 235 $ echo '[BASE64]a-bit-longer-branching' > base64
198 236 $ hg commit -q -m branching
199 237
238 #if repobundlerepo
200 239 $ hg bundle --base 1 bundle.hg
201 240 4 changesets found
202 241 $ hg --config extensions.strip= strip -r 2 --no-backup --force -q
@@ -253,6 +292,7 b''
253 292 1 files changed, 1 insertions(+), 0 deletions(-)
254 293
255 294 $ rm bundle.hg bundle-again.hg
295 #endif
256 296
257 297 # TEST: hg status
258 298
General Comments 0
You need to be logged in to leave comments. Login now