105
116
tree = b2.repository.revision_tree('revision-1')
106
117
eq(tree.get_file_text('foo-id'), 'hello')
108
def test_revision_tree(self):
109
b1 = self.get_branch()
110
wt = WorkingTree.create(b1, '.')
111
wt.commit('lala!', rev_id='revision-1', allow_pointless=True)
112
tree = b1.repository.revision_tree('revision-1')
113
tree = b1.repository.revision_tree(None)
114
self.assertEqual(len(tree.list_files()), 0)
115
tree = b1.repository.revision_tree(NULL_REVISION)
116
self.assertEqual(len(tree.list_files()), 0)
118
119
def get_unbalanced_tree_pair(self):
119
120
"""Return two branches, a and b, with one file in a."""
120
121
get_transport(self.get_url()).mkdir('a')
121
br_a = self.make_branch('a')
122
tree_a = WorkingTree.create(br_a, 'a')
122
tree_a = self.make_branch_and_tree('a')
123
123
file('a/b', 'wb').write('b')
125
125
tree_a.commit("silly commit", rev_id='A')
127
127
get_transport(self.get_url()).mkdir('b')
128
br_b = self.make_branch('b')
129
tree_b = WorkingTree.create(br_b, 'b')
128
tree_b = self.make_branch_and_tree('b')
130
129
return tree_a, tree_b
132
131
def get_balanced_branch_pair(self):
133
132
"""Returns br_a, br_b as with one commit in a, and b has a's stores."""
134
133
tree_a, tree_b = self.get_unbalanced_tree_pair()
135
tree_a.branch.push_stores(tree_b.branch)
134
tree_b.branch.repository.fetch(tree_a.branch.repository)
136
135
return tree_a, tree_b
138
def test_push_stores(self):
139
"""Copy the stores from one branch to another"""
140
tree_a, tree_b = self.get_unbalanced_tree_pair()
143
# ensure the revision is missing.
144
self.assertRaises(NoSuchRevision, br_b.repository.get_revision,
145
br_a.revision_history()[0])
146
br_a.push_stores(br_b)
147
# check that b now has all the data from a's first commit.
148
rev = br_b.repository.get_revision(br_a.revision_history()[0])
149
tree = br_b.repository.revision_tree(br_a.revision_history()[0])
151
if tree.inventory[file_id].kind == "file":
152
tree.get_file(file_id).read()
154
137
def test_clone_branch(self):
155
138
"""Copy the stores from one branch to another"""
156
139
tree_a, tree_b = self.get_balanced_branch_pair()
157
140
tree_b.commit("silly commit")
159
br_c = tree_a.branch.clone('c', basis_branch=tree_b.branch)
142
# this fails to test that the history from a was not used.
143
dir_c = tree_a.bzrdir.clone('c', basis=tree_b.bzrdir)
160
144
self.assertEqual(tree_a.branch.revision_history(),
161
br_c.revision_history())
145
dir_c.open_branch().revision_history())
163
147
def test_clone_partial(self):
164
148
"""Copy only part of the history of a branch."""
165
get_transport(self.get_url()).mkdir('a')
166
br_a = self.make_branch('a')
167
wt = WorkingTree.create(br_a, "a")
168
self.build_tree(['a/one'])
170
wt.commit('commit one', rev_id='u@d-1')
171
self.build_tree(['a/two'])
173
wt.commit('commit two', rev_id='u@d-2')
174
br_b = br_a.clone('b', revision='u@d-1')
175
self.assertEqual(br_b.last_revision(), 'u@d-1')
176
self.assertTrue(os.path.exists('b/one'))
177
self.assertFalse(os.path.exists('b/two'))
149
# TODO: RBC 20060208 test with a revision not on revision-history.
150
# what should that behaviour be ? Emailed the list.
151
wt_a = self.make_branch_and_tree('a')
152
self.build_tree(['a/one'])
154
wt_a.commit('commit one', rev_id='1')
155
self.build_tree(['a/two'])
157
wt_a.commit('commit two', rev_id='2')
158
repo_b = self.make_repository('b')
159
wt_a.bzrdir.open_repository().copy_content_into(repo_b)
160
br_b = wt_a.bzrdir.open_branch().clone(repo_b.bzrdir, revision_id='1')
161
self.assertEqual(br_b.last_revision(), '1')
163
def test_sprout_partial(self):
164
# test sprouting with a prefix of the revision-history.
165
# also needs not-on-revision-history behaviour defined.
166
wt_a = self.make_branch_and_tree('a')
167
self.build_tree(['a/one'])
169
wt_a.commit('commit one', rev_id='1')
170
self.build_tree(['a/two'])
172
wt_a.commit('commit two', rev_id='2')
173
repo_b = self.make_repository('b')
174
wt_a.bzrdir.open_repository().copy_content_into(repo_b)
175
br_b = wt_a.bzrdir.open_branch().sprout(repo_b.bzrdir, revision_id='1')
176
self.assertEqual(br_b.last_revision(), '1')
178
def test_clone_branch_nickname(self):
179
# test the nick name is preserved always
180
raise TestSkipped('XXX branch cloning is not yet tested..')
182
def test_clone_branch_parent(self):
183
# test the parent is preserved always
184
raise TestSkipped('XXX branch cloning is not yet tested..')
186
def test_sprout_branch_nickname(self):
187
# test the nick name is reset always
188
raise TestSkipped('XXX branch sprouting is not yet tested..')
190
def test_sprout_branch_parent(self):
191
source = self.make_branch('source')
192
target = source.bzrdir.sprout(self.get_url('target')).open_branch()
193
self.assertEqual(source.bzrdir.root_transport.base, target.get_parent())
179
195
def test_record_initial_ghost_merge(self):
180
196
"""A pending merge with no revision present is still a merge."""
181
branch = self.get_branch()
182
wt = WorkingTree.create(branch, ".")
197
wt = self.make_branch_and_tree('.')
183
199
wt.add_pending_merge('non:existent@rev--ision--0--2')
184
200
wt.commit('pretend to merge nonexistent-revision', rev_id='first')
185
201
rev = branch.repository.get_revision(branch.last_revision())
249
265
#FIXME: clone should work to urls,
250
266
# wt.clone should work to disks.
251
267
self.build_tree(['target/'])
252
b2 = wt.branch.clone('target')
268
d2 = wt.bzrdir.clone('target')
253
269
self.assertEqual(wt.branch.repository.revision_store.get('A',
255
b2.repository.revision_store.get('A',
271
d2.open_repository().revision_store.get('A',
258
274
def test_upgrade_preserves_signatures(self):
259
# this is in the current test format
260
275
wt = self.make_branch_and_tree('source')
261
276
wt.commit('A', allow_pointless=True, rev_id='A')
262
277
wt.branch.repository.sign_revision('A',
263
278
bzrlib.gpg.LoopbackGPGStrategy(None))
264
279
old_signature = wt.branch.repository.revision_store.get('A',
267
wt = WorkingTree(wt.basedir)
283
except errors.UpToDateFormat:
284
# this is in the most current format already.
286
wt = WorkingTree.open(wt.basedir)
268
287
new_signature = wt.branch.repository.revision_store.get('A',
270
289
self.assertEqual(old_signature, new_signature)
297
316
def test_commit_nicks(self):
298
317
"""Nicknames are committed to the revision"""
299
318
get_transport(self.get_url()).mkdir('bzr.dev')
300
branch = self.make_branch('bzr.dev')
319
wt = self.make_branch_and_tree('bzr.dev')
301
321
branch.nick = "My happy branch"
302
WorkingTree.create(branch, 'bzr.dev').commit('My commit respect da nick.')
322
wt.commit('My commit respect da nick.')
303
323
committed = branch.repository.get_revision(branch.last_revision())
304
324
self.assertEqual(committed.properties["branch-nick"],
305
325
"My happy branch")
307
def test_no_ancestry_weave(self):
308
# We no longer need to create the ancestry.weave file
309
# since it is *never* used.
310
branch = Branch.create('.')
311
self.failIfExists('.bzr/ancestry.weave')
327
def test_create_open_branch_uses_repository(self):
329
repo = self.make_repository('.', shared=True)
330
except errors.IncompatibleFormat:
332
repo.bzrdir.root_transport.mkdir('child')
333
child_dir = self.bzrdir_format.initialize('child')
335
child_branch = self.branch_format.initialize(child_dir)
336
except errors.UninitializableFormat:
337
# branch references are not default init'able.
339
self.assertEqual(repo.bzrdir.root_transport.base,
340
child_branch.repository.bzrdir.root_transport.base)
341
child_branch = bzrlib.branch.Branch.open(self.get_url('child'))
342
self.assertEqual(repo.bzrdir.root_transport.base,
343
child_branch.repository.bzrdir.root_transport.base)
314
346
class ChrootedTests(TestCaseWithBranch):
511
540
# supported formats must be able to init and open
512
541
t = get_transport(self.get_url())
513
542
readonly_t = get_transport(self.get_readonly_url())
514
made_branch = self.branch_format.initialize(t.base)
515
self.failUnless(isinstance(made_branch, branch.Branch))
543
made_branch = self.make_branch('.')
544
self.failUnless(isinstance(made_branch, bzrlib.branch.Branch))
546
# find it via bzrdir opening:
547
opened_control = bzrdir.BzrDir.open(readonly_t.base)
548
direct_opened_branch = opened_control.open_branch()
549
self.assertEqual(direct_opened_branch.__class__, made_branch.__class__)
550
self.assertEqual(opened_control, direct_opened_branch.bzrdir)
551
self.failUnless(isinstance(direct_opened_branch._format,
552
self.branch_format.__class__))
554
# find it via Branch.open
555
opened_branch = bzrlib.branch.Branch.open(readonly_t.base)
556
self.failUnless(isinstance(opened_branch, made_branch.__class__))
557
self.assertEqual(made_branch._format.__class__,
558
opened_branch._format.__class__)
559
# if it has a unique id string, can we probe for it ?
561
self.branch_format.get_format_string()
562
except NotImplementedError:
516
564
self.assertEqual(self.branch_format,
517
branch.BzrBranchFormat.find_format(readonly_t))
518
direct_opened_branch = self.branch_format.open(readonly_t)
519
opened_branch = branch.Branch.open(t.base)
520
self.assertEqual(made_branch._branch_format,
521
opened_branch._branch_format)
522
self.assertEqual(direct_opened_branch._branch_format,
523
opened_branch._branch_format)
524
self.failUnless(isinstance(opened_branch, branch.Branch))
526
def test_open_not_branch(self):
527
self.assertRaises(NoSuchFile,
528
self.branch_format.open,
529
get_transport(self.get_readonly_url()))
565
bzrlib.branch.BranchFormat.find_format(opened_control))