123
def test_commit_lossy(self):
124
tree = self.make_branch_and_tree(".")
127
builder = tree.branch.get_commit_builder([], lossy=True)
128
list(builder.record_iter_changes(tree, tree.last_revision(),
129
tree.iter_changes(tree.basis_tree())))
130
builder.finish_inventory()
131
rev_id = builder.commit('foo bar blah')
134
rev = tree.branch.repository.get_revision(rev_id)
135
self.assertEqual('foo bar blah', rev.message)
114
137
def test_commit_message(self):
115
138
tree = self.make_branch_and_tree(".")
116
139
tree.lock_write()
118
141
builder = tree.branch.get_commit_builder([])
119
self.record_root(builder, tree)
142
list(builder.record_iter_changes(tree, tree.last_revision(),
143
tree.iter_changes(tree.basis_tree())))
120
144
builder.finish_inventory()
121
145
rev_id = builder.commit('foo bar blah')
273
324
# pointless commit.
274
325
self.assertFalse(builder.any_changes())
275
326
builder.finish_inventory()
276
new_root = tree.branch.repository.get_inventory(
277
builder._new_revision_id).root
328
builder_tree = builder.revision_tree()
329
new_root_id = builder_tree.get_root_id()
330
new_root_revision = builder_tree.get_file_revision(new_root_id)
278
331
if tree.branch.repository.supports_rich_root():
279
332
# We should not have seen a new root revision
280
self.assertEqual(old_revision_id, new_root.revision)
333
self.assertEqual(old_revision_id, new_root_revision)
282
335
# We should see a new root revision
283
self.assertNotEqual(old_revision_id, new_root.revision)
336
self.assertNotEqual(old_revision_id, new_root_revision)
288
def test_commit(self):
340
def test_commit_record_entry_contents(self):
289
341
tree = self.make_branch_and_tree(".")
290
342
tree.lock_write()
292
344
builder = tree.branch.get_commit_builder([])
345
if not builder.supports_record_entry_contents:
346
raise tests.TestNotApplicable("CommitBuilder doesn't "
347
"support record_entry_contents")
293
348
self.record_root(builder, tree)
294
349
builder.finish_inventory()
295
350
rev_id = builder.commit('foo bar')
372
430
basis = tree.branch.repository.revision_tree(rev_id)
373
431
builder = tree.branch.get_commit_builder([rev_id])
433
if not builder.supports_record_entry_contents:
434
raise tests.TestNotApplicable("CommitBuilder doesn't "
435
"support record_entry_contents")
375
436
builder.will_record_deletes()
376
437
if builder.record_root_entry is True:
377
parent_invs = [basis.inventory]
378
del basis.inventory.root.children['foo']
379
builder.record_entry_contents(basis.inventory.root,
438
parent_invs = [basis.root_inventory]
439
del basis.root_inventory.root.children['foo']
440
builder.record_entry_contents(basis.root_inventory.root,
380
441
parent_invs, '', tree, tree.path_content_summary(''))
381
442
# the delta should be returned, and recorded in _basis_delta
382
443
delta = builder.record_delete("foo", "foo-id")
383
444
self.assertEqual(("foo", None, "foo-id", None), delta)
384
self.assertEqual(delta, builder._basis_delta[-1])
445
self.assertEqual(delta, builder.get_basis_delta()[-1])
385
446
builder.finish_inventory()
386
447
rev_id2 = builder.commit('delete foo')
793
864
# record_entry_contents.
794
865
parent_ids = tree.get_parent_ids()
795
866
builder = tree.branch.get_commit_builder(parent_ids)
796
parent_tree = tree.basis_tree()
797
parent_tree.lock_read()
798
self.addCleanup(parent_tree.unlock)
799
parent_invs = [parent_tree.inventory]
800
for parent_id in parent_ids[1:]:
801
parent_invs.append(tree.branch.repository.revision_tree(
802
parent_id).inventory)
804
builder.record_entry_contents(
805
inventory.make_entry('directory', '', None,
806
tree.get_root_id()), parent_invs, '', tree,
807
tree.path_content_summary(''))
808
def commit_id(file_id):
809
old_ie = tree.inventory[file_id]
810
path = tree.id2path(file_id)
811
ie = inventory.make_entry(tree.kind(file_id), old_ie.name,
812
old_ie.parent_id, file_id)
813
content_summary = tree.path_content_summary(path)
814
if content_summary[0] == 'tree-reference':
815
content_summary = content_summary[:3] + (
816
tree.get_reference_revision(file_id),)
817
return builder.record_entry_contents(ie, parent_invs, path,
818
tree, content_summary)
868
if not builder.supports_record_entry_contents:
869
raise tests.TestNotApplicable("CommitBuilder doesn't "
870
"support record_entry_contents")
871
builder.will_record_deletes()
872
parent_tree = tree.basis_tree()
873
parent_tree.lock_read()
874
self.addCleanup(parent_tree.unlock)
875
parent_invs = [parent_tree.root_inventory]
876
for parent_id in parent_ids[1:]:
877
parent_invs.append(tree.branch.repository.revision_tree(
878
parent_id).root_inventory)
880
builder.record_entry_contents(
881
inventory.make_entry('directory', '', None,
882
tree.get_root_id()), parent_invs, '', tree,
883
tree.path_content_summary(''))
884
def commit_id(file_id):
885
old_ie = tree.root_inventory[file_id]
886
path = tree.id2path(file_id)
887
ie = inventory.make_entry(tree.kind(file_id), old_ie.name,
888
old_ie.parent_id, file_id)
889
content_summary = tree.path_content_summary(path)
890
if content_summary[0] == 'tree-reference':
891
content_summary = content_summary[:3] + (
892
tree.get_reference_revision(file_id),)
893
return builder.record_entry_contents(ie, parent_invs, path,
894
tree, content_summary)
820
file_id = tree.path2id(new_name)
821
parent_id = tree.inventory[file_id].parent_id
822
if parent_id != tree.get_root_id():
824
# because a change of some sort is meant to have occurred,
825
# recording the entry must return True.
826
delta, version_recorded, fs_hash = commit_id(file_id)
828
self.assertTrue(version_recorded)
830
self.assertFalse(version_recorded)
832
tree_file_stat = tree.get_file_with_stat(file_id)
833
tree_file_stat[0].close()
834
self.assertEqual(2, len(fs_hash))
835
self.assertEqual(tree.get_file_sha1(file_id), fs_hash[0])
836
self.assertEqualStat(tree_file_stat[1], fs_hash[1])
838
self.assertEqual(None, fs_hash)
839
new_entry = builder.new_inventory[file_id]
840
if delta_against_basis:
841
expected_delta = (name, new_name, file_id, new_entry)
842
# The delta should be recorded
843
self.assertEqual(expected_delta, builder._basis_delta[-1])
845
expected_delta = None
846
self.assertEqual(expected_delta, delta)
847
builder.finish_inventory()
848
rev2 = builder.commit('')
896
file_id = tree.path2id(new_name)
897
parent_id = tree.root_inventory[file_id].parent_id
898
if parent_id != tree.get_root_id():
900
# because a change of some sort is meant to have occurred,
901
# recording the entry must return True.
902
delta, version_recorded, fs_hash = commit_id(file_id)
904
self.assertTrue(version_recorded)
906
self.assertFalse(version_recorded)
908
tree_file_stat = tree.get_file_with_stat(file_id)
909
tree_file_stat[0].close()
910
self.assertEqual(2, len(fs_hash))
911
self.assertEqual(tree.get_file_sha1(file_id), fs_hash[0])
912
self.assertEqualStat(tree_file_stat[1], fs_hash[1])
914
self.assertEqual(None, fs_hash)
915
new_entry = builder.new_inventory[file_id]
916
if delta_against_basis:
917
expected_delta = (name, new_name, file_id, new_entry)
918
# The delta should be recorded
919
self.assertEqual(expected_delta,
920
builder.get_basis_delta()[-1])
922
expected_delta = None
923
self.assertEqual(expected_delta, delta)
924
builder.finish_inventory()
929
rev2 = builder.commit('')
899
980
self.assertEqualStat(result[2][1], tree_file_stat[1])
901
982
self.assertEqual([], result)
902
delta = builder._basis_delta
983
self.assertIs(None, builder.new_inventory)
984
builder.finish_inventory()
985
if tree.branch.repository._format.supports_full_versioned_files:
986
inv_key = (builder._new_revision_id,)
987
inv_sha1 = tree.branch.repository.inventories.get_sha1s(
989
self.assertEqual(inv_sha1, builder.inv_sha1)
990
self.assertIs(None, builder.new_inventory)
991
rev2 = builder.commit('')
992
delta = builder.get_basis_delta()
903
993
delta_dict = dict((change[2], change) for change in delta)
904
994
version_recorded = (file_id in delta_dict and
905
995
delta_dict[file_id][3] is not None and
906
delta_dict[file_id][3].revision == builder._new_revision_id)
996
delta_dict[file_id][3].revision == rev2)
907
997
if records_version:
908
998
self.assertTrue(version_recorded)
910
1000
self.assertFalse(version_recorded)
911
self.assertIs(None, builder.new_inventory)
912
builder.finish_inventory()
913
inv_key = (builder._new_revision_id,)
914
inv_sha1 = tree.branch.repository.inventories.get_sha1s(
916
self.assertEqual(inv_sha1, builder.inv_sha1)
917
self.assertIs(None, builder.new_inventory)
918
new_inventory = builder.revision_tree().inventory
1002
new_inventory = builder.revision_tree().root_inventory
919
1003
new_entry = new_inventory[file_id]
920
1004
if delta_against_basis:
921
1005
expected_delta = (name, new_name, file_id, new_entry)
1229
1315
expect_fs_hash=True)
1231
1317
def test_last_modified_dir_file_ric(self):
1232
self._check_kind_change(self.make_dir, self.make_file,
1233
expect_fs_hash=True,
1234
mini_commit=self.mini_commit_record_iter_changes)
1319
self._check_kind_change(self.make_dir, self.make_file,
1320
expect_fs_hash=True,
1321
mini_commit=self.mini_commit_record_iter_changes)
1322
except errors.UnsupportedKindChange:
1323
raise tests.TestSkipped(
1324
"tree does not support changing entry kind from "
1325
"directory to file")
1236
1327
def test_last_modified_dir_link(self):
1237
1328
self._check_kind_change(self.make_dir, self.make_link)
1239
1330
def test_last_modified_dir_link_ric(self):
1240
self._check_kind_change(self.make_dir, self.make_link,
1241
mini_commit=self.mini_commit_record_iter_changes)
1332
self._check_kind_change(self.make_dir, self.make_link,
1333
mini_commit=self.mini_commit_record_iter_changes)
1334
except errors.UnsupportedKindChange:
1335
raise tests.TestSkipped(
1336
"tree does not support changing entry kind from "
1337
"directory to link")
1243
1339
def test_last_modified_link_file(self):
1244
1340
self._check_kind_change(self.make_link, self.make_file,
1283
1379
branch.repository.lock_write()
1284
1380
self.addCleanup(branch.repository.unlock)
1285
1381
builder = branch.repository.get_commit_builder(branch, [],
1286
branch.get_config())
1382
branch.get_config_stack())
1287
1383
self.addCleanup(branch.repository.abort_write_group)
1288
1384
self.assertRaises(ValueError, builder.commit,
1289
1385
u'Invalid\r\ncommit message\r\n')
1387
def test_non_ascii_str_committer_rejected(self):
1388
"""Ensure an error is raised on a non-ascii byte string committer"""
1389
branch = self.make_branch('.')
1390
branch.repository.lock_write()
1391
self.addCleanup(branch.repository.unlock)
1392
self.assertRaises(UnicodeDecodeError,
1393
branch.repository.get_commit_builder,
1394
branch, [], branch.get_config_stack(),
1395
committer="Erik B\xe5gfors <erik@example.com>")
1291
1397
def test_stacked_repositories_reject_commit_builder(self):
1292
1398
# As per bug 375013, committing to stacked repositories is currently
1293
# broken, so repositories with fallbacks refuse to hand out a commit
1399
# broken if we aren't in a chk repository. So old repositories with
1400
# fallbacks refuse to hand out a commit builder.
1295
1401
repo_basis = self.make_repository('basis')
1296
1402
branch = self.make_branch('local')
1297
1403
repo_local = branch.repository
1299
1405
repo_local.add_fallback_repository(repo_basis)
1300
1406
except errors.UnstackableRepositoryFormat:
1301
1407
raise tests.TestNotApplicable("not a stackable format.")
1302
repo_local.lock_write()
1303
self.addCleanup(repo_local.unlock)
1304
self.assertRaises(errors.BzrError, repo_local.get_commit_builder,
1305
branch, [], branch.get_config())
1408
self.addCleanup(repo_local.lock_write().unlock)
1409
if not repo_local._format.supports_chks:
1410
self.assertRaises(errors.BzrError, repo_local.get_commit_builder,
1411
branch, [], branch.get_config_stack())
1413
builder = repo_local.get_commit_builder(branch, [],
1414
branch.get_config_stack())
1307
1417
def test_committer_no_username(self):
1308
1418
# Ensure that when no username is available but a committer is
1309
1419
# supplied, commit works.
1310
del os.environ['EMAIL']
1420
self.overrideEnv('EMAIL', None)
1421
self.overrideEnv('BZR_EMAIL', None)
1422
# Also, make sure that it's not inferred from mailname.
1423
self.overrideAttr(config, '_auto_user_id',
1424
lambda: (None, None))
1311
1425
tree = self.make_branch_and_tree(".")
1312
1426
tree.lock_write()