/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/tests/blackbox/test_uncommit.py

  • Committer: Jelmer Vernooij
  • Date: 2018-07-08 14:45:27 UTC
  • mto: This revision was merged to the branch mainline in revision 7036.
  • Revision ID: jelmer@jelmer.uk-20180708144527-codhlvdcdg9y0nji
Fix a bunch of merge tests.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2005-2011, 2013, 2016 Canonical Ltd
2
2
#
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
18
18
 
19
19
import os
20
20
 
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
25
 
from bzrlib.tests.script import ScriptRunner
 
21
from breezy import uncommit
 
22
from breezy.bzr.bzrdir import BzrDirMetaFormat1
 
23
from breezy.errors import BoundBranchOutOfDate
 
24
from breezy.tests import TestCaseWithTransport
 
25
from breezy.tests.matchers import ContainsNoVfsCalls
 
26
from breezy.tests.script import (
 
27
    run_script,
 
28
    ScriptRunner,
 
29
    )
26
30
 
27
31
 
28
32
class TestUncommit(TestCaseWithTransport):
31
35
        wt = self.make_branch_and_tree('tree')
32
36
        self.build_tree(['tree/a', 'tree/b', 'tree/c'])
33
37
        wt.add(['a', 'b', 'c'])
34
 
        wt.commit('initial commit', rev_id='a1')
 
38
        wt.commit('initial commit', rev_id=b'a1')
35
39
 
36
 
        self.build_tree_contents([('tree/a', 'new contents of a\n')])
37
 
        wt.commit('second commit', rev_id='a2')
 
40
        self.build_tree_contents([('tree/a', b'new contents of a\n')])
 
41
        wt.commit('second commit', rev_id=b'a2')
38
42
 
39
43
        return wt
40
44
 
44
48
 
45
49
        os.chdir('tree')
46
50
        out, err = self.run_bzr('uncommit --dry-run --force')
47
 
        self.assertContainsRe(out, 'Dry-run')
48
 
        self.assertNotContainsRe(out, 'initial commit')
49
 
        self.assertContainsRe(out, 'second commit')
 
51
        self.assertContainsRe(out, b'Dry-run')
 
52
        self.assertNotContainsRe(out, b'initial commit')
 
53
        self.assertContainsRe(out, b'second commit')
50
54
 
51
55
        # Nothing has changed
52
 
        self.assertEqual(['a2'], wt.get_parent_ids())
 
56
        self.assertEqual([b'a2'], wt.get_parent_ids())
53
57
 
54
58
        # Uncommit, don't prompt
55
59
        out, err = self.run_bzr('uncommit --force')
56
 
        self.assertNotContainsRe(out, 'initial commit')
57
 
        self.assertContainsRe(out, 'second commit')
 
60
        self.assertNotContainsRe(out, b'initial commit')
 
61
        self.assertContainsRe(out, b'second commit')
58
62
 
59
63
        # This should look like we are back in revno 1
60
 
        self.assertEqual(['a1'], wt.get_parent_ids())
 
64
        self.assertEqual([b'a1'], wt.get_parent_ids())
61
65
        out, err = self.run_bzr('status')
62
 
        self.assertEquals(out, 'modified:\n  a\n')
 
66
        self.assertEqual(out, b'modified:\n  a\n')
 
67
 
 
68
    def test_uncommit_interactive(self):
 
69
        """Uncommit seeks confirmation, and doesn't proceed without it."""
 
70
        wt = self.create_simple_tree()
 
71
        os.chdir('tree')
 
72
        run_script(self, """
 
73
        $ brz uncommit
 
74
        ...
 
75
        The above revision(s) will be removed.
 
76
        2>Uncommit these revisions? ([y]es, [n]o): no
 
77
        <n
 
78
        Canceled
 
79
        """)
 
80
        self.assertEqual([b'a2'], wt.get_parent_ids())
63
81
 
64
82
    def test_uncommit_no_history(self):
65
83
        wt = self.make_branch_and_tree('tree')
66
84
        out, err = self.run_bzr('uncommit --force', retcode=1)
67
 
        self.assertEqual('', err)
68
 
        self.assertEqual('No revisions to uncommit.\n', out)
 
85
        self.assertEqual(b'', err)
 
86
        self.assertEqual(b'No revisions to uncommit.\n', out)
69
87
 
70
88
    def test_uncommit_checkout(self):
71
89
        wt = self.create_simple_tree()
72
90
        checkout_tree = wt.branch.create_checkout('checkout')
73
91
 
74
 
        self.assertEqual(['a2'], checkout_tree.get_parent_ids())
 
92
        self.assertEqual([b'a2'], checkout_tree.get_parent_ids())
75
93
 
76
94
        os.chdir('checkout')
