/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 11:08:10 UTC
  • mto: This revision was merged to the branch mainline in revision 5223.
  • Revision ID: robertc@robertcollins.net-20100506110810-h3j07fh5gmw54s25
Cleaner matcher matching revised unlocking protocol.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 by 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
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
"""Test the uncommit command."""
18
18
 
22
22
from bzrlib.bzrdir import BzrDirMetaFormat1
23
23
from bzrlib.errors import BzrError, BoundBranchOutOfDate
24
24
from bzrlib.tests import TestCaseWithTransport
 
25
from bzrlib.tests.script import ScriptRunner
25
26
 
26
27
 
27
28
class TestUncommit(TestCaseWithTransport):
32
33
        wt.add(['a', 'b', 'c'])
33
34
        wt.commit('initial commit', rev_id='a1')
34
35
 
35
 
        open('tree/a', 'wb').write('new contents of a\n')
 
36
        self.build_tree_contents([('tree/a', 'new contents of a\n')])
36
37
        wt.commit('second commit', rev_id='a2')
37
38
 
38
39
        return wt
42
43
        wt = self.create_simple_tree()
43
44
 
44
45
        os.chdir('tree')
45
 
        out, err = self.run_bzr('uncommit', '--dry-run', '--force')
 
46
        out, err = self.run_bzr('uncommit --dry-run --force')
46
47
        self.assertContainsRe(out, 'Dry-run')
47
48
        self.assertNotContainsRe(out, 'initial commit')
48
49
        self.assertContainsRe(out, 'second commit')
51
52
        self.assertEqual(['a2'], wt.get_parent_ids())
52
53
 
53
54
        # Uncommit, don't prompt
54
 
        out, err = self.run_bzr('uncommit', '--force')
 
55
        out, err = self.run_bzr('uncommit --force')
55
56
        self.assertNotContainsRe(out, 'initial commit')
56
57
        self.assertContainsRe(out, 'second commit')
57
58
 
60
61
        out, err = self.run_bzr('status')
61
62
        self.assertEquals(out, 'modified:\n  a\n')
62
63
 
 
64
    def test_uncommit_no_history(self):
 
65
        wt = self.make_branch_and_tree('tree')
 
66
        out, err = self.run_bzr('uncommit --force', retcode=1)
 
67
        self.assertEqual('', err)
 
68
        self.assertEqual('No revisions to uncommit.\n', out)
 
69
 
63
70
    def test_uncommit_checkout(self):
64
71
        wt = self.create_simple_tree()
65
 
 
66
 
        checkout_tree = wt.bzrdir.sprout('checkout').open_workingtree()
67
 
        checkout_tree.branch.bind(wt.branch)
 
72
        checkout_tree = wt.branch.create_checkout('checkout')
68
73
 
69
74
        self.assertEqual(['a2'], checkout_tree.get_parent_ids())
70
75
 
71
76
        os.chdir('checkout')
72
 
        out, err = self.run_bzr('uncommit', '--dry-run', '--force')
 
77
        out, err = self.run_bzr('uncommit --dry-run --force')
73
78
        self.assertContainsRe(out, 'Dry-run')
74
79
        self.assertNotContainsRe(out, 'initial commit')
75
80
        self.assertContainsRe(out, 'second commit')
76
81
 
77
82
        self.assertEqual(['a2'], checkout_tree.get_parent_ids())
78
83
 
79
 
        out, err = self.run_bzr('uncommit', '--force')
 
84
        out, err = self.run_bzr('uncommit --force')
80
85
        self.assertNotContainsRe(out, 'initial commit')
81
86
        self.assertContainsRe(out, 'second commit')
82
87
 
95
100
        t_a.commit('commit 1')
96
101
        t_a.commit('commit 2')
97
102
        t_a.commit('commit 3')
98
 
        b = t_a.bzrdir.sprout('b').open_branch()
99
 
        b.bind(t_a.branch)
 
103
        b = t_a.branch.create_checkout('b').branch
100
104
        uncommit.uncommit(b)
