~bzr-pqm/bzr/bzr.dev

4988.10.5 by John Arbash Meinel
Merge bzr.dev 5021 to resolve NEWS
1
# Copyright (C) 2005-2010 Canonical Ltd
1850.3.4 by John Arbash Meinel
Add copyright to test_uncommit.py
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1850.3.4 by John Arbash Meinel
Add copyright to test_uncommit.py
16
17
"""Test the uncommit command."""
1558.1.12 by Aaron Bentley
Got uncommit working properly with checkouts
18
19
import os
20
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
21
from bzrlib import uncommit, workingtree
1558.9.1 by Aaron Bentley
Fix uncommit to handle bound branches, and to do locking
22
from bzrlib.bzrdir import BzrDirMetaFormat1
23
from bzrlib.errors import BzrError, BoundBranchOutOfDate
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
24
from bzrlib.tests import TestCaseWithTransport
5416.1.9 by Martin Pool
Add a test that uncommit confirms its action
25
from bzrlib.tests.script import (
26
    run_script,
27
    ScriptRunner,
28
    )
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
29
30
31
class TestUncommit(TestCaseWithTransport):
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
32
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
33
    def create_simple_tree(self):
34
        wt = self.make_branch_and_tree('tree')
35
        self.build_tree(['tree/a', 'tree/b', 'tree/c'])
36
        wt.add(['a', 'b', 'c'])
1850.3.2 by John Arbash Meinel
Change uncommit -r 10 so that it uncommits *to* 10, rather than removing 10
37
        wt.commit('initial commit', rev_id='a1')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
38
3629.1.1 by John Arbash Meinel
Change 'bzr uncommit' to display the revision ids and log them.
39
        self.build_tree_contents([('tree/a', 'new contents of a\n')])
1850.3.2 by John Arbash Meinel
Change uncommit -r 10 so that it uncommits *to* 10, rather than removing 10
40
        wt.commit('second commit', rev_id='a2')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
41
42
        return wt
43
0.3.11 by John Arbash Meinel
Updated to latest bzr.dev code, and added tests.
44
    def test_uncommit(self):
45
        """Test uncommit functionality."""
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
46
        wt = self.create_simple_tree()
47
48
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
49
        out, err = self.run_bzr('uncommit --dry-run --force')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
50
        self.assertContainsRe(out, 'Dry-run')
1850.3.2 by John Arbash Meinel
Change uncommit -r 10 so that it uncommits *to* 10, rather than removing 10
51
        self.assertNotContainsRe(out, 'initial commit')
52
        self.assertContainsRe(out, 'second commit')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
53
54
        # Nothing has changed
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
55
        self.assertEqual(['a2'], wt.get_parent_ids())
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
56
57
        # Uncommit, don't prompt
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
58
        out, err = self.run_bzr('uncommit --force')
1850.3.2 by John Arbash Meinel
Change uncommit -r 10 so that it uncommits *to* 10, rather than removing 10
59
        self.assertNotContainsRe(out, 'initial commit')
60
        self.assertContainsRe(out, 'second commit')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
61
62
        # This should look like we are back in revno 1
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
63
        self.assertEqual(['a1'], wt.get_parent_ids())
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
64
        out, err = self.run_bzr('status')
65
        self.assertEquals(out, 'modified:\n  a\n')
66
5416.1.9 by Martin Pool
Add a test that uncommit confirms its action
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
        $ bzr uncommit
5416.1.12 by Martin Pool
Tweak uncommit doctest for python 2.4
73
        ...
5416.1.9 by Martin Pool
Add a test that uncommit confirms its action
74
        The above revision(s) will be removed.
75
        2>Uncommit these revisions? [y/n]: 
76
        <n
77
        Canceled