77
95
        out, err = self.run_bzr('uncommit --dry-run --force')
78
 
        self.assertContainsRe(out, 'Dry-run')
79
 
        self.assertNotContainsRe(out, 'initial commit')
80
 
        self.assertContainsRe(out, 'second commit')
 
96
        self.assertContainsRe(out, b'Dry-run')
 
97
        self.assertNotContainsRe(out, b'initial commit')
 
98
        self.assertContainsRe(out, b'second commit')
81
99
 
82
 
        self.assertEqual(['a2'], checkout_tree.get_parent_ids())
 
100
        self.assertEqual([b'a2'], checkout_tree.get_parent_ids())
83
101
 
84
102
        out, err = self.run_bzr('uncommit --force')
85
 
        self.assertNotContainsRe(out, 'initial commit')
86
 
        self.assertContainsRe(out, 'second commit')
 
103
        self.assertNotContainsRe(out, b'initial commit')
 
104
        self.assertContainsRe(out, b'second commit')
87
105
 
88
106
        # uncommit in a checkout should uncommit the parent branch
89
107
        # (but doesn't effect the other working tree)
90
 
        self.assertEquals(['a1'], checkout_tree.get_parent_ids())
91
 
        self.assertEquals('a1', wt.branch.last_revision())
92
 
        self.assertEquals(['a2'], wt.get_parent_ids())
 
108
        self.assertEqual([b'a1'], checkout_tree.get_parent_ids())
 
109
        self.assertEqual('a1', wt.branch.last_revision())
 
110
        self.assertEqual([b'a2'], wt.get_parent_ids())
93
111
 
94
112
    def test_uncommit_bound(self):
95
113
        os.mkdir('a')
102
120
        t_a.commit('commit 3')
103
121
        b = t_a.branch.create_checkout('b').branch
104
122
        uncommit.uncommit(b)
105
 
        self.assertEqual(len(b.revision_history()), 2)
106
 
        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)
107
125
        # update A's tree to not have the uncommitted revision referenced.
108
126
        t_a.update()
109
127
        t_a.commit('commit 3b')
129
147
        os.chdir('tree')
130
148
        out, err = self.run_bzr('uncommit -r1 --force')
131
149
 
132
 
        self.assertNotContainsRe(out, 'initial commit')
133
 
        self.assertContainsRe(out, 'second commit')
134
 
        self.assertEqual(['a1'], wt.get_parent_ids())
135
 
        self.assertEqual('a1', wt.branch.last_revision())
 
150
        self.assertNotContainsRe(out, b'initial commit')
 
151
        self.assertContainsRe(out, b'second commit')
 
152
        self.assertEqual([b'a1'], wt.get_parent_ids())
 
153
        self.assertEqual(b'a1', wt.branch.last_revision())
136
154
 
137
155
    def test_uncommit_neg_1(self):
138
156
        wt = self.create_simple_tree()
139
157
        os.chdir('tree')
140
158
        out, err = self.run_bzr('uncommit -r -1', retcode=1)
141
 
        self.assertEqual('No revisions to uncommit.\n', out)
 
159
        self.assertEqual(b'No revisions to uncommit.\n', out)
142
160
 
143
161
    def test_uncommit_merges(self):
144
162
        wt = self.create_simple_tree()
145
163
 
146
 
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
 
164
        tree2 = wt.controldir.sprout('tree2').open_workingtree()
147
165
 
148
 
        tree2.commit('unchanged', rev_id='b3')
149
 
        tree2.commit('unchanged', rev_id='b4')
 
166
        tree2.commit('unchanged', rev_id=b'b3')
 
167
        tree2.commit('unchanged', rev_id=b'b4')
150
168
 
151
169
        wt.merge_from_branch(tree2.branch)
152
 
        wt.commit('merge b4', rev_id='a3')
 
170
        wt.commit('merge b4', rev_id=b'a3')
153
171
 
154
 
        self.assertEqual(['a3'], wt.get_parent_ids())
 
172
        self.assertEqual([b'a3'], wt.get_parent_ids())
155
173
 
156
174
        os.chdir('tree')
157
175
        out, err = self.run_bzr('uncommit --force')
158
176
 
159
 
        self.assertEqual(['a2', 'b4'], wt.get_parent_ids())
 
177
        self.assertEqual([b'a2', b'b4'], wt.get_parent_ids())
160
178
 
161
179
    def test_uncommit_pending_merge(self):
162
180
        wt = self.create_simple_tree()
163
 
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
164
 
        tree2.commit('unchanged', rev_id='b3')
 
181
        tree2 = wt.controldir.sprout('tree2').open_workingtree()
 
182
        tree2.commit('unchanged', rev_id=b'b3')
165
183
 
166
184
        wt.branch.fetch(tree2.branch)
