~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
5010.1.2 by Martin Pool
Uncommit sends some output to stdout; change it to a script test
25
from bzrlib.tests.script import ScriptRunner
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
26
27
28
class TestUncommit(TestCaseWithTransport):
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
29
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
30
    def create_simple_tree(self):
31
        wt = self.make_branch_and_tree('tree')
32
        self.build_tree(['tree/a', 'tree/b', 'tree/c'])
33
        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
34
        wt.commit('initial commit', rev_id='a1')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
35
3629.1.1 by John Arbash Meinel
Change 'bzr uncommit' to display the revision ids and log them.
36
        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
37
        wt.commit('second commit', rev_id='a2')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
38
39
        return wt
40
0.3.11 by John Arbash Meinel
Updated to latest bzr.dev code, and added tests.
41
    def test_uncommit(self):
42
        """Test uncommit functionality."""
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
43
        wt = self.create_simple_tree()
44
45
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
46
        out, err = self.run_bzr('uncommit --dry-run --force')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
47
        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
48
        self.assertNotContainsRe(out, 'initial commit')
49
        self.assertContainsRe(out, 'second commit')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
50
51
        # Nothing has changed
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
52
        self.assertEqual(['a2'], wt.get_parent_ids())
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
53
54
        # Uncommit, don't prompt
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
55
        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
56
        self.assertNotContainsRe(out, 'initial commit')
57
        self.assertContainsRe(out, 'second commit')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
58
59
        # This should look like we are back in revno 1
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
60
        self.assertEqual(['a1'], wt.get_parent_ids())
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
61
        out, err = self.run_bzr('status')
62
        self.assertEquals(out, 'modified:\n  a\n')
63
2948.2.1 by John Arbash Meinel
Fix 'bzr uncommit' when there is no revision history.
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
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
70
    def test_uncommit_checkout(self):
71
        wt = self.create_simple_tree()
1997.1.5 by Robert Collins
``Branch.bind(other_branch)`` no longer takes a write lock on the
72
        checkout_tree = wt.branch.create_checkout('checkout')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
73
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
74
        self.assertEqual(['a2'], checkout_tree.get_parent_ids())
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
75
76
        os.chdir('checkout')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
77
        out, err = self.run_bzr('uncommit --dry-run --force')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
78
        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
79
        self.assertNotContainsRe(out, 'initial commit')
80
        self.assertContainsRe(out, 'second commit')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
81
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
82
        self.assertEqual(['a2'], checkout_tree.get_parent_ids())
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
83
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
84
        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
85
        self.assertNotContainsRe(out, 'initial commit')
86
        self.assertContainsRe(out, 'second commit')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
87
88
        # uncommit in a checkout should uncommit the parent branch
89
        # (but doesn't effect the other working tree)
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
90
        self.assertEquals(['a1'], checkout_tree.get_parent_ids())
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
91
        self.assertEquals('a1', wt.branch.last_revision())
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
92
        self.assertEquals(['a2'], wt.get_parent_ids())
1558.9.1 by Aaron Bentley
Fix uncommit to handle bound branches, and to do locking
93
94
    def test_uncommit_bound(self):
95
        os.mkdir('a')
96
        a = BzrDirMetaFormat1().initialize('a')
97
        a.create_repository()
98
        a.create_branch()
1908.6.1 by Robert Collins
Change all callers of set_last_revision to use set_parent_trees.
99
        t_a = a.create_workingtree()
100
        t_a.commit('commit 1')
101
        t_a.commit('commit 2')
102
        t_a.commit('commit 3')
1997.1.5 by Robert Collins
``Branch.bind(other_branch)`` no longer takes a write lock on the
103
        b = t_a.branch.create_checkout('b').branch
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
104
        uncommit.uncommit(b)
1558.9.1 by Aaron Bentley
Fix uncommit to handle bound branches, and to do locking
105
        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.
106
        self.assertEqual(len(t_a.branch.revision_history()), 2)
4031.3.1 by Frank Aspell
Fixing various typos
107
        # 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.
108
        t_a.update()
109
        t_a.commit('commit 3b')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
110
        self.assertRaises(BoundBranchOutOfDate, uncommit.uncommit, b)
1908.6.1 by Robert Collins
Change all callers of set_last_revision to use set_parent_trees.
111
        b.pull(t_a.branch)
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
112
        uncommit.uncommit(b)
1558.9.1 by Aaron Bentley
Fix uncommit to handle bound branches, and to do locking
113
3280.4.1 by John Arbash Meinel
Add uncommit --local.
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
1850.3.2 by John Arbash Meinel
Change uncommit -r 10 so that it uncommits *to* 10, rather than removing 10
126
    def test_uncommit_revision(self):
127
        wt = self.create_simple_tree()
128
129
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
130
        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
131
132
        self.assertNotContainsRe(out, 'initial commit')
133
        self.assertContainsRe(out, 'second commit')
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
134
        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
135
        self.assertEqual('a1', wt.branch.last_revision())
136
137
    def test_uncommit_neg_1(self):
138
        wt = self.create_simple_tree()
139
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
140
        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
141
        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.
142
143
    def test_uncommit_merges(self):
144
        wt = self.create_simple_tree()
