/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: 2010-05-06 23:41:35 UTC
  • mto: This revision was merged to the branch mainline in revision 5223.
  • Revision ID: robertc@robertcollins.net-20100506234135-yivbzczw1sejxnxc
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
expected to return an object which can be used to unlock them. This reduces
duplicate code when using cleanups. The previous 'tokens's returned by
``Branch.lock_write`` and ``Repository.lock_write`` are now attributes
on the result of the lock_write. ``repository.RepositoryWriteLockResult``
and ``branch.BranchWriteLockResult`` document this. (Robert Collins)

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