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): | |
|
58 | class wrappedfile(obj.__class__): | |||
|
59 | def addrevision(self, text, transaction, link, p1, p2, | |||
59 | cachedelta=None, node=None, |
|
60 | cachedelta=None, node=None, | |
60 | flags=revlog.REVIDX_DEFAULT_FLAGS): |
|
61 | flags=revlog.REVIDX_DEFAULT_FLAGS): | |
61 | if b'[NOOP]' in text: |
|
62 | if b'[NOOP]' in text: | |
62 | flags |= REVIDX_NOOP |
|
63 | flags |= REVIDX_NOOP | |
63 | return orig(self, text, transaction, link, p1, p2, cachedelta=cachedelta, |
|
|||
64 | node=node, flags=flags) |
|
|||
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: |
|
65 | if b'[BASE64]' in text: | |
70 | flags |= REVIDX_BASE64 |
|
66 | flags |= REVIDX_BASE64 | |
71 | return orig(self, text, transaction, link, p1, p2, cachedelta=cachedelta, |
|
|||
72 | node=node, flags=flags) |
|
|||
73 |
|
67 | |||
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: |
|
68 | if b'[GZIP]' in text: | |
78 | flags |= REVIDX_GZIP |
|
69 | flags |= REVIDX_GZIP | |
79 | return orig(self, text, transaction, link, p1, p2, cachedelta=cachedelta, |
|
|||
80 | node=node, flags=flags) |
|
|||
81 |
|
70 | |||
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 |
|
71 | # This addrevision wrapper is meant to add a flag we will not have | |
86 | # transforms registered for, ensuring we handle this error case. |
|
72 | # transforms registered for, ensuring we handle this error case. | |
87 | if b'[FAIL]' in text: |
|
73 | if b'[FAIL]' in text: | |
88 | flags |= REVIDX_FAIL |
|
74 | flags |= REVIDX_FAIL | |
89 | return orig(self, text, transaction, link, p1, p2, cachedelta=cachedelta, |
|
75 | ||
90 | node=node, flags=flags) |
|
76 | return super(wrappedfile, self).addrevision(text, transaction, link, | |
|
77 | p1, p2, | |||
|
78 | cachedelta=cachedelta, | |||
|
79 | node=node, | |||
|
80 | flags=flags) | |||
|
81 | ||||
|
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 | 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': link |
|
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, |
|
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