145
146
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
147
148
        tree2.commit('unchanged', rev_id='b3')
149
        tree2.commit('unchanged', rev_id='b4')
150
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
151
        wt.merge_from_branch(tree2.branch)
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
152
        wt.commit('merge b4', rev_id='a3')
153
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
154
        self.assertEqual(['a3'], wt.get_parent_ids())
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
155
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 --force')
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
158
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
159
        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.
160
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
161
    def test_uncommit_pending_merge(self):
162
        wt = self.create_simple_tree()
163
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
164
        tree2.commit('unchanged', rev_id='b3')
165
166
        wt.branch.fetch(tree2.branch)
167
        wt.set_pending_merges(['b3'])
168
169
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
170
        out, err = self.run_bzr('uncommit --force')
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
171
        self.assertEqual(['a1', 'b3'], wt.get_parent_ids())
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
172
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
173
    def test_uncommit_multiple_merge(self):
174
        wt = self.create_simple_tree()
175
176
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
177
        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.
178
3462.1.4 by John Arbash Meinel
fix up the uncommit tests now that set_parent_ids is filtering out ancestors.
179
        tree3 = wt.bzrdir.sprout('tree3').open_workingtree()
180
        tree3.commit('unchanged', rev_id='c3')
181
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
182
        wt.merge_from_branch(tree2.branch)
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
183
        wt.commit('merge b3', rev_id='a3')
184
3462.1.4 by John Arbash Meinel
fix up the uncommit tests now that set_parent_ids is filtering out ancestors.
185
        wt.merge_from_branch(tree3.branch)
186
        wt.commit('merge c3', rev_id='a4')
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
187
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
188
        self.assertEqual(['a4'], wt.get_parent_ids())
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
189
190
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
191
        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.
192
3462.1.4 by John Arbash Meinel
fix up the uncommit tests now that set_parent_ids is filtering out ancestors.
193
        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.
194
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
195
    def test_uncommit_merge_plus_pending(self):
196
        wt = self.create_simple_tree()
197
198
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
199
        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.
200
        tree3 = wt.bzrdir.sprout('tree3').open_workingtree()
201
        tree3.commit('unchanged', rev_id='c3')
202
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
203
        wt.branch.fetch(tree2.branch)
204
        wt.set_pending_merges(['b3'])
205
        wt.commit('merge b3', rev_id='a3')
206
3462.1.4 by John Arbash Meinel
fix up the uncommit tests now that set_parent_ids is filtering out ancestors.
207
208
        wt.merge_from_branch(tree3.branch)
209
210
        self.assertEqual(['a3', 'c3'], wt.get_parent_ids())
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
211
212
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
213
        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
214
3462.1.4 by John Arbash Meinel
fix up the uncommit tests now that set_parent_ids is filtering out ancestors.
215
        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
216
3629.1.1 by John Arbash Meinel
Change 'bzr uncommit' to display the revision ids and log them.
217
    def test_uncommit_shows_log_with_revision_id(self):
218
        wt = self.create_simple_tree()
5010.1.2 by Martin Pool
Uncommit sends some output to stdout; change it to a script test
219
        
220
        script = ScriptRunner()
221
        script.run_script(self, """
222
$ cd tree
223
$ bzr uncommit --force 
5010.1.3 by Martin Pool
uncommit tests aren't isolated; shouldn't check committer/date
224
    2 ...
5010.1.2 by Martin Pool
Uncommit sends some output to stdout; change it to a script test
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
""")
3629.1.1 by John Arbash Meinel
Change 'bzr uncommit' to display the revision ids and log them.
231
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
232
    def test_uncommit_octopus_merge(self):
233
        # 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.
234
        # 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.
235
        wt = self.create_simple_tree()
236
237
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
238
        tree3 = wt.bzrdir.sprout('tree3').open_workingtree()
239
240
        tree2.commit('unchanged', rev_id='b3')
241
        tree3.commit('unchanged', rev_id='c3')
3629.1.1 by John Arbash Meinel
Change 'bzr uncommit' to display the revision ids and log them.
242
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
243
        wt.merge_from_branch(tree2.branch)
4721.3.2 by Vincent Ladeuil
Simplify mutable_tree.has_changes() and update call sites.
244
        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.
245
        wt.commit('merge b3, c3', rev_id='a3')
246
247
        tree2.commit('unchanged', rev_id='b4')
248
        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.
249
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
250
        wt.merge_from_branch(tree3.branch)
4721.3.2 by Vincent Ladeuil
Simplify mutable_tree.has_changes() and update call sites.
251
        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.
252
        wt.commit('merge b4, c4', rev_id='a4')
253
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
254
        self.assertEqual(['a4'], wt.get_parent_ids())
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
255
256
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
257
        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.
258
3462.1.4 by John Arbash Meinel
fix up the uncommit tests now that set_parent_ids is filtering out ancestors.
259
        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
260
261
    def test_uncommit_nonascii(self):
262
        tree = self.make_branch_and_tree('tree')
263
        tree.commit(u'\u1234 message')
3101.1.2 by Aaron Bentley
Improve uncommit test
264
        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
265
        self.assertContainsRe(out, r'\? message')