78
        """)
79
        self.assertEqual(['a2'], wt.get_parent_ids())
80
2948.2.1 by John Arbash Meinel
Fix 'bzr uncommit' when there is no revision history.
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)
86
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
87
    def test_uncommit_checkout(self):
88
        wt = self.create_simple_tree()
1997.1.5 by Robert Collins
``Branch.bind(other_branch)`` no longer takes a write lock on the
89
        checkout_tree = wt.branch.create_checkout('checkout')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
90
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
91
        self.assertEqual(['a2'], checkout_tree.get_parent_ids())
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
92
93
        os.chdir('checkout')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
94
        out, err = self.run_bzr('uncommit --dry-run --force')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
95
        self.assertContainsRe(out, 'Dry-run')
1850.3.2 by John Arbash Meinel
Change uncommit -r 10 so that it uncommits *to* 10, rather than removing 10
96
        self.assertNotContainsRe(out, 'initial commit')
97
        self.assertContainsRe(out, 'second commit')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
98
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
99
        self.assertEqual(['a2'], checkout_tree.get_parent_ids())
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
100
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
101
        out, err = self.run_bzr('uncommit --force')
1850.3.2 by John Arbash Meinel
Change uncommit -r 10 so that it uncommits *to* 10, rather than removing 10
102
        self.assertNotContainsRe(out, 'initial commit')
103
        self.assertContainsRe(out, 'second commit')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
104
105
        # uncommit in a checkout should uncommit the parent branch
106
        # (but doesn't effect the other working tree)
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
107
        self.assertEquals(['a1'], checkout_tree.get_parent_ids())
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
108
        self.assertEquals('a1', wt.branch.last_revision())
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
109
        self.assertEquals(['a2'], wt.get_parent_ids())
1558.9.1 by Aaron Bentley
Fix uncommit to handle bound branches, and to do locking
110
111
    def test_uncommit_bound(self):
112
        os.mkdir('a')
113
        a = BzrDirMetaFormat1().initialize('a')
114
        a.create_repository()
115
        a.create_branch()
1908.6.1 by Robert Collins
Change all callers of set_last_revision to use set_parent_trees.
116
        t_a = a.create_workingtree()
117
        t_a.commit('commit 1')
118
        t_a.commit('commit 2')
119
        t_a.commit('commit 3')
1997.1.5 by Robert Collins
``Branch.bind(other_branch)`` no longer takes a write lock on the
120
        b = t_a.branch.create_checkout('b').branch
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
121
        uncommit.uncommit(b)
1558.9.1 by Aaron Bentley
Fix uncommit to handle bound branches, and to do locking
122
        self.assertEqual(len(b.revision_history()), 2)
1908.6.1 by Robert Collins
Change all callers of set_last_revision to use set_parent_trees.
123
        self.assertEqual(len(t_a.branch.revision_history()), 2)
4031.3.1 by Frank Aspell
Fixing various typos
124
        # update A's tree to not have the uncommitted revision referenced.
1908.6.1 by Robert Collins
Change all callers of set_last_revision to use set_parent_trees.
125
        t_a.update()
126
        t_a.commit('commit 3b')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
127
        self.assertRaises(BoundBranchOutOfDate, uncommit.uncommit, b)
1908.6.1 by Robert Collins
Change all callers of set_last_revision to use set_parent_trees.
128
        b.pull(t_a.branch)
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
129
        uncommit.uncommit(b)
1558.9.1 by Aaron Bentley
Fix uncommit to handle bound branches, and to do locking
130
3280.4.1 by John Arbash Meinel
Add uncommit --local.
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
1850.3.2 by John Arbash Meinel
Change uncommit -r 10 so that it uncommits *to* 10, rather than removing 10
143
    def test_uncommit_revision(self):
144
        wt = self.create_simple_tree()
145
146
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
147
        out, err = self.run_bzr('uncommit -r1 --force')
1850.3.2 by John Arbash Meinel
Change uncommit -r 10 so that it uncommits *to* 10, rather than removing 10
148
149
        self.assertNotContainsRe(out, 'initial commit')
150
        self.assertContainsRe(out, 'second commit')
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
151
        self.assertEqual(['a1'], wt.get_parent_ids())
1850.3.2 by John Arbash Meinel
Change uncommit -r 10 so that it uncommits *to* 10, rather than removing 10
152
        self.assertEqual('a1', wt.branch.last_revision())
153
154
    def test_uncommit_neg_1(self):
155
        wt = self.create_simple_tree()
156
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
157
        out, err = self.run_bzr('uncommit -r -1', retcode=1)
1850.3.2 by John Arbash Meinel
Change uncommit -r 10 so that it uncommits *to* 10, rather than removing 10
158
        self.assertEqual('No revisions to uncommit.\n', out)
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
159
160
    def test_uncommit_merges(self):
161
        wt = self.create_simple_tree()
162
163
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
164
165
        tree2.commit('unchanged', rev_id='b3')
166
        tree2.commit('unchanged', rev_id='b4')
167
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
168
        wt.merge_from_branch(tree2.branch)
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
169
        wt.commit('merge b4', rev_id='a3')
170
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
171
        self.assertEqual(['a3'], wt.get_parent_ids())
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
172
173
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
174
        out, err = self.run_bzr('uncommit --force')
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
175
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
176
        self.assertEqual(['a2', 'b4'], wt.get_parent_ids())
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
177
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
178
    def test_uncommit_pending_merge(self):
179
        wt = self.create_simple_tree()
180
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
181
        tree2.commit('unchanged', rev_id='b3')
182
183
        wt.branch.fetch(tree2.branch)
184
        wt.set_pending_merges(['b3'])
185
186
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
187
        out, err = self.run_bzr('uncommit --force')
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
188
        self.assertEqual(['a1', 'b3'], wt.get_parent_ids())
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
189
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
190
    def test_uncommit_multiple_merge(self):
191
        wt = self.create_simple_tree()
192
193
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
194
        tree2.commit('unchanged', rev_id='b3')
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
195
3462.1.4 by John Arbash Meinel
fix up the uncommit tests now that set_parent_ids is filtering out ancestors.
196
        tree3 = wt.bzrdir.sprout('tree3').open_workingtree()
197
        tree3.commit('unchanged', rev_id='c3')
198
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
199
        wt.merge_from_branch(tree2.branch)
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
200
        wt.commit('merge b3', rev_id='a3')
201
3462.1.4 by John Arbash Meinel
fix up the uncommit tests now that set_parent_ids is filtering out ancestors.
202
        wt.merge_from_branch(tree3.branch)
203
        wt.commit('merge c3', rev_id='a4')
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
204
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
205
        self.assertEqual(['a4'], wt.get_parent_ids())
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
206
207
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
208
        out, err = self.run_bzr('uncommit --force -r 2')
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
209
3462.1.4 by John Arbash Meinel
fix up the uncommit tests now that set_parent_ids is filtering out ancestors.
210
        self.assertEqual(['a2', 'b3', 'c3'], wt.get_parent_ids())
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
211
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
212
    def test_uncommit_merge_plus_pending(self):
213
        wt = self.create_simple_tree()
214
215
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
216
        tree2.commit('unchanged', rev_id='b3')
3462.1.4 by John Arbash Meinel
fix up the uncommit tests now that set_parent_ids is filtering out ancestors.
217
        tree3 = wt.bzrdir.sprout('tree3').open_workingtree()
218
        tree3.commit('unchanged', rev_id='c3')
219
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
220
        wt.branch.fetch(tree2.branch)
221
        wt.set_pending_merges(['b3'])
222
        wt.commit('merge b3', rev_id='a3')
223
3462.1.4 by John Arbash Meinel
fix up the uncommit tests now that set_parent_ids is filtering out ancestors.
224
225
        wt.merge_from_branch(tree3.branch)
226
227
        self.assertEqual(['a3', 'c3'], wt.get_parent_ids())
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
228
229
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
230
        out, err = self.run_bzr('uncommit --force -r 2')
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
231
3462.1.4 by John Arbash Meinel
fix up the uncommit tests now that set_parent_ids is filtering out ancestors.
232
        self.assertEqual(['a2', 'b3', 'c3'], wt.get_parent_ids())
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
233
3629.1.1 by John Arbash Meinel
Change 'bzr uncommit' to display the revision ids and log them.
234
    def test_uncommit_shows_log_with_revision_id(self):
235
        wt = self.create_simple_tree()
236
5010.1.2 by Martin Pool
Uncommit sends some output to stdout; change it to a script test
237
        script = ScriptRunner()
238
        script.run_script(self, """