167
 
        wt.set_pending_merges(['b3'])
 
185
        wt.set_pending_merges([b'b3'])
168
186
 
169
187
        os.chdir('tree')
170
188
        out, err = self.run_bzr('uncommit --force')
171
 
        self.assertEqual(['a1', 'b3'], wt.get_parent_ids())
 
189
        self.assertEqual([b'a1', b'b3'], wt.get_parent_ids())
172
190
 
173
191
    def test_uncommit_multiple_merge(self):
174
192
        wt = self.create_simple_tree()
175
193
 
176
 
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
177
 
        tree2.commit('unchanged', rev_id='b3')
 
194
        tree2 = wt.controldir.sprout('tree2').open_workingtree()
 
195
        tree2.commit('unchanged', rev_id=b'b3')
178
196
 
179
 
        tree3 = wt.bzrdir.sprout('tree3').open_workingtree()
180
 
        tree3.commit('unchanged', rev_id='c3')
 
197
        tree3 = wt.controldir.sprout('tree3').open_workingtree()
 
198
        tree3.commit('unchanged', rev_id=b'c3')
181
199
 
182
200
        wt.merge_from_branch(tree2.branch)
183
 
        wt.commit('merge b3', rev_id='a3')
 
201
        wt.commit('merge b3', rev_id=b'a3')
184
202
 
185
203
        wt.merge_from_branch(tree3.branch)
186
 
        wt.commit('merge c3', rev_id='a4')
 
204
        wt.commit('merge c3', rev_id=b'a4')
187
205
 
188
 
        self.assertEqual(['a4'], wt.get_parent_ids())
 
206
        self.assertEqual([b'a4'], wt.get_parent_ids())
189
207
 
190
208
        os.chdir('tree')
191
209
        out, err = self.run_bzr('uncommit --force -r 2')
192
210
 
193
 
        self.assertEqual(['a2', 'b3', 'c3'], wt.get_parent_ids())
 
211
        self.assertEqual([b'a2', b'b3', b'c3'], wt.get_parent_ids())
194
212
 
195
213
    def test_uncommit_merge_plus_pending(self):
196
214
        wt = self.create_simple_tree()
197
215
 
198
 
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
199
 
        tree2.commit('unchanged', rev_id='b3')
200
 
        tree3 = wt.bzrdir.sprout('tree3').open_workingtree()
201
 
        tree3.commit('unchanged', rev_id='c3')
 
216
        tree2 = wt.controldir.sprout('tree2').open_workingtree()
 
217
        tree2.commit('unchanged', rev_id=b'b3')
 
218
        tree3 = wt.controldir.sprout('tree3').open_workingtree()
 
219
        tree3.commit('unchanged', rev_id=b'c3')
202
220
 
203
221
        wt.branch.fetch(tree2.branch)
204
 
        wt.set_pending_merges(['b3'])
205
 
        wt.commit('merge b3', rev_id='a3')
206
 
 
 
222
        wt.set_pending_merges([b'b3'])
 
223
        wt.commit('merge b3', rev_id=b'a3')
207
224
 
208
225
        wt.merge_from_branch(tree3.branch)
209
226
 
210
 
        self.assertEqual(['a3', 'c3'], wt.get_parent_ids())
 
227
        self.assertEqual([b'a3', b'c3'], wt.get_parent_ids())
211
228
 
212
229
        os.chdir('tree')
213
230
        out, err = self.run_bzr('uncommit --force -r 2')
214
231
 
215
 
        self.assertEqual(['a2', 'b3', 'c3'], wt.get_parent_ids())
 
232
        self.assertEqual([b'a2', b'b3', b'c3'], wt.get_parent_ids())
216
233
 
217
234
    def test_uncommit_shows_log_with_revision_id(self):
218
235
        wt = self.create_simple_tree()
220
237
        script = ScriptRunner()
221
238
        script.run_script(self, """
222
239
$ cd tree
223
 
$ bzr uncommit --force 
 
240
$ brz uncommit --force 
224
241
    2 ...
225
242
      second commit
226
243
...
227
244
The above revision(s) will be removed.
228
245
You can restore the old tip by running:
229
 
  bzr pull . -r revid:a2
 
246
  brz pull . -r revid:a2
230
247
""")
231
248
 
232
249
    def test_uncommit_octopus_merge(self):
234
251
        # though it will also filter out ones in the ancestry
235
252
        wt = self.create_simple_tree()
236
253
 
237
 
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
238
 
        tree3 = wt.bzrdir.sprout('tree3').open_workingtree()
 
254
        tree2 = wt.controldir.sprout('tree2').open_workingtree()
 
255
        tree3 = wt.controldir.sprout('tree3').open_workingtree()
239
256
 
240
 
        tree2.commit('unchanged', rev_id='b3')