101
105
        self.assertEqual(len(b.revision_history()), 2)
102
106
        self.assertEqual(len(t_a.branch.revision_history()), 2)
103
 
        # update A's tree to not have the uncomitted revision referenced.
 
107
        # update A's tree to not have the uncommitted revision referenced.
104
108
        t_a.update()
105
109
        t_a.commit('commit 3b')
106
110
        self.assertRaises(BoundBranchOutOfDate, uncommit.uncommit, b)
107
111
        b.pull(t_a.branch)
108
112
        uncommit.uncommit(b)
109
113
 
 
114
    def test_uncommit_bound_local(self):
 
115
        t_a = self.make_branch_and_tree('a')
 
116
        rev_id1 = t_a.commit('commit 1')
 
117
        rev_id2 = t_a.commit('commit 2')
 
118
        rev_id3 = t_a.commit('commit 3')
 
119
        b = t_a.branch.create_checkout('b').branch
 
120
 
 
121
        out, err = self.run_bzr(['uncommit', '--local', 'b', '--force'])
 
122
        self.assertEqual(rev_id3, t_a.last_revision())
 
123
        self.assertEqual((3, rev_id3), t_a.branch.last_revision_info())
 
124
        self.assertEqual((2, rev_id2), b.last_revision_info())
 
125
 
110
126
    def test_uncommit_revision(self):
111
127
        wt = self.create_simple_tree()
112
128
 
113
129
        os.chdir('tree')
114
 
        out, err = self.run_bzr('uncommit', '-r1', '--force')
 
130
        out, err = self.run_bzr('uncommit -r1 --force')
115
131
 
116
132
        self.assertNotContainsRe(out, 'initial commit')
117
133
        self.assertContainsRe(out, 'second commit')
121
137
    def test_uncommit_neg_1(self):
122
138
        wt = self.create_simple_tree()
123
139
        os.chdir('tree')
124
 
        out, err = self.run_bzr('uncommit', '-r', '-1', retcode=1)
 
140
        out, err = self.run_bzr('uncommit -r -1', retcode=1)
125
141
        self.assertEqual('No revisions to uncommit.\n', out)
126
142
 
127
143
    def test_uncommit_merges(self):
138
154
        self.assertEqual(['a3'], wt.get_parent_ids())
139
155
 
140
156
        os.chdir('tree')
141
 
        out, err = self.run_bzr('uncommit', '--force')
 
157
        out, err = self.run_bzr('uncommit --force')
142
158
 
143
159
        self.assertEqual(['a2', 'b4'], wt.get_parent_ids())
144
160
 
151
167
        wt.set_pending_merges(['b3'])
152
168
 
153
169
        os.chdir('tree')
154
 
        out, err = self.run_bzr('uncommit', '--force')
 
170
        out, err = self.run_bzr('uncommit --force')
155
171
        self.assertEqual(['a1', 'b3'], wt.get_parent_ids())
156
172
 
157
173
    def test_uncommit_multiple_merge(self):
158
174
        wt = self.create_simple_tree()
159
175
 
160
176
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
161
 
 
162
177
        tree2.commit('unchanged', rev_id='b3')
163
178
 
 
179
        tree3 = wt.bzrdir.sprout('tree3').open_workingtree()
 
180
        tree3.commit('unchanged', rev_id='c3')
 
181
 
164
182
        wt.merge_from_branch(tree2.branch)
165
183
        wt.commit('merge b3', rev_id='a3')
166
184
 
167
 
        tree2.commit('unchanged', rev_id='b4')
168
 
 
169
 
        wt.merge_from_branch(tree2.branch)
170
 
        wt.commit('merge b4', rev_id='a4')
 
185
        wt.merge_from_branch(tree3.branch)
 
186
        wt.commit('merge c3', rev_id='a4')
171
187
 
172
188
        self.assertEqual(['a4'], wt.get_parent_ids())
173
189
 
174
190
        os.chdir('tree')
175
 
        out, err = self.run_bzr('uncommit', '--force', '-r', '2')
 
191
        out, err = self.run_bzr('uncommit --force -r 2')
