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'[ |
|
|
70 |
flags |= REVIDX_ |
|
|
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': link |
|
|
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, |
|
|
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