241
 
        tree3.commit('unchanged', rev_id='c3')
 
257
        tree2.commit('unchanged', rev_id=b'b3')
 
258
        tree3.commit('unchanged', rev_id=b'c3')
242
259
 
243
260
        wt.merge_from_branch(tree2.branch)
244
261
        wt.merge_from_branch(tree3.branch, force=True)
245
 
        wt.commit('merge b3, c3', rev_id='a3')
 
262
        wt.commit('merge b3, c3', rev_id=b'a3')
246
263
 
247
 
        tree2.commit('unchanged', rev_id='b4')
248
 
        tree3.commit('unchanged', rev_id='c4')
 
264
        tree2.commit('unchanged', rev_id=b'b4')
 
265
        tree3.commit('unchanged', rev_id=b'c4')
249
266
 
250
267
        wt.merge_from_branch(tree3.branch)
251
268
        wt.merge_from_branch(tree2.branch, force=True)
252
 
        wt.commit('merge b4, c4', rev_id='a4')
 
269
        wt.commit('merge b4, c4', rev_id=b'a4')
253
270
 
254
 
        self.assertEqual(['a4'], wt.get_parent_ids())
 
271
        self.assertEqual([b'a4'], wt.get_parent_ids())
255
272
 
256
273
        os.chdir('tree')
257
274
        out, err = self.run_bzr('uncommit --force -r 2')
258
275
 
259
 
        self.assertEqual(['a2', 'c4', 'b4'], wt.get_parent_ids())
 
276
        self.assertEqual([b'a2', b'c4', b'b4'], wt.get_parent_ids())
260
277
 
261
278
    def test_uncommit_nonascii(self):
262
279
        tree = self.make_branch_and_tree('tree')
263
280
        tree.commit(u'\u1234 message')
264
281
        out, err = self.run_bzr('uncommit --force tree', encoding='ascii')
265
 
        self.assertContainsRe(out, r'\? message')
 
282
        self.assertContainsRe(out, br'\? message')
 
283
 
 
284
    def test_uncommit_removes_tags(self):
 
285
        tree = self.make_branch_and_tree('tree')
 
286
        revid = tree.commit('message')
 
287
        tree.branch.tags.set_tag("atag", revid)
 
288
        out, err = self.run_bzr('uncommit --force tree')
 
289
        self.assertEqual({}, tree.branch.tags.get_tag_dict())
 
290
 
 
291
    def test_uncommit_keep_tags(self):
 
292
        tree = self.make_branch_and_tree('tree')
 
293
        revid = tree.commit('message')
 
294
        tree.branch.tags.set_tag("atag", revid)
 
295
        out, err = self.run_bzr('uncommit --keep-tags --force tree')
 
296
        self.assertEqual({"atag": revid}, tree.branch.tags.get_tag_dict())
 
297
 
 
298
 
 
299
class TestSmartServerUncommit(TestCaseWithTransport):
 
300
 
 
301
    def test_uncommit(self):
 
302
        self.setup_smart_server_with_call_log()
 
303
        t = self.make_branch_and_tree('from')
 
304
        for count in range(2):
 
305
            t.commit(message='commit %d' % count)
 
306
        self.reset_smart_call_log()
 
307
        out, err = self.run_bzr(['uncommit', '--force', self.get_url('from')])
 
308
        # This figure represent the amount of work to perform this use case. It
 
309
        # is entirely ok to reduce this number if a test fails due to rpc_count
 
310
        # being too low. If rpc_count increases, more network roundtrips have
 
311
        # become necessary for this use case. Please do not adjust this number
 
312
        # upwards without agreement from bzr's network support maintainers.
 
313
        self.assertLength(14, self.hpss_calls)
 
314
        self.assertLength(1, self.hpss_connections)
 
315
        self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
 
316
 
 
317
 
 
318
class TestInconsistentDelta(TestCaseWithTransport):
 
319
    # See https://bugs.launchpad.net/bzr/+bug/855155
 
320
    # See https://bugs.launchpad.net/bzr/+bug/1100385
 
321
    # brz uncommit may result in error
 
322
    # 'An inconsistent delta was supplied involving'
 
323
 
 
324
    def test_inconsistent_delta(self):
 
325
        # Script taken from https://bugs.launchpad.net/bzr/+bug/855155/comments/26
 
326
        wt = self.make_branch_and_tree('test')
 
327
        self.build_tree(['test/a/', 'test/a/b', 'test/a/c'])
 
328
        wt.add(['a', 'a/b', 'a/c'])
 
329
        wt.commit('initial commit', rev_id=b'a1')
 
330
        wt.remove(['a/b', 'a/c'])
 
331
        wt.commit('remove b and c', rev_id=b'a2')
 
332
        self.run_bzr("uncommit --force test")