251
233
def test_simple_stepping(self):
252
234
tree = self.make_branch_and_tree('tree')
253
235
self.build_tree(['tree/a', 'tree/b/', 'tree/b/c'])
254
tree.add(['a', 'b', 'b/c'], [b'a-id', b'b-id', b'c-id'])
236
tree.add(['a', 'b', 'b/c'], ['a-id', 'b-id', 'c-id'])
256
tree.commit('first', rev_id=b'first-rev-id')
238
tree.commit('first', rev_id='first-rev-id')
258
240
basis_tree, root_id = self.lock_and_get_basis_and_root_id(tree)
260
242
walker = _mod_tree.MultiWalker(tree, [basis_tree])
261
243
iterator = walker.iter_all()
262
244
self.assertWalkerNext(u'', root_id, True, [u''], iterator)
263
self.assertWalkerNext(u'a', b'a-id', True, [u'a'], iterator)
264
self.assertWalkerNext(u'b', b'b-id', True, [u'b'], iterator)
265
self.assertWalkerNext(u'b/c', b'c-id', True, [u'b/c'], iterator)
266
self.assertRaises(StopIteration, next, iterator)
245
self.assertWalkerNext(u'a', 'a-id', True, [u'a'], iterator)
246
self.assertWalkerNext(u'b', 'b-id', True, [u'b'], iterator)
247
self.assertWalkerNext(u'b/c', 'c-id', True, [u'b/c'], iterator)
248
self.assertRaises(StopIteration, iterator.next)
268
250
def test_master_has_extra(self):
269
251
tree = self.make_branch_and_tree('tree')
270
252
self.build_tree(['tree/a', 'tree/b/', 'tree/c', 'tree/d'])
271
tree.add(['a', 'b', 'd'], [b'a-id', b'b-id', b'd-id'])
273
tree.commit('first', rev_id=b'first-rev-id')
275
tree.add(['c'], [b'c-id'])
253
tree.add(['a', 'b', 'd'], ['a-id', 'b-id', 'd-id'])
255
tree.commit('first', rev_id='first-rev-id')
257
tree.add(['c'], ['c-id'])
276
258
basis_tree, root_id = self.lock_and_get_basis_and_root_id(tree)
278
260
walker = _mod_tree.MultiWalker(tree, [basis_tree])
279
261
iterator = walker.iter_all()
280
262
self.assertWalkerNext(u'', root_id, True, [u''], iterator)
281
self.assertWalkerNext(u'a', b'a-id', True, [u'a'], iterator)
282
self.assertWalkerNext(u'b', b'b-id', True, [u'b'], iterator)
283
self.assertWalkerNext(u'c', b'c-id', True, [None], iterator)
284
self.assertWalkerNext(u'd', b'd-id', True, [u'd'], iterator)
285
self.assertRaises(StopIteration, next, iterator)
263
self.assertWalkerNext(u'a', 'a-id', True, [u'a'], iterator)
264
self.assertWalkerNext(u'b', 'b-id', True, [u'b'], iterator)
265
self.assertWalkerNext(u'c', 'c-id', True, [None], iterator)
266
self.assertWalkerNext(u'd', 'd-id', True, [u'd'], iterator)
267
self.assertRaises(StopIteration, iterator.next)
287
269
def test_master_renamed_to_earlier(self):
288
270
"""The record is still present, it just shows up early."""
289
271
tree = self.make_branch_and_tree('tree')
290
272
self.build_tree(['tree/a', 'tree/c', 'tree/d'])
291
tree.add(['a', 'c', 'd'], [b'a-id', b'c-id', b'd-id'])
292
tree.commit('first', rev_id=b'first-rev-id')
273
tree.add(['a', 'c', 'd'], ['a-id', 'c-id', 'd-id'])
274
tree.commit('first', rev_id='first-rev-id')
293
275
tree.rename_one('d', 'b')
295
277
basis_tree, root_id = self.lock_and_get_basis_and_root_id(tree)
314
296
walker = _mod_tree.MultiWalker(tree, [basis_tree])
315
297
iterator = walker.iter_all()
316
298
self.assertWalkerNext(u'', root_id, True, [u''], iterator)
317
self.assertWalkerNext(u'a', b'a-id', True, [u'a'], iterator)
318
self.assertWalkerNext(u'd', b'd-id', True, [u'd'], iterator)
319
self.assertWalkerNext(u'e', b'b-id', True, [u'b'], iterator)
320
self.assertRaises(StopIteration, next, iterator)
299
self.assertWalkerNext(u'a', 'a-id', True, [u'a'], iterator)
300
self.assertWalkerNext(u'd', 'd-id', True, [u'd'], iterator)
301
self.assertWalkerNext(u'e', 'b-id', True, [u'b'], iterator)
302
self.assertRaises(StopIteration, iterator.next)
322
304
def test_other_extra_in_middle(self):
323
305
tree = self.make_branch_and_tree('tree')
324
306
self.build_tree(['tree/a', 'tree/b', 'tree/d'])
325
tree.add(['a', 'b', 'd'], [b'a-id', b'b-id', b'd-id'])
326
tree.commit('first', rev_id=b'first-rev-id')
307
tree.add(['a', 'b', 'd'], ['a-id', 'b-id', 'd-id'])
308
tree.commit('first', rev_id='first-rev-id')
327
309
tree.remove(['b'])
329
311
basis_tree, root_id = self.lock_and_get_basis_and_root_id(tree)
330
312
walker = _mod_tree.MultiWalker(tree, [basis_tree])
331
313
iterator = walker.iter_all()
332
314
self.assertWalkerNext(u'', root_id, True, [u''], iterator)
333
self.assertWalkerNext(u'a', b'a-id', True, [u'a'], iterator)
334
self.assertWalkerNext(u'd', b'd-id', True, [u'd'], iterator)
335
self.assertWalkerNext(u'b', b'b-id', False, [u'b'], iterator)
336
self.assertRaises(StopIteration, next, iterator)
315
self.assertWalkerNext(u'a', 'a-id', True, [u'a'], iterator)
316
self.assertWalkerNext(u'd', 'd-id', True, [u'd'], iterator)
317
self.assertWalkerNext(u'b', 'b-id', False, [u'b'], iterator)
318
self.assertRaises(StopIteration, iterator.next)
338
320
def test_other_extra_at_end(self):
339
321
tree = self.make_branch_and_tree('tree')
340
322
self.build_tree(['tree/a', 'tree/b', 'tree/d'])
341
tree.add(['a', 'b', 'd'], [b'a-id', b'b-id', b'd-id'])
342
tree.commit('first', rev_id=b'first-rev-id')
323
tree.add(['a', 'b', 'd'], ['a-id', 'b-id', 'd-id'])
324
tree.commit('first', rev_id='first-rev-id')
343
325
tree.remove(['d'])
345
327
basis_tree, root_id = self.lock_and_get_basis_and_root_id(tree)
346
328
walker = _mod_tree.MultiWalker(tree, [basis_tree])
347
329
iterator = walker.iter_all()
348
330
self.assertWalkerNext(u'', root_id, True, [u''], iterator)
349
self.assertWalkerNext(u'a', b'a-id', True, [u'a'], iterator)
350
self.assertWalkerNext(u'b', b'b-id', True, [u'b'], iterator)
351
self.assertWalkerNext(u'd', b'd-id', False, [u'd'], iterator)
352
self.assertRaises(StopIteration, next, iterator)
331
self.assertWalkerNext(u'a', 'a-id', True, [u'a'], iterator)
332
self.assertWalkerNext(u'b', 'b-id', True, [u'b'], iterator)
333
self.assertWalkerNext(u'd', 'd-id', False, [u'd'], iterator)
334
self.assertRaises(StopIteration, iterator.next)
354
336
def test_others_extra_at_end(self):
355
337
tree = self.make_branch_and_tree('tree')
356
338
self.build_tree(['tree/a', 'tree/b', 'tree/c', 'tree/d', 'tree/e'])
357
339
tree.add(['a', 'b', 'c', 'd', 'e'],
358
[b'a-id', b'b-id', b'c-id', b'd-id', b'e-id'])
359
tree.commit('first', rev_id=b'first-rev-id')
340
['a-id', 'b-id', 'c-id', 'd-id', 'e-id'])
341
tree.commit('first', rev_id='first-rev-id')
360
342
tree.remove(['e'])
361
tree.commit('second', rev_id=b'second-rev-id')
343
tree.commit('second', rev_id='second-rev-id')
362
344
tree.remove(['d'])
363
tree.commit('third', rev_id=b'third-rev-id')
345
tree.commit('third', rev_id='third-rev-id')
364
346
tree.remove(['c'])
366
348
basis_tree, root_id = self.lock_and_get_basis_and_root_id(tree)
367
first_tree = tree.branch.repository.revision_tree(b'first-rev-id')
368
second_tree = tree.branch.repository.revision_tree(b'second-rev-id')
349
first_tree = tree.branch.repository.revision_tree('first-rev-id')
350
second_tree = tree.branch.repository.revision_tree('second-rev-id')
369
351
walker = _mod_tree.MultiWalker(tree, [basis_tree, first_tree,
371
353
iterator = walker.iter_all()
372
354
self.assertWalkerNext(u'', root_id, True, [u'', u'', u''], iterator)
373
self.assertWalkerNext(u'a', b'a-id', True,
374
[u'a', u'a', u'a'], iterator)
375
self.assertWalkerNext(u'b', b'b-id', True,
376
[u'b', u'b', u'b'], iterator)
377
self.assertWalkerNext(u'c', b'c-id', False,
378
[u'c', u'c', u'c'], iterator)
379
self.assertWalkerNext(u'd', b'd-id', False,
380
[None, u'd', u'd'], iterator)
381
self.assertWalkerNext(u'e', b'e-id', False,
382
[None, u'e', None], iterator)
383
self.assertRaises(StopIteration, next, iterator)
355
self.assertWalkerNext(u'a', 'a-id', True, [u'a', u'a', u'a'], iterator)
356
self.assertWalkerNext(u'b', 'b-id', True, [u'b', u'b', u'b'], iterator)
357
self.assertWalkerNext(u'c', 'c-id', False, [u'c', u'c', u'c'], iterator)
358
self.assertWalkerNext(u'd', 'd-id', False, [None, u'd', u'd'], iterator)
359
self.assertWalkerNext(u'e', 'e-id', False, [None, u'e', None], iterator)
360
self.assertRaises(StopIteration, iterator.next)
385
362
def test_different_file_id_in_others(self):
386
363
tree = self.make_branch_and_tree('tree')
387
364
self.build_tree(['tree/a', 'tree/b', 'tree/c/'])
388
tree.add(['a', 'b', 'c'], [b'a-id', b'b-id', b'c-id'])
389
tree.commit('first', rev_id=b'first-rev-id')
365
tree.add(['a', 'b', 'c'], ['a-id', 'b-id', 'c-id'])
366
tree.commit('first', rev_id='first-rev-id')
391
368
tree.rename_one('b', 'c/d')
392
369
self.build_tree(['tree/b'])
393
tree.add(['b'], [b'b2-id'])
394
tree.commit('second', rev_id=b'second-rev-id')
370
tree.add(['b'], ['b2-id'])
371
tree.commit('second', rev_id='second-rev-id')
396
373
tree.rename_one('a', 'c/e')
397
374
self.build_tree(['tree/a'])
398
tree.add(['a'], [b'a2-id'])
375
tree.add(['a'], ['a2-id'])
400
377
basis_tree, root_id = self.lock_and_get_basis_and_root_id(tree)
401
first_tree = tree.branch.repository.revision_tree(b'first-rev-id')
378
first_tree = tree.branch.repository.revision_tree('first-rev-id')
402
379
walker = _mod_tree.MultiWalker(tree, [basis_tree, first_tree])
404
381
iterator = walker.iter_all()
405
382
self.assertWalkerNext(u'', root_id, True, [u'', u''], iterator)
406
self.assertWalkerNext(u'a', b'a2-id', True, [None, None], iterator)
407
self.assertWalkerNext(u'b', b'b2-id', True, [u'b', None], iterator)
408
self.assertWalkerNext(u'c', b'c-id', True, [u'c', u'c'], iterator)
409
self.assertWalkerNext(u'c/d', b'b-id', True, [u'c/d', u'b'], iterator)
410
self.assertWalkerNext(u'c/e', b'a-id', True, [u'a', u'a'], iterator)
411
self.assertRaises(StopIteration, next, iterator)
413
def assertLtByDirblock(self, lt_val, path1, path2):
415
lt_val, _mod_tree.MultiWalker._lt_path_by_dirblock(path1, path2))
417
def test__lt_path_by_dirblock(self):
383
self.assertWalkerNext(u'a', 'a2-id', True, [None, None], iterator)
384
self.assertWalkerNext(u'b', 'b2-id', True, [u'b', None], iterator)
385
self.assertWalkerNext(u'c', 'c-id', True, [u'c', u'c'], iterator)
386
self.assertWalkerNext(u'c/d', 'b-id', True, [u'c/d', u'b'], iterator)
387
self.assertWalkerNext(u'c/e', 'a-id', True, [u'a', u'a'], iterator)
388
self.assertRaises(StopIteration, iterator.next)
390
def assertCmpByDirblock(self, cmp_val, path1, path2):
391
self.assertEqual(cmp_val,
392
_mod_tree.MultiWalker._cmp_path_by_dirblock(path1, path2))
394
def test__cmp_path_by_dirblock(self):
418
395
# We only support Unicode strings at this point
420
TypeError, _mod_tree.MultiWalker._lt_path_by_dirblock, b'', b'b')
421
self.assertLtByDirblock(False, u'', u'')
422
self.assertLtByDirblock(False, u'a', u'a')
423
self.assertLtByDirblock(False, u'a/b', u'a/b')
424
self.assertLtByDirblock(False, u'a/b/c', u'a/b/c')
425
self.assertLtByDirblock(False, u'a-a', u'a')
426
self.assertLtByDirblock(True, u'a-a', u'a/a')
427
self.assertLtByDirblock(True, u'a=a', u'a/a')
428
self.assertLtByDirblock(False, u'a-a/a', u'a/a')
429
self.assertLtByDirblock(False, u'a=a/a', u'a/a')
430
self.assertLtByDirblock(False, u'a-a/a', u'a/a/a')
431
self.assertLtByDirblock(False, u'a=a/a', u'a/a/a')
432
self.assertLtByDirblock(False, u'a-a/a/a', u'a/a/a')
433
self.assertLtByDirblock(False, u'a=a/a/a', u'a/a/a')
396
self.assertRaises(TypeError,
397
_mod_tree.MultiWalker._cmp_path_by_dirblock, '', 'b')
398
self.assertCmpByDirblock(0, u'', u'')
399
self.assertCmpByDirblock(0, u'a', u'a')
400
self.assertCmpByDirblock(0, u'a/b', u'a/b')
401
self.assertCmpByDirblock(0, u'a/b/c', u'a/b/c')
402
self.assertCmpByDirblock(1, u'a-a', u'a')
403
self.assertCmpByDirblock(-1, u'a-a', u'a/a')
404
self.assertCmpByDirblock(-1, u'a=a', u'a/a')
405
self.assertCmpByDirblock(1, u'a-a/a', u'a/a')
406
self.assertCmpByDirblock(1, u'a=a/a', u'a/a')
407
self.assertCmpByDirblock(1, u'a-a/a', u'a/a/a')
408
self.assertCmpByDirblock(1, u'a=a/a', u'a/a/a')
409
self.assertCmpByDirblock(1, u'a-a/a/a', u'a/a/a')
410
self.assertCmpByDirblock(1, u'a=a/a/a', u'a/a/a')
435
412
def assertPathToKey(self, expected, path):
436
413
self.assertEqual(expected, _mod_tree.MultiWalker._path_to_key(path))