21
from bzrlib import uncommit, workingtree
21
from bzrlib import uncommit
22
22
from bzrlib.bzrdir import BzrDirMetaFormat1
23
from bzrlib.errors import BzrError, BoundBranchOutOfDate
23
from bzrlib.errors import BoundBranchOutOfDate
24
24
from bzrlib.tests import TestCaseWithTransport
25
from bzrlib.tests.matchers import ContainsNoVfsCalls
26
from bzrlib.tests.script import (
27
32
class TestUncommit(TestCaseWithTransport):
60
65
out, err = self.run_bzr('status')
61
66
self.assertEquals(out, 'modified:\n a\n')
68
def test_uncommit_interactive(self):
69
"""Uncommit seeks confirmation, and doesn't proceed without it."""
70
wt = self.create_simple_tree()
75
The above revision(s) will be removed.
76
2>Uncommit these revisions? ([y]es, [n]o): no
80
self.assertEqual(['a2'], wt.get_parent_ids())
63
82
def test_uncommit_no_history(self):
64
83
wt = self.make_branch_and_tree('tree')
65
84
out, err = self.run_bzr('uncommit --force', retcode=1)
101
120
t_a.commit('commit 3')
102
121
b = t_a.branch.create_checkout('b').branch
103
122
uncommit.uncommit(b)
104
self.assertEqual(len(b.revision_history()), 2)
105
self.assertEqual(len(t_a.branch.revision_history()), 2)
123
self.assertEqual(b.last_revision_info()[0], 2)
124
self.assertEqual(t_a.branch.last_revision_info()[0], 2)
106
125
# update A's tree to not have the uncommitted revision referenced.
108
127
t_a.commit('commit 3b')
216
235
def test_uncommit_shows_log_with_revision_id(self):
217
236
wt = self.create_simple_tree()
219
out, err = self.run_bzr('uncommit --force', working_dir='tree')
220
self.assertContainsRe(out, r'second commit')
221
self.assertContainsRe(err, r'You can restore the old tip by running')
222
self.assertContainsRe(err, r'bzr pull . -r revid:a2')
238
script = ScriptRunner()
239
script.run_script(self, """
241
$ bzr uncommit --force
245
The above revision(s) will be removed.
246
You can restore the old tip by running:
247
bzr pull . -r revid:a2
224
250
def test_uncommit_octopus_merge(self):
225
251
# Check that uncommit keeps the pending merges in the same order
233
259
tree3.commit('unchanged', rev_id='c3')
235
261
wt.merge_from_branch(tree2.branch)
236
wt.merge_from_branch(tree3.branch)
262
wt.merge_from_branch(tree3.branch, force=True)
237
263
wt.commit('merge b3, c3', rev_id='a3')
239
265
tree2.commit('unchanged', rev_id='b4')
240
266
tree3.commit('unchanged', rev_id='c4')
242
268
wt.merge_from_branch(tree3.branch)
243
wt.merge_from_branch(tree2.branch)
269
wt.merge_from_branch(tree2.branch, force=True)
244
270
wt.commit('merge b4, c4', rev_id='a4')
246
272
self.assertEqual(['a4'], wt.get_parent_ids())
255
281
tree.commit(u'\u1234 message')
256
282
out, err = self.run_bzr('uncommit --force tree', encoding='ascii')
257
283
self.assertContainsRe(out, r'\? message')
285
def test_uncommit_removes_tags(self):
286
tree = self.make_branch_and_tree('tree')
287
revid = tree.commit('message')
288
tree.branch.tags.set_tag("atag", revid)
289
out, err = self.run_bzr('uncommit --force tree')
290
self.assertEquals({}, tree.branch.tags.get_tag_dict())
292
def test_uncommit_keep_tags(self):
293
tree = self.make_branch_and_tree('tree')
294
revid = tree.commit('message')
295
tree.branch.tags.set_tag("atag", revid)
296
out, err = self.run_bzr('uncommit --keep-tags --force tree')
297
self.assertEquals({"atag": revid}, tree.branch.tags.get_tag_dict())
300
class TestSmartServerUncommit(TestCaseWithTransport):
302
def test_uncommit(self):
303
self.setup_smart_server_with_call_log()
304
t = self.make_branch_and_tree('from')
305
for count in range(2):
306
t.commit(message='commit %d' % count)
307
self.reset_smart_call_log()
308
out, err = self.run_bzr(['uncommit', '--force', self.get_url('from')])
309
# This figure represent the amount of work to perform this use case. It
310
# is entirely ok to reduce this number if a test fails due to rpc_count
311
# being too low. If rpc_count increases, more network roundtrips have
312
# become necessary for this use case. Please do not adjust this number
313
# upwards without agreement from bzr's network support maintainers.
314
self.assertLength(14, self.hpss_calls)
315
self.assertLength(1, self.hpss_connections)
316
self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
319
class TestInconsistentDelta(TestCaseWithTransport):
320
# See https://bugs.launchpad.net/bzr/+bug/855155
321
# See https://bugs.launchpad.net/bzr/+bug/1100385
322
# bzr uncommit may result in error
323
# 'An inconsistent delta was supplied involving'
325
def test_inconsistent_delta(self):
326
# Script taken from https://bugs.launchpad.net/bzr/+bug/855155/comments/26
327
wt = self.make_branch_and_tree('test')
328
self.build_tree(['test/a/', 'test/a/b', 'test/a/c'])
329
wt.add(['a', 'a/b', 'a/c'])
330
wt.commit('initial commit', rev_id='a1')
331
wt.remove(['a/b', 'a/c'])
332
wt.commit('remove b and c', rev_id='a2')
333
self.run_bzr("uncommit --force test")