1
# Copyright (C) 2005, 2006 by Canonical Ltd
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
"""Test the uncommit command."""
21
from bzrlib import uncommit, workingtree
22
from bzrlib.bzrdir import BzrDirMetaFormat1
23
from bzrlib.errors import BzrError, BoundBranchOutOfDate
24
from bzrlib.tests import TestCaseWithTransport
27
class TestUncommit(TestCaseWithTransport):
29
def create_simple_tree(self):
30
wt = self.make_branch_and_tree('tree')
31
self.build_tree(['tree/a', 'tree/b', 'tree/c'])
32
wt.add(['a', 'b', 'c'])
33
wt.commit('initial commit', rev_id='a1')
35
open('tree/a', 'wb').write('new contents of a\n')
36
wt.commit('second commit', rev_id='a2')
40
def test_uncommit(self):
41
"""Test uncommit functionality."""
42
wt = self.create_simple_tree()
45
out, err = self.run_bzr('uncommit', '--dry-run', '--force')
46
self.assertContainsRe(out, 'Dry-run')
47
self.assertNotContainsRe(out, 'initial commit')
48
self.assertContainsRe(out, 'second commit')
51
self.assertEqual('a2', wt.last_revision())
53
# Uncommit, don't prompt
54
out, err = self.run_bzr('uncommit', '--force')
55
self.assertNotContainsRe(out, 'initial commit')
56
self.assertContainsRe(out, 'second commit')
58
# This should look like we are back in revno 1
59
self.assertEqual('a1', wt.last_revision())
60
out, err = self.run_bzr('status')
61
self.assertEquals(out, 'modified:\n a\n')
63
def test_uncommit_checkout(self):
64
wt = self.create_simple_tree()
66
checkout_tree = wt.bzrdir.sprout('checkout').open_workingtree()
67
checkout_tree.branch.bind(wt.branch)
69
self.assertEqual('a2', checkout_tree.last_revision())
72
out, err = self.run_bzr('uncommit', '--dry-run', '--force')
73
self.assertContainsRe(out, 'Dry-run')
74
self.assertNotContainsRe(out, 'initial commit')
75
self.assertContainsRe(out, 'second commit')
77
self.assertEqual('a2', checkout_tree.last_revision())
79
out, err = self.run_bzr('uncommit', '--force')
80
self.assertNotContainsRe(out, 'initial commit')
81
self.assertContainsRe(out, 'second commit')
83
# uncommit in a checkout should uncommit the parent branch
84
# (but doesn't effect the other working tree)
85
self.assertEquals('a1', checkout_tree.last_revision())
86
self.assertEquals('a1', wt.branch.last_revision())
87
self.assertEquals('a2', wt.last_revision())
89
def test_uncommit_bound(self):
91
a = BzrDirMetaFormat1().initialize('a')
94
t = a.create_workingtree()
98
b = t.bzrdir.sprout('b').open_branch()
101
t.set_last_revision(t.branch.last_revision())
102
self.assertEqual(len(b.revision_history()), 2)
103
self.assertEqual(len(t.branch.revision_history()), 2)
104
t.commit('commit 3b')
105
self.assertRaises(BoundBranchOutOfDate, uncommit.uncommit, b)
109
def test_uncommit_revision(self):
110
wt = self.create_simple_tree()
113
out, err = self.run_bzr('uncommit', '-r1', '--force')
115
self.assertNotContainsRe(out, 'initial commit')
116
self.assertContainsRe(out, 'second commit')
117
self.assertEqual('a1', wt.last_revision())
118
self.assertEqual('a1', wt.branch.last_revision())
120
def test_uncommit_neg_1(self):
121
wt = self.create_simple_tree()
123
out, err = self.run_bzr('uncommit', '-r', '-1', retcode=1)
124
self.assertEqual('No revisions to uncommit.\n', out)
126
def test_uncommit_merges(self):
127
wt = self.create_simple_tree()
129
tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
131
tree2.commit('unchanged', rev_id='b3')
132
tree2.commit('unchanged', rev_id='b4')
134
wt.branch.fetch(tree2.branch)
135
wt.set_pending_merges(['b4'])
136
wt.commit('merge b4', rev_id='a3')
138
self.assertEqual('a3', wt.last_revision())
139
self.assertEqual([], wt.pending_merges())
142
out, err = self.run_bzr('uncommit', '--force')
144
self.assertEqual('a2', wt.last_revision())
145
self.assertEqual(['b4'], wt.pending_merges())
147
def test_uncommit_pending_merge(self):
148
wt = self.create_simple_tree()
149
tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
150
tree2.commit('unchanged', rev_id='b3')
152
wt.branch.fetch(tree2.branch)
153
wt.set_pending_merges(['b3'])
156
out, err = self.run_bzr('uncommit', '--force')
157
self.assertEqual('a1', wt.last_revision())
158
self.assertEqual(['b3'], wt.pending_merges())
160
def test_uncommit_multiple_merge(self):
161
wt = self.create_simple_tree()
163
tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
165
tree2.commit('unchanged', rev_id='b3')
166
wt.branch.fetch(tree2.branch)
167
wt.set_pending_merges(['b3'])
168
wt.commit('merge b3', rev_id='a3')
170
tree2.commit('unchanged', rev_id='b4')
171
wt.branch.fetch(tree2.branch)
172
wt.set_pending_merges(['b4'])
173
wt.commit('merge b4', rev_id='a4')
175
self.assertEqual('a4', wt.last_revision())
176
self.assertEqual([], wt.pending_merges())
179
out, err = self.run_bzr('uncommit', '--force', '-r', '2')
181
self.assertEqual('a2', wt.last_revision())
182
self.assertEqual(['b3', 'b4'], wt.pending_merges())
184
def test_uncommit_merge_plus_pending(self):
185
wt = self.create_simple_tree()
187
tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
189
tree2.commit('unchanged', rev_id='b3')
190
wt.branch.fetch(tree2.branch)
191
wt.set_pending_merges(['b3'])
192
wt.commit('merge b3', rev_id='a3')
194
tree2.commit('unchanged', rev_id='b4')
195
wt.branch.fetch(tree2.branch)
196
wt.set_pending_merges(['b4'])
198
self.assertEqual('a3', wt.last_revision())
199
self.assertEqual(['b4'], wt.pending_merges())
202
out, err = self.run_bzr('uncommit', '--force', '-r', '2')
204
self.assertEqual('a2', wt.last_revision())
205
self.assertEqual(['b3', 'b4'], wt.pending_merges())
207
def test_uncommit_octopus_merge(self):
208
# Check that uncommit keeps the pending merges in the same order
209
wt = self.create_simple_tree()
211
tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
212
tree3 = wt.bzrdir.sprout('tree3').open_workingtree()
214
tree2.commit('unchanged', rev_id='b3')
215
tree3.commit('unchanged', rev_id='c3')
216
wt.branch.fetch(tree2.branch)
217
wt.branch.fetch(tree3.branch)
218
wt.set_pending_merges(['b3', 'c3'])
219
wt.commit('merge b3, c3', rev_id='a3')
221
tree2.commit('unchanged', rev_id='b4')
222
tree3.commit('unchanged', rev_id='c4')
223
wt.branch.fetch(tree2.branch)
224
wt.branch.fetch(tree3.branch)
225
wt.set_pending_merges(['c4', 'b4'])
226
wt.commit('merge b4, c4', rev_id='a4')
228
self.assertEqual('a4', wt.last_revision())
229
self.assertEqual([], wt.pending_merges())
232
out, err = self.run_bzr('uncommit', '--force', '-r', '2')
234
self.assertEqual('a2', wt.last_revision())
235
self.assertEqual(['b3', 'c3', 'c4', 'b4'], wt.pending_merges())