1
# Copyright (C) 2005-2011 Canonical Ltd
1
# Copyright (C) 2005, 2006, 2008 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
21
21
from bzrlib import (
25
28
from bzrlib.branch import Branch
26
from bzrlib.bzrdir import BzrDirMetaFormat1
29
from bzrlib.bzrdir import BzrDir, BzrDirMetaFormat1
27
30
from bzrlib.commit import Commit, NullCommitReporter
28
31
from bzrlib.config import BranchConfig
29
from bzrlib.errors import (
35
from bzrlib.tests import (
37
TestCaseWithTransport,
40
from bzrlib.tests.matchers import MatchesAncestry
32
from bzrlib.errors import (PointlessCommit, BzrError, SigningFailed,
34
from bzrlib.tests import SymlinkFeature, TestCaseWithTransport
35
from bzrlib.workingtree import WorkingTree
43
38
# TODO: Test commit with some added, and added-but-missing files
113
108
self.assertEqual('version 2', text)
115
def test_commit_lossy_native(self):
116
"""Attempt a lossy commit to a native branch."""
117
wt = self.make_branch_and_tree('.')
119
file('hello', 'w').write('hello world')
121
revid = wt.commit(message='add hello', rev_id='revid', lossy=True)
122
self.assertEquals('revid', revid)
124
def test_commit_lossy_foreign(self):
125
"""Attempt a lossy commit to a foreign branch."""
126
test_foreign.register_dummy_foreign_for_test(self)
127
wt = self.make_branch_and_tree('.',
128
format=test_foreign.DummyForeignVcsDirFormat())
130
file('hello', 'w').write('hello world')
132
revid = wt.commit(message='add hello', lossy=True,
133
timestamp=1302659388, timezone=0)
134
self.assertEquals('dummy-v1:1302659388.0-0-UNKNOWN', revid)
136
def test_commit_bound_lossy_foreign(self):
137
"""Attempt a lossy commit to a bzr branch bound to a foreign branch."""
138
test_foreign.register_dummy_foreign_for_test(self)
139
foreign_branch = self.make_branch('foreign',
140
format=test_foreign.DummyForeignVcsDirFormat())
141
wt = foreign_branch.create_checkout("local")
143
file('local/hello', 'w').write('hello world')
145
revid = wt.commit(message='add hello', lossy=True,
146
timestamp=1302659388, timezone=0)
147
self.assertEquals('dummy-v1:1302659388.0-0-0', revid)
148
self.assertEquals('dummy-v1:1302659388.0-0-0',
149
foreign_branch.last_revision())
150
self.assertEquals('dummy-v1:1302659388.0-0-0',
151
wt.branch.last_revision())
153
110
def test_missing_commit(self):
154
111
"""Test a commit with a missing file"""
155
112
wt = self.make_branch_and_tree('.')
267
224
eq(tree1.id2path('hello-id'), 'hello')
268
225
eq(tree1.get_file_text('hello-id'), 'contents of hello\n')
269
226
self.assertFalse(tree1.has_filename('fruity'))
270
self.check_tree_shape(tree1, ['hello'])
271
eq(tree1.get_file_revision('hello-id'), 'test@rev-1')
227
self.check_inventory_shape(tree1.inventory, ['hello'])
228
ie = tree1.inventory['hello-id']
229
eq(ie.revision, 'test@rev-1')
273
231
tree2 = b.repository.revision_tree('test@rev-2')
274
232
tree2.lock_read()
275
233
self.addCleanup(tree2.unlock)
276
234
eq(tree2.id2path('hello-id'), 'fruity')
277
235
eq(tree2.get_file_text('hello-id'), 'contents of hello\n')
278
self.check_tree_shape(tree2, ['fruity'])
279
eq(tree2.get_file_revision('hello-id'), 'test@rev-2')
236
self.check_inventory_shape(tree2.inventory, ['fruity'])
237
ie = tree2.inventory['hello-id']
238
eq(ie.revision, 'test@rev-2')
281
240
def test_reused_rev_id(self):
282
241
"""Test that a revision id cannot be reused in a branch"""
303
262
wt.commit('two', rev_id=r2, allow_pointless=False)
306
self.check_tree_shape(wt, ['a/', 'a/hello', 'b/'])
265
self.check_inventory_shape(wt.read_working_inventory(),
266
['a/', 'a/hello', 'b/'])
312
272
wt.commit('three', rev_id=r3, allow_pointless=False)
315
self.check_tree_shape(wt,
275
self.check_inventory_shape(wt.read_working_inventory(),
316
276
['a/', 'a/hello', 'a/b/'])
317
self.check_tree_shape(b.repository.revision_tree(r3),
277
self.check_inventory_shape(b.repository.get_revision_inventory(r3),
318
278
['a/', 'a/hello', 'a/b/'])
324
284
wt.commit('four', rev_id=r4, allow_pointless=False)
327
self.check_tree_shape(wt, ['a/', 'a/b/hello', 'a/b/'])
287
self.check_inventory_shape(wt.read_working_inventory(),
288
['a/', 'a/b/hello', 'a/b/'])
331
inv = b.repository.get_inventory(r4)
292
inv = b.repository.get_revision_inventory(r4)
332
293
eq(inv['hello-id'].revision, r4)
333
294
eq(inv['a-id'].revision, r1)
334
295
eq(inv['b-id'].revision, r3)
362
323
eq = self.assertEquals
363
324
eq(b.revision_history(), rev_ids)
364
325
for i in range(4):
365
self.assertThat(rev_ids[:i+1],
366
MatchesAncestry(b.repository, rev_ids[i]))
326
anc = b.repository.get_ancestry(rev_ids[i])
327
eq(anc, [None] + rev_ids[:i+1])
368
329
def test_commit_new_subdir_child_selective(self):
369
330
wt = self.make_branch_and_tree('.')
392
353
def test_strict_commit_without_unknowns(self):
393
354
"""Try and commit with no unknown files and strict = True,
356
from bzrlib.errors import StrictCommitFailed
395
357
wt = self.make_branch_and_tree('.')
397
359
file('hello', 'w').write('hello world')
423
385
wt = self.make_branch_and_tree('.')
424
386
branch = wt.branch
425
387
wt.commit("base", allow_pointless=True, rev_id='A')
426
self.assertFalse(branch.repository.has_signature_for_revision_id('A'))
388
self.failIf(branch.repository.has_signature_for_revision_id('A'))
428
390
from bzrlib.testament import Testament
429
391
# monkey patch gpg signing mechanism
447
409
wt = self.make_branch_and_tree('.')
448
410
branch = wt.branch
449
411
wt.commit("base", allow_pointless=True, rev_id='A')
450
self.assertFalse(branch.repository.has_signature_for_revision_id('A'))
412
self.failIf(branch.repository.has_signature_for_revision_id('A'))
414
from bzrlib.testament import Testament
452
415
# monkey patch gpg signing mechanism
453
416
bzrlib.gpg.GPGStrategy = bzrlib.gpg.DisabledGPGStrategy
454
417
config = MustSignConfig(branch)
461
424
branch = Branch.open(self.get_url('.'))
462
425
self.assertEqual(branch.revision_history(), ['A'])
463
self.assertFalse(branch.repository.has_revision('B'))
426
self.failIf(branch.repository.has_revision('B'))
465
428
bzrlib.gpg.GPGStrategy = oldstrategy