114
113
tree_a.add('vla', 'file2')
115
114
tree_a.commit('rev2', rev_id='rev2')
117
delta = tree_a.branch.get_revision_delta(1)
116
delta = self.applyDeprecated(symbol_versioning.deprecated_in(
117
(2, 5, 0)), tree_a.branch.get_revision_delta, 1)
118
118
self.assertIsInstance(delta, _mod_delta.TreeDelta)
119
119
self.assertEqual([('foo', 'file1', 'file')], delta.added)
120
delta = tree_a.branch.get_revision_delta(2)
120
delta = self.applyDeprecated(symbol_versioning.deprecated_in(
121
(2, 5, 0)), tree_a.branch.get_revision_delta, 2)
121
122
self.assertIsInstance(delta, _mod_delta.TreeDelta)
122
123
self.assertEqual([('vla', 'file2', 'file')], delta.added)
245
252
self.get_branch().repository.get_revision,
249
# compare the gpg-to-sign info for a commit with a ghost and
250
# an identical tree without a ghost
251
# fetch missing should rewrite the TOC of weaves to list newly available parents.
253
def test_sign_existing_revision(self):
254
wt = self.make_branch_and_tree('.')
256
wt.commit("base", allow_pointless=True, rev_id='A')
257
from bzrlib.testament import Testament
258
strategy = gpg.LoopbackGPGStrategy(None)
259
branch.repository.lock_write()
260
branch.repository.start_write_group()
261
branch.repository.sign_revision('A', strategy)
262
branch.repository.commit_write_group()
263
branch.repository.unlock()
264
self.assertEqual('-----BEGIN PSEUDO-SIGNED CONTENT-----\n' +
265
Testament.from_revision(branch.repository,
266
'A').as_short_text() +
267
'-----END PSEUDO-SIGNED CONTENT-----\n',
268
branch.repository.get_signature_text('A'))
270
def test_store_signature(self):
271
wt = self.make_branch_and_tree('.')
275
branch.repository.start_write_group()
277
branch.repository.store_revision_signature(
278
gpg.LoopbackGPGStrategy(None), 'FOO', 'A')
280
branch.repository.abort_write_group()
283
branch.repository.commit_write_group()
286
# A signature without a revision should not be accessible.
287
self.assertRaises(errors.NoSuchRevision,
288
branch.repository.has_signature_for_revision_id,
290
wt.commit("base", allow_pointless=True, rev_id='A')
291
self.assertEqual('-----BEGIN PSEUDO-SIGNED CONTENT-----\n'
292
'FOO-----END PSEUDO-SIGNED CONTENT-----\n',
293
branch.repository.get_signature_text('A'))
295
def test_branch_keeps_signatures(self):
296
wt = self.make_branch_and_tree('source')
297
wt.commit('A', allow_pointless=True, rev_id='A')
298
repo = wt.branch.repository
300
repo.start_write_group()
301
repo.sign_revision('A', gpg.LoopbackGPGStrategy(None))
302
repo.commit_write_group()
304
#FIXME: clone should work to urls,
305
# wt.clone should work to disks.
306
self.build_tree(['target/'])
307
d2 = repo.bzrdir.clone(urlutils.local_path_to_url('target'))
308
self.assertEqual(repo.get_signature_text('A'),
309
d2.open_repository().get_signature_text('A'))
311
def test_nicks(self):
312
"""Test explicit and implicit branch nicknames.
255
def test_nicks_bzr(self):
256
"""Test the behaviour of branch nicks specific to bzr branches.
314
258
Nicknames are implicitly the name of the branch's directory, unless an
315
259
explicit nickname is set. That is, an explicit nickname always
316
260
overrides the implicit one.
318
263
t = self.get_transport()
319
264
branch = self.make_branch('bzr.dev')
265
if not isinstance(branch, _mod_branch.BzrBranch):
266
raise tests.TestNotApplicable("not a bzr branch format")
320
267
# The nick will be 'bzr.dev', because there is no explicit nick set.
321
268
self.assertEqual(branch.nick, 'bzr.dev')
322
269
# Move the branch to a different directory, 'bzr.ab'. Now that branch
338
285
branch.nick = u"\u1234"
339
286
self.assertEqual(branch.nick, u"\u1234")
288
def test_nicks(self):
289
"""Test explicit and implicit branch nicknames.
291
A nickname is always available, whether set explicitly or not.
293
t = self.get_transport()
294
branch = self.make_branch('bzr.dev')
295
# An implicit nick name is set; what it is exactly depends on the
297
self.assertIsInstance(branch.nick, basestring)
298
# Set the branch nick explicitly.
299
branch.nick = "Aaron's branch"
300
# Because the nick has been set explicitly, the nick is now always
302
self.assertEqual(branch.nick, "Aaron's branch")
303
branch.nick = u"\u1234"
304
self.assertEqual(branch.nick, u"\u1234")
341
306
def test_commit_nicks(self):
342
307
"""Nicknames are committed to the revision"""
343
308
wt = self.make_branch_and_tree('bzr.dev')
365
330
self.branch_format.initialize(repo.bzrdir, name='branch2')
366
331
self.assertEquals(2, len(repo.bzrdir.list_branches()))
333
def test_create_append_revisions_only(self):
335
repo = self.make_repository('.', shared=True)
336
except errors.IncompatibleFormat:
338
for val in (True, False):
340
branch = self.branch_format.initialize(repo.bzrdir,
341
append_revisions_only=True)
342
except (errors.UninitializableFormat, errors.UpgradeRequired):
343
# branch references are not default init'able and
344
# not all branches support append_revisions_only
346
self.assertEquals(True, branch.get_append_revisions_only())
347
repo.bzrdir.destroy_branch()
349
def test_get_set_append_revisions_only(self):
350
branch = self.make_branch('.')
351
if branch._format.supports_set_append_revisions_only():
352
branch.set_append_revisions_only(True)
353
self.assertTrue(branch.get_append_revisions_only())
354
branch.set_append_revisions_only(False)
355
self.assertFalse(branch.get_append_revisions_only())
357
self.assertRaises(errors.UpgradeRequired,
358
branch.set_append_revisions_only, True)
359
self.assertFalse(branch.get_append_revisions_only())
368
361
def test_create_open_branch_uses_repository(self):
370
363
repo = self.make_repository('.', shared=True)
371
364
except errors.IncompatibleFormat:
365
raise tests.TestNotApplicable("requires shared repository support")
373
366
child_transport = repo.bzrdir.root_transport.clone('child')
374
367
child_transport.mkdir('.')
375
child_dir = self.bzrdir_format.initialize_on_transport(child_transport)
369
child_dir = self.bzrdir_format.initialize_on_transport(child_transport)
370
except errors.UninitializableFormat:
371
raise tests.TestNotApplicable("control dir format not initializable")
377
373
child_branch = self.branch_format.initialize(child_dir)
378
374
except errors.UninitializableFormat:
401
397
"""Create a fake revision history easily."""
402
398
tree = self.make_branch_and_tree('.')
403
399
rev1 = tree.commit('foo')
404
orig_history = tree.branch.revision_history()
401
self.addCleanup(tree.unlock)
402
graph = tree.branch.repository.get_graph()
404
graph.iter_lefthand_ancestry(
405
tree.branch.last_revision(), [revision.NULL_REVISION]))
405
406
rev2 = tree.commit('bar', allow_pointless=True)
406
407
tree.branch.generate_revision_history(rev1)
407
self.assertEqual(orig_history, tree.branch.revision_history())
408
self.assertEqual(orig_history, list(
409
graph.iter_lefthand_ancestry(
410
tree.branch.last_revision(), [revision.NULL_REVISION])))
409
412
def test_generate_revision_history_NULL_REVISION(self):
410
413
tree = self.make_branch_and_tree('.')
411
414
rev1 = tree.commit('foo')
416
self.addCleanup(tree.unlock)
412
417
tree.branch.generate_revision_history(revision.NULL_REVISION)
413
self.assertEqual([], tree.branch.revision_history())
418
self.assertEqual(revision.NULL_REVISION, tree.branch.last_revision())
415
420
def test_create_checkout(self):
416
421
tree_a = self.make_branch_and_tree('a')
437
442
tree_a = self.make_branch_and_tree('a')
438
443
rev_id = tree_a.commit('put some content in the branch')
439
444
# open the branch via a readonly transport
440
source_branch = _mod_branch.Branch.open(self.get_readonly_url('a'))
445
url = self.get_readonly_url(urlutils.basename(tree_a.branch.base))
446
t = transport.get_transport_from_url(url)
447
if not tree_a.branch.bzrdir._format.supports_transport(t):
448
raise tests.TestNotApplicable("format does not support transport")
449
source_branch = _mod_branch.Branch.open(url)
441
450
# sanity check that the test will be valid
442
451
self.assertRaises((errors.LockError, errors.TransportNotPossible),
443
452
source_branch.lock_write)
449
458
tree_a = self.make_branch_and_tree('a')
450
459
rev_id = tree_a.commit('put some content in the branch')
451
460
# open the branch via a readonly transport
452
source_branch = _mod_branch.Branch.open(self.get_readonly_url('a'))
461
url = self.get_readonly_url(
462
osutils.basename(tree_a.branch.base.rstrip('/')))
463
t = transport.get_transport_from_url(url)
464
if not tree_a.branch.bzrdir._format.supports_transport(t):
465
raise tests.TestNotApplicable("format does not support transport")
466
source_branch = _mod_branch.Branch.open(url)
453
467
# sanity check that the test will be valid
454
468
self.assertRaises((errors.LockError, errors.TransportNotPossible),
455
469
source_branch.lock_write)
463
477
self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
464
478
br.set_revision_history, ["rev1"])
465
self.assertEquals(br.revision_history(), ["rev1"])
479
self.assertEquals(br.last_revision(), "rev1")
466
480
self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
467
481
br.set_revision_history, [])
468
self.assertEquals(br.revision_history(), [])
482
self.assertEquals(br.last_revision(), 'null:')
470
484
def test_heads_to_fetch(self):
471
485
# heads_to_fetch is a method that returns a collection of revids that
531
551
_mod_branch.Branch.open_containing,
532
552
self.get_readonly_url('g/p/q'))
533
553
branch = self.make_branch('.')
554
if not branch.bzrdir._format.supports_transport(
555
transport.get_transport_from_url(self.get_readonly_url('.'))):
556
raise tests.TestNotApplicable("format does not support transport")
534
557
branch, relpath = _mod_branch.Branch.open_containing(
535
558
self.get_readonly_url(''))
536
559
self.assertEqual('', relpath)
835
860
def test_fallbacks_not_opened(self):
836
861
stacked = self.make_branch_with_fallback()
837
862
self.get_transport('').rename('fallback', 'moved')
838
reopened = stacked.bzrdir.open_branch(ignore_fallbacks=True)
863
reopened_dir = bzrdir.BzrDir.open(stacked.base)
864
reopened = reopened_dir.open_branch(ignore_fallbacks=True)
839
865
self.assertEqual([], reopened.repository._fallback_repositories)
841
867
def test_fallbacks_are_opened(self):
842
868
stacked = self.make_branch_with_fallback()
843
reopened = stacked.bzrdir.open_branch(ignore_fallbacks=False)
869
reopened_dir = bzrdir.BzrDir.open(stacked.base)
870
reopened = reopened_dir.open_branch(ignore_fallbacks=False)
844
871
self.assertLength(1, reopened.repository._fallback_repositories)