##// END OF EJS Templates
manifest: avoid corruption by dropping removed files with pure (issue5801)...
Matt Harbison -
r42569:0546ead3 stable
parent child Browse files
Show More
@@ -126,17 +126,20 b' def _cmp(a, b):'
126 126 return (a > b) - (a < b)
127 127
128 128 class _lazymanifest(object):
129 def __init__(self, data, positions=None, extrainfo=None, extradata=None):
129 def __init__(self, data, positions=None, extrainfo=None, extradata=None,
130 hasremovals=False):
130 131 if positions is None:
131 132 self.positions = self.findlines(data)
132 133 self.extrainfo = [0] * len(self.positions)
133 134 self.data = data
134 135 self.extradata = []
136 self.hasremovals = False
135 137 else:
136 138 self.positions = positions[:]
137 139 self.extrainfo = extrainfo[:]
138 140 self.extradata = extradata[:]
139 141 self.data = data
142 self.hasremovals = hasremovals
140 143
141 144 def findlines(self, data):
142 145 if not data:
@@ -244,6 +247,7 b' class _lazymanifest(object):'
244 247 self.extrainfo = self.extrainfo[:needle] + self.extrainfo[needle + 1:]
245 248 if cur >= 0:
246 249 self.data = self.data[:cur] + '\x00' + self.data[cur + 1:]
250 self.hasremovals = True
247 251
248 252 def __setitem__(self, key, value):
249 253 if not isinstance(key, bytes):
@@ -279,11 +283,11 b' class _lazymanifest(object):'
279 283 def copy(self):
280 284 # XXX call _compact like in C?
281 285 return _lazymanifest(self.data, self.positions, self.extrainfo,
282 self.extradata)
286 self.extradata, self.hasremovals)
283 287
284 288 def _compact(self):
285 289 # hopefully not called TOO often
286 if len(self.extradata) == 0:
290 if len(self.extradata) == 0 and not self.hasremovals:
287 291 return
288 292 l = []
289 293 i = 0
@@ -298,6 +302,16 b' class _lazymanifest(object):'
298 302 i += 1
299 303 if i == len(self.positions) or self.positions[i] < 0:
300 304 break
305
306 # A removed file has no positions[] entry, but does have an
307 # overwritten first byte. Break out and find the end of the
308 # current good entry/entries if there is a removed file
309 # before the next position.
310 if (self.hasremovals
311 and self.data.find('\n\x00', cur,
312 self.positions[i]) != -1):
313 break
314
301 315 offset += self.positions[i] - cur
302 316 cur = self.positions[i]
303 317 end_cut = self.data.find('\n', cur)
@@ -316,6 +330,7 b' class _lazymanifest(object):'
316 330 offset += len(l[-1])
317 331 i += 1
318 332 self.data = ''.join(l)
333 self.hasremovals = False
319 334 self.extradata = []
320 335
321 336 def _pack(self, d):
@@ -219,7 +219,7 b' will be contiguous spans of existing ent'
219 219 > manifest = $TESTTMP/manifest.py
220 220 > EOF
221 221
222 BROKEN: Pure removes should actually remove all dropped entries
222 Pure removes should actually remove all dropped entries
223 223
224 224 $ hg init repo
225 225 $ cd repo
@@ -239,32 +239,25 b' BROKEN: Pure removes should actually rem'
239 239 $ hg debugdata -m 1
240 240 a.txt\x00b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 (esc)
241 241 aa.txt\x00a4bdc161c8fbb523c9a60409603f8710ff49a571 (esc)
242 \x00.txt\x001e88685f5ddec574a34c70af492f95b6debc8741 (esc) (pure !)
243 242 c.txt\x00149da44f2a4e14f488b7bd4157945a9837408c00 (esc)
244 243 cc.txt\x00149da44f2a4e14f488b7bd4157945a9837408c00 (esc)
245 244 ccc.txt\x00149da44f2a4e14f488b7bd4157945a9837408c00 (esc)
246 \x00.txt\x001e88685f5ddec574a34c70af492f95b6debc8741 (esc) (pure !)
247 245 e.txt\x00149da44f2a4e14f488b7bd4157945a9837408c00 (esc)
248 246
249 $ hg up -C . 2>&1 | grep ValueError || true
250 raise ValueError("Manifest lines not in sorted order.") (pure !)
251 ValueError: Manifest lines not in sorted order. (pure !)
247 $ hg up -qC .
252 248
253 $ hg verify || true
249 $ hg verify
254 250 checking changesets
255 251 checking manifests
256 manifest@1: reading delta c1f6b2f803ac: Non-hexadecimal digit found (pure !)
257 252 crosschecking files in changesets and manifests
258 253 checking files
259 254 checked 2 changesets with 8 changes to 8 files
260 1 integrity errors encountered! (pure !)
261 (first damaged changeset appears to be 1) (pure !)
262 255
263 256 $ hg rollback -q --config ui.rollback=True
264 257 $ hg rm b.txt d.txt
265 258 $ echo bb > bb.txt
266 259
267 BROKEN: A mix of adds and removes should remove all dropped entries.
260 A mix of adds and removes should remove all dropped entries.
268 261
269 262 $ hg ci -Aqm 'remove b and d; add bb'
270 263
@@ -275,20 +268,11 b' BROKEN: A mix of adds and removes should'
275 268 c.txt\x00149da44f2a4e14f488b7bd4157945a9837408c00 (esc)
276 269 cc.txt\x00149da44f2a4e14f488b7bd4157945a9837408c00 (esc)
277 270 ccc.txt\x00149da44f2a4e14f488b7bd4157945a9837408c00 (esc)
278 \x00.txt\x001e88685f5ddec574a34c70af492f95b6debc8741 (esc) (pure !)
279 271 e.txt\x00149da44f2a4e14f488b7bd4157945a9837408c00 (esc)
280 272
281 $ hg up -C . 2>&1 | grep ValueError || true
282 raise ValueError("Manifest lines not in sorted order.") (pure !)
283 ValueError: Manifest lines not in sorted order. (pure !)
284
285 $ hg verify || true
273 $ hg verify
286 274 checking changesets
287 275 checking manifests
288 manifest@1: reading delta 0a0385480090: Manifest lines not in sorted order. (pure !)
289 276 crosschecking files in changesets and manifests
290 bb.txt@1: in changeset but not in manifest (pure !)
291 277 checking files
292 278 checked 2 changesets with 9 changes to 9 files
293 2 integrity errors encountered! (pure !)
294 (first damaged changeset appears to be 1) (pure !)
General Comments 0
You need to be logged in to leave comments. Login now