/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 bzrlib/tests/blackbox/test_uncommit.py

  • Committer: Robert Collins
  • Date: 2007-04-19 02:27:44 UTC
  • mto: This revision was merged to the branch mainline in revision 2426.
  • Revision ID: robertc@robertcollins.net-20070419022744-pfdqz42kp1wizh43
``make docs`` now creates a man page at ``man1/bzr.1`` fixing bug 107388.
(Robert Collins)

Show diffs side-by-side

added added

removed removed

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