176
192
 
177
 
        self.assertEqual(['a2', 'b3', 'b4'], wt.get_parent_ids())
 
193
        self.assertEqual(['a2', 'b3', 'c3'], wt.get_parent_ids())
178
194
 
179
195
    def test_uncommit_merge_plus_pending(self):
180
196
        wt = self.create_simple_tree()
181
197
 
182
198
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
183
 
 
184
199
        tree2.commit('unchanged', rev_id='b3')
 
200
        tree3 = wt.bzrdir.sprout('tree3').open_workingtree()
 
201
        tree3.commit('unchanged', rev_id='c3')
 
202
 
185
203
        wt.branch.fetch(tree2.branch)
186
204
        wt.set_pending_merges(['b3'])
187
205
        wt.commit('merge b3', rev_id='a3')
188
206
 
189
 
        tree2.commit('unchanged', rev_id='b4')
190
 
        wt.branch.fetch(tree2.branch)
191
 
        wt.set_pending_merges(['b4'])
192
 
 
193
 
        self.assertEqual(['a3', 'b4'], wt.get_parent_ids())
 
207
 
 
208
        wt.merge_from_branch(tree3.branch)
 
209
 
 
210
        self.assertEqual(['a3', 'c3'], wt.get_parent_ids())
194
211
 
195
212
        os.chdir('tree')
196
 
        out, err = self.run_bzr('uncommit', '--force', '-r', '2')
197
 
 
198
 
        self.assertEqual(['a2', 'b3', 'b4'], wt.get_parent_ids())
 
213
        out, err = self.run_bzr('uncommit --force -r 2')
 
214
 
 
215
        self.assertEqual(['a2', 'b3', 'c3'], wt.get_parent_ids())
 
216
 
 
217
    def test_uncommit_shows_log_with_revision_id(self):
 
218
        wt = self.create_simple_tree()
 
219
 
 
220
        script = ScriptRunner()
 
221
        script.run_script(self, """
 
222
$ cd tree
 
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
 
230
""")
199
231
 
200
232
    def test_uncommit_octopus_merge(self):
201
233
        # Check that uncommit keeps the pending merges in the same order
 
234
        # though it will also filter out ones in the ancestry
202
235
        wt = self.create_simple_tree()
203
236
 
204
237
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
206
239
 
207
240
        tree2.commit('unchanged', rev_id='b3')
208
241
        tree3.commit('unchanged', rev_id='c3')
209
 
        
 
242
 
210
243
        wt.merge_from_branch(tree2.branch)
211
 
        wt.merge_from_branch(tree3.branch)
 
244
        wt.merge_from_branch(tree3.branch, force=True)
212
245
        wt.commit('merge b3, c3', rev_id='a3')
213
246
 
214
247
        tree2.commit('unchanged', rev_id='b4')
215
248
        tree3.commit('unchanged', rev_id='c4')
216
249
 
217
250
        wt.merge_from_branch(tree3.branch)
218
 
        wt.merge_from_branch(tree2.branch)
 
251
        wt.merge_from_branch(tree2.branch, force=True)
219
252
        wt.commit('merge b4, c4', rev_id='a4')
220
253
 
221
254
        self.assertEqual(['a4'], wt.get_parent_ids())
222
255
 
223
256
        os.chdir('tree')
224
 
        out, err = self.run_bzr('uncommit', '--force', '-r', '2')
225
 
 
226
 
        self.assertEqual(['a2', 'b3', 'c3', 'c4', 'b4'], wt.get_parent_ids())
 
257
        out, err = self.run_bzr('uncommit --force -r 2')
 
258
 
 
259
        self.assertEqual(['a2', 'c4', 'b4'], wt.get_parent_ids())
 
260
 
 
261
    def test_uncommit_nonascii(self):
 
262
        tree = self.make_branch_and_tree('tree')
 
263
        tree.commit(u'\u1234 message')
 
264
        out, err = self.run_bzr('uncommit --force tree', encoding='ascii')
 
265
        self.assertContainsRe(out, r'\? message')