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 (
36
TestCaseWithTransport,
39
from bzrlib.tests.features import (
42
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
45
38
# TODO: Test commit with some added, and added-but-missing files
115
108
self.assertEqual('version 2', text)
117
def test_commit_lossy_native(self):
118
"""Attempt a lossy commit to a native branch."""
119
wt = self.make_branch_and_tree('.')
121
file('hello', 'w').write('hello world')
123
revid = wt.commit(message='add hello', rev_id='revid', lossy=True)
124
self.assertEquals('revid', revid)
126
def test_commit_lossy_foreign(self):
127
"""Attempt a lossy commit to a foreign branch."""
128
test_foreign.register_dummy_foreign_for_test(self)
129
wt = self.make_branch_and_tree('.',
130
format=test_foreign.DummyForeignVcsDirFormat())
132
file('hello', 'w').write('hello world')
134
revid = wt.commit(message='add hello', lossy=True,
135
timestamp=1302659388, timezone=0)
136
self.assertEquals('dummy-v1:1302659388.0-0-UNKNOWN', revid)
138
def test_commit_bound_lossy_foreign(self):
139
"""Attempt a lossy commit to a bzr branch bound to a foreign branch."""
140
test_foreign.register_dummy_foreign_for_test(self)
141
foreign_branch = self.make_branch('foreign',
142
format=test_foreign.DummyForeignVcsDirFormat())
143
wt = foreign_branch.create_checkout("local")
145
file('local/hello', 'w').write('hello world')
147
revid = wt.commit(message='add hello', lossy=True,
148
timestamp=1302659388, timezone=0)
149
self.assertEquals('dummy-v1:1302659388.0-0-0', revid)
150
self.assertEquals('dummy-v1:1302659388.0-0-0',
151
foreign_branch.last_revision())
152
self.assertEquals('dummy-v1:1302659388.0-0-0',
153
wt.branch.last_revision())
155
110
def test_missing_commit(self):
156
111
"""Test a commit with a missing file"""
157
112
wt = self.make_branch_and_tree('.')
161
116
wt.commit(message='add hello')
163
118
os.remove('hello')
164
reporter = CapturingReporter()
165
wt.commit('removed hello', rev_id='rev2', reporter=reporter)
167
[('missing', u'hello'), ('deleted', u'hello')],
119
wt.commit('removed hello', rev_id='rev2')
170
121
tree = b.repository.revision_tree('rev2')
171
122
self.assertFalse(tree.has_id('hello-id'))
273
224
eq(tree1.id2path('hello-id'), 'hello')
274
225
eq(tree1.get_file_text('hello-id'), 'contents of hello\n')
275
226
self.assertFalse(tree1.has_filename('fruity'))
276
self.check_tree_shape(tree1, ['hello'])
277
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')
279
231
tree2 = b.repository.revision_tree('test@rev-2')
280
232
tree2.lock_read()
281
233
self.addCleanup(tree2.unlock)
282
234
eq(tree2.id2path('hello-id'), 'fruity')
283
235
eq(tree2.get_file_text('hello-id'), 'contents of hello\n')
284
self.check_tree_shape(tree2, ['fruity'])
285
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')
287
240
def test_reused_rev_id(self):
288
241
"""Test that a revision id cannot be reused in a branch"""
309
262
wt.commit('two', rev_id=r2, allow_pointless=False)
312
self.check_tree_shape(wt, ['a/', 'a/hello', 'b/'])
265
self.check_inventory_shape(wt.read_working_inventory(),
266
['a/', 'a/hello', 'b/'])
318
272
wt.commit('three', rev_id=r3, allow_pointless=False)
321
self.check_tree_shape(wt,
275
self.check_inventory_shape(wt.read_working_inventory(),
322
276
['a/', 'a/hello', 'a/b/'])
323
self.check_tree_shape(b.repository.revision_tree(r3),
277
self.check_inventory_shape(b.repository.get_revision_inventory(r3),
324
278
['a/', 'a/hello', 'a/b/'])
330
284
wt.commit('four', rev_id=r4, allow_pointless=False)
333
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/'])
337
inv = b.repository.get_inventory(r4)
292
inv = b.repository.get_revision_inventory(r4)
338
293
eq(inv['hello-id'].revision, r4)
339
294
eq(inv['a-id'].revision, r1)
340
295
eq(inv['b-id'].revision, r3)
368
323
eq = self.assertEquals
369
324
eq(b.revision_history(), rev_ids)
370
325
for i in range(4):
371
self.assertThat(rev_ids[:i+1],
372
MatchesAncestry(b.repository, rev_ids[i]))
326
anc = b.repository.get_ancestry(rev_ids[i])
327
eq(anc, [None] + rev_ids[:i+1])
374
329
def test_commit_new_subdir_child_selective(self):
375
330
wt = self.make_branch_and_tree('.')
398
353
def test_strict_commit_without_unknowns(self):
399
354
"""Try and commit with no unknown files and strict = True,
356
from bzrlib.errors import StrictCommitFailed
401
357
wt = self.make_branch_and_tree('.')
403
359
file('hello', 'w').write('hello world')
429
385
wt = self.make_branch_and_tree('.')
430
386
branch = wt.branch
431
387
wt.commit("base", allow_pointless=True, rev_id='A')
432
self.assertFalse(branch.repository.has_signature_for_revision_id('A'))
388
self.failIf(branch.repository.has_signature_for_revision_id('A'))
434
390
from bzrlib.testament import Testament
435
391
# monkey patch gpg signing mechanism
453
409
wt = self.make_branch_and_tree('.')
454
410
branch = wt.branch
455
411
wt.commit("base", allow_pointless=True, rev_id='A')
456
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
458
415
# monkey patch gpg signing mechanism
459
416
bzrlib.gpg.GPGStrategy = bzrlib.gpg.DisabledGPGStrategy
460
417
config = MustSignConfig(branch)
467
424
branch = Branch.open(self.get_url('.'))
468
425
self.assertEqual(branch.revision_history(), ['A'])
469
self.assertFalse(branch.repository.has_revision('B'))
426
self.failIf(branch.repository.has_revision('B'))
471
428
bzrlib.gpg.GPGStrategy = oldstrategy