274
258
lock_and_call_current_dirstate(tree, 'lock_tree_write')
275
259
self.assertRaises(errors.ObjectNotLocked, tree.current_dirstate)
277
def test_set_parent_trees_uses_update_basis_by_delta(self):
278
builder = self.make_branch_builder('source')
279
builder.start_series()
280
self.addCleanup(builder.finish_series)
281
builder.build_snapshot('A', [], [
282
('add', ('', 'root-id', 'directory', None)),
283
('add', ('a', 'a-id', 'file', 'content\n'))])
284
builder.build_snapshot('B', ['A'], [
285
('modify', ('a-id', 'new content\nfor a\n')),
286
('add', ('b', 'b-id', 'file', 'b-content\n'))])
287
tree = self.make_workingtree('tree')
288
source_branch = builder.get_branch()
289
tree.branch.repository.fetch(source_branch.repository, 'B')
290
tree.pull(source_branch, stop_revision='A')
292
self.addCleanup(tree.unlock)
293
state = tree.current_dirstate()
295
orig_update = state.update_basis_by_delta
296
def log_update_basis_by_delta(delta, new_revid):
297
called.append(new_revid)
298
return orig_update(delta, new_revid)
299
state.update_basis_by_delta = log_update_basis_by_delta
300
basis = tree.basis_tree()
301
self.assertEqual('a-id', basis.path2id('a'))
302
self.assertEqual(None, basis.path2id('b'))
303
def fail_set_parent_trees(trees, ghosts):
304
raise AssertionError('dirstate.set_parent_trees() was called')
305
state.set_parent_trees = fail_set_parent_trees
306
repo = tree.branch.repository
307
tree.pull(source_branch, stop_revision='B')
308
self.assertEqual(['B'], called)
309
basis = tree.basis_tree()
310
self.assertEqual('a-id', basis.path2id('a'))
311
self.assertEqual('b-id', basis.path2id('b'))
313
def test_set_parent_trees_handles_missing_basis(self):
314
builder = self.make_branch_builder('source')
315
builder.start_series()
316
self.addCleanup(builder.finish_series)
317
builder.build_snapshot('A', [], [
318
('add', ('', 'root-id', 'directory', None)),
319
('add', ('a', 'a-id', 'file', 'content\n'))])
320
builder.build_snapshot('B', ['A'], [
321
('modify', ('a-id', 'new content\nfor a\n')),
322
('add', ('b', 'b-id', 'file', 'b-content\n'))])
323
builder.build_snapshot('C', ['A'], [
324
('add', ('c', 'c-id', 'file', 'c-content\n'))])
325
b_c = self.make_branch('branch_with_c')
326
b_c.pull(builder.get_branch(), stop_revision='C')
327
b_b = self.make_branch('branch_with_b')
328
b_b.pull(builder.get_branch(), stop_revision='B')
329
# This is reproducing some of what 'switch' does, just to isolate the
330
# set_parent_trees() step.
331
wt = b_b.create_checkout('tree', lightweight=True)
332
fmt = wt.bzrdir.find_branch_format()
333
fmt.set_reference(wt.bzrdir, None, b_c)
334
# Re-open with the new reference
335
wt = wt.bzrdir.open_workingtree()
336
wt.set_parent_trees([('C', b_c.repository.revision_tree('C'))])
337
self.assertEqual(None, wt.basis_tree().path2id('b'))
339
261
def test_new_dirstate_on_new_lock(self):
340
262
# until we have detection for when a dirstate can be reused, we
341
263
# want to reparse dirstate on every new lock.
676
598
def get_tree_with_cachable_file_foo(self):
677
599
tree = self.make_branch_and_tree('.')
679
self.addCleanup(tree.unlock)
680
self.build_tree_contents([('foo', 'a bit of content for foo\n')])
600
self.build_tree(['foo'])
681
601
tree.add(['foo'], ['foo-id'])
682
tree.current_dirstate()._cutoff_time = time.time() + 60
602
# a 4 second old timestamp is always hashable - sucks to delay
603
# the test suite, but not testing this is worse.
685
607
def test_commit_updates_hash_cache(self):
686
608
tree = self.get_tree_with_cachable_file_foo()
687
609
revid = tree.commit('a commit')
688
610
# tree's dirstate should now have a valid stat entry for foo.
612
self.addCleanup(tree.unlock)
689
613
entry = tree._get_entry(path='foo')
690
614
expected_sha1 = osutils.sha_file_by_name('foo')
691
615
self.assertEqual(expected_sha1, entry[1][0][1])
692
self.assertEqual(len('a bit of content for foo\n'), entry[1][0][2])
694
617
def test_observed_sha1_cachable(self):
695
618
tree = self.get_tree_with_cachable_file_foo()
696
619
expected_sha1 = osutils.sha_file_by_name('foo')
697
620
statvalue = os.lstat("foo")
698
tree._observed_sha1("foo-id", "foo", (expected_sha1, statvalue))
699
entry = tree._get_entry(path="foo")
700
entry_state = entry[1][0]
701
self.assertEqual(expected_sha1, entry_state[1])
702
self.assertEqual(statvalue.st_size, entry_state[2])
623
tree._observed_sha1("foo-id", "foo", (expected_sha1, statvalue))
624
self.assertEqual(expected_sha1,
625
tree._get_entry(path="foo")[1][0][1])
705
628
tree = tree.bzrdir.open_workingtree()
707
630
self.addCleanup(tree.unlock)
708
entry = tree._get_entry(path="foo")
709
entry_state = entry[1][0]
710
self.assertEqual(expected_sha1, entry_state[1])
711
self.assertEqual(statvalue.st_size, entry_state[2])
631
self.assertEqual(expected_sha1, tree._get_entry(path="foo")[1][0][1])
713
633
def test_observed_sha1_new_file(self):
714
634
tree = self.make_branch_and_tree('.')