comparison tests/test-flagprocessor.t @ 30745:c1b7b2285522

revlog: flag processor Add the ability for revlog objects to process revision flags and apply registered transforms on read/write operations. This patch introduces: - the 'revlog._processflags()' method that looks at revision flags and applies flag processors registered on them. Due to the need to handle non-commutative operations, flag transforms are applied in stable order but the order in which the transforms are applied is reversed between read and write operations. - the 'addflagprocessor()' method allowing to register processors on flags. Flag processors are defined as a 3-tuple of (read, write, raw) functions to be applied depending on the operation being performed. - an update on 'revlog.addrevision()' behavior. The current flagprocessor design relies on extensions to wrap around 'addrevision()' to set flags on revision data, and on the flagprocessor to perform the actual transformation of its contents. In the lfs case, this means we need to process flags before we meet the 2GB size check, leading to performing some operations before it happens: - if flags are set on the revision data, we assume some extensions might be modifying the contents using the flag processor next, and we compute the node for the original revision data (still allowing extension to override the node by wrapping around 'addrevision()'). - we then invoke the flag processor to apply registered transforms (in lfs's case, drastically reducing the size of large blobs). - finally, we proceed with the 2GB size check. Note: In the case a cachedelta is passed to 'addrevision()' and we detect the flag processor modified the revision data, we chose to trust the flag processor and drop the cachedelta.
author Remi Chaintron <remi@fb.com>
date Tue, 10 Jan 2017 16:15:21 +0000
parents
children 723c1ab2f77e
comparison
equal deleted inserted replaced
30744:e12c0fa1f65b 30745:c1b7b2285522
1 # Create server
2 $ hg init server
3 $ cd server
4 $ cat >> .hg/hgrc << EOF
5 > [extensions]
6 > extension=$TESTDIR/flagprocessorext.py
7 > EOF
8 $ cd ../
9
10 # Clone server and enable extensions
11 $ hg clone -q server client
12 $ cd client
13 $ cat >> .hg/hgrc << EOF
14 > [extensions]
15 > extension=$TESTDIR/flagprocessorext.py
16 > EOF
17
18 # Commit file that will trigger the noop extension
19 $ echo '[NOOP]' > noop
20 $ hg commit -Aqm "noop"
21
22 # Commit file that will trigger the base64 extension
23 $ echo '[BASE64]' > base64
24 $ hg commit -Aqm 'base64'
25
26 # Commit file that will trigger the gzip extension
27 $ echo '[GZIP]' > gzip
28 $ hg commit -Aqm 'gzip'
29
30 # Commit file that will trigger noop and base64
31 $ echo '[NOOP][BASE64]' > noop-base64
32 $ hg commit -Aqm 'noop+base64'
33
34 # Commit file that will trigger noop and gzip
35 $ echo '[NOOP][GZIP]' > noop-gzip
36 $ hg commit -Aqm 'noop+gzip'
37
38 # Commit file that will trigger base64 and gzip
39 $ echo '[BASE64][GZIP]' > base64-gzip
40 $ hg commit -Aqm 'base64+gzip'
41
42 # Commit file that will trigger base64, gzip and noop
43 $ echo '[BASE64][GZIP][NOOP]' > base64-gzip-noop
44 $ hg commit -Aqm 'base64+gzip+noop'
45
46 # TEST: ensure the revision data is consistent
47 $ hg cat noop
48 [NOOP]
49 $ hg debugdata noop 0
50 [NOOP]
51
52 $ hg cat -r . base64
53 [BASE64]
54 $ hg debugdata base64 0
55 W0JBU0U2NF0K (no-eol)
56
57 $ hg cat -r . gzip
58 [GZIP]
59 $ hg debugdata gzip 0
60 x\x9c\x8bv\x8f\xf2\x0c\x88\xe5\x02\x00\x08\xc8\x01\xfd (no-eol) (esc)
61
62 $ hg cat -r . noop-base64
63 [NOOP][BASE64]
64 $ hg debugdata noop-base64 0
65 W05PT1BdW0JBU0U2NF0K (no-eol)
66
67 $ hg cat -r . noop-gzip
68 [NOOP][GZIP]
69 $ hg debugdata noop-gzip 0
70 x\x9c\x8b\xf6\xf3\xf7\x0f\x88\x8dv\x8f\xf2\x0c\x88\xe5\x02\x00\x1dH\x03\xf1 (no-eol) (esc)
71
72 $ hg cat -r . base64-gzip
73 [BASE64][GZIP]
74 $ hg debugdata base64-gzip 0
75 eJyLdnIMdjUziY12j/IMiOUCACLBBDo= (no-eol)
76
77 $ hg cat -r . base64-gzip-noop
78 [BASE64][GZIP][NOOP]
79 $ hg debugdata base64-gzip-noop 0
80 eJyLdnIMdjUziY12j/IMiI328/cPiOUCAESjBi4= (no-eol)
81
82 # Push to the server
83 $ hg push
84 pushing to $TESTTMP/server (glob)
85 searching for changes
86 adding changesets
87 adding manifests
88 adding file changes
89 added 7 changesets with 7 changes to 7 files
90
91 # Initialize new client (not cloning) and setup extension
92 $ cd ..
93 $ hg init client2
94 $ cd client2
95 $ cat >> .hg/hgrc << EOF
96 > [paths]
97 > default = $TESTTMP/server
98 > [extensions]
99 > extension=$TESTDIR/flagprocessorext.py
100 > EOF
101
102 # Pull from server and update to latest revision
103 $ hg pull default
104 pulling from $TESTTMP/server (glob)
105 requesting all changes
106 adding changesets
107 adding manifests
108 adding file changes
109 added 7 changesets with 7 changes to 7 files
110 (run 'hg update' to get a working copy)
111 $ hg update
112 7 files updated, 0 files merged, 0 files removed, 0 files unresolved
113
114 # TEST: ensure the revision data is consistent
115 $ hg cat noop
116 [NOOP]
117 $ hg debugdata noop 0
118 [NOOP]
119
120 $ hg cat -r . base64
121 [BASE64]
122 $ hg debugdata base64 0
123 W0JBU0U2NF0K (no-eol)
124
125 $ hg cat -r . gzip
126 [GZIP]
127 $ hg debugdata gzip 0
128 x\x9c\x8bv\x8f\xf2\x0c\x88\xe5\x02\x00\x08\xc8\x01\xfd (no-eol) (esc)
129
130 $ hg cat -r . noop-base64
131 [NOOP][BASE64]
132 $ hg debugdata noop-base64 0
133 W05PT1BdW0JBU0U2NF0K (no-eol)
134
135 $ hg cat -r . noop-gzip
136 [NOOP][GZIP]
137 $ hg debugdata noop-gzip 0
138 x\x9c\x8b\xf6\xf3\xf7\x0f\x88\x8dv\x8f\xf2\x0c\x88\xe5\x02\x00\x1dH\x03\xf1 (no-eol) (esc)
139
140 $ hg cat -r . base64-gzip
141 [BASE64][GZIP]
142 $ hg debugdata base64-gzip 0
143 eJyLdnIMdjUziY12j/IMiOUCACLBBDo= (no-eol)
144
145 $ hg cat -r . base64-gzip-noop
146 [BASE64][GZIP][NOOP]
147 $ hg debugdata base64-gzip-noop 0
148 eJyLdnIMdjUziY12j/IMiI328/cPiOUCAESjBi4= (no-eol)
149
150 # TEST: ensure a missing processor is handled
151 $ echo '[FAIL][BASE64][GZIP][NOOP]' > fail-base64-gzip-noop
152 $ hg commit -Aqm 'fail+base64+gzip+noop'
153 abort: missing processor for flag '0x1'!
154 [255]
155
156 # TEST: ensure we cannot register several flag processors on the same flag
157 $ cat >> .hg/hgrc << EOF
158 > [extensions]
159 > extension=$TESTDIR/flagprocessorext.py
160 > duplicate=$TESTDIR/flagprocessorext.py
161 > EOF
162 $ echo 'this should fail' > file
163 $ hg commit -Aqm 'add file'
164 abort: cannot register multiple processors on flag '0x8'.
165 [255]