239
$ cd tree
240
$ bzr uncommit --force 
5010.1.3 by Martin Pool
uncommit tests aren't isolated; shouldn't check committer/date
241
    2 ...
5010.1.2 by Martin Pool
Uncommit sends some output to stdout; change it to a script test
242
      second commit
243
...
244
The above revision(s) will be removed.
245
You can restore the old tip by running:
246
  bzr pull . -r revid:a2
247
""")
3629.1.1 by John Arbash Meinel
Change 'bzr uncommit' to display the revision ids and log them.
248
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
249
    def test_uncommit_octopus_merge(self):
250
        # Check that uncommit keeps the pending merges in the same order
3462.1.4 by John Arbash Meinel
fix up the uncommit tests now that set_parent_ids is filtering out ancestors.
251
        # though it will also filter out ones in the ancestry
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
252
        wt = self.create_simple_tree()
253
254
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
255
        tree3 = wt.bzrdir.sprout('tree3').open_workingtree()
256
257
        tree2.commit('unchanged', rev_id='b3')
258
        tree3.commit('unchanged', rev_id='c3')
3629.1.1 by John Arbash Meinel
Change 'bzr uncommit' to display the revision ids and log them.
259
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
260
        wt.merge_from_branch(tree2.branch)
4721.3.2 by Vincent Ladeuil
Simplify mutable_tree.has_changes() and update call sites.
261
        wt.merge_from_branch(tree3.branch, force=True)
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
262
        wt.commit('merge b3, c3', rev_id='a3')
263
264
        tree2.commit('unchanged', rev_id='b4')
265
        tree3.commit('unchanged', rev_id='c4')
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
266
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
267
        wt.merge_from_branch(tree3.branch)
4721.3.2 by Vincent Ladeuil
Simplify mutable_tree.has_changes() and update call sites.
268
        wt.merge_from_branch(tree2.branch, force=True)
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
269
        wt.commit('merge b4, c4', rev_id='a4')
270
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
271
        self.assertEqual(['a4'], wt.get_parent_ids())
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
272
273
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
274
        out, err = self.run_bzr('uncommit --force -r 2')
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
275
3462.1.4 by John Arbash Meinel
fix up the uncommit tests now that set_parent_ids is filtering out ancestors.
276
        self.assertEqual(['a2', 'c4', 'b4'], wt.get_parent_ids())
3101.1.1 by Aaron Bentley
Uncommit doesn't throw when it encounters un-encodable characters
277
278
    def test_uncommit_nonascii(self):
279
        tree = self.make_branch_and_tree('tree')
280
        tree.commit(u'\u1234 message')
3101.1.2 by Aaron Bentley
Improve uncommit test
281
        out, err = self.run_bzr('uncommit --force tree', encoding='ascii')
3101.1.1 by Aaron Bentley
Uncommit doesn't throw when it encounters un-encodable characters
282
        self.assertContainsRe(out, r'\? message')