~bzr-pqm/bzr/bzr.dev

2052.3.2 by John Arbash Meinel
Change Copyright .. by Canonical to Copyright ... Canonical
1
# Copyright (C) 2005, 2006 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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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
25
26
27
class TestUncommit(TestCaseWithTransport):
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
28
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
29
    def create_simple_tree(self):
30
        wt = self.make_branch_and_tree('tree')
31
        self.build_tree(['tree/a', 'tree/b', 'tree/c'])
32
        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
33
        wt.commit('initial commit', rev_id='a1')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
34
35
        open('tree/a', 'wb').write('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
36
        wt.commit('second commit', rev_id='a2')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
37
38
        return wt
39
0.3.11 by John Arbash Meinel
Updated to latest bzr.dev code, and added tests.
40
    def test_uncommit(self):
41
        """Test uncommit functionality."""
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
42
        wt = self.create_simple_tree()
43
44
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
45
        out, err = self.run_bzr('uncommit --dry-run --force')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
46
        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
47
        self.assertNotContainsRe(out, 'initial commit')
48
        self.assertContainsRe(out, 'second commit')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
49
50
        # Nothing has changed
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
51
        self.assertEqual(['a2'], wt.get_parent_ids())
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
52
53
        # Uncommit, don't prompt
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
54
        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
55
        self.assertNotContainsRe(out, 'initial commit')
56
        self.assertContainsRe(out, 'second commit')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
57
58
        # This should look like we are back in revno 1
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
59
        self.assertEqual(['a1'], wt.get_parent_ids())
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
60
        out, err = self.run_bzr('status')
61
        self.assertEquals(out, 'modified:\n  a\n')
62
2948.2.1 by John Arbash Meinel
Fix 'bzr uncommit' when there is no revision history.
63
    def test_uncommit_no_history(self):
64
        wt = self.make_branch_and_tree('tree')
65
        out, err = self.run_bzr('uncommit --force', retcode=1)
66
        self.assertEqual('', err)
67
        self.assertEqual('No revisions to uncommit.\n', out)
68
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
69
    def test_uncommit_checkout(self):
70
        wt = self.create_simple_tree()
1997.1.5 by Robert Collins
``Branch.bind(other_branch)`` no longer takes a write lock on the
71
        checkout_tree = wt.branch.create_checkout('checkout')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
72
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
73
        self.assertEqual(['a2'], checkout_tree.get_parent_ids())
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
74
75
        os.chdir('checkout')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
76
        out, err = self.run_bzr('uncommit --dry-run --force')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
77
        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
78
        self.assertNotContainsRe(out, 'initial commit')
79
        self.assertContainsRe(out, 'second commit')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
80
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
81
        self.assertEqual(['a2'], checkout_tree.get_parent_ids())
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
82
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
83
        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
84
        self.assertNotContainsRe(out, 'initial commit')
85
        self.assertContainsRe(out, 'second commit')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
86
87
        # uncommit in a checkout should uncommit the parent branch
88
        # (but doesn't effect the other working tree)
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
89
        self.assertEquals(['a1'], checkout_tree.get_parent_ids())
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
90
        self.assertEquals('a1', wt.branch.last_revision())
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
91
        self.assertEquals(['a2'], wt.get_parent_ids())
1558.9.1 by Aaron Bentley
Fix uncommit to handle bound branches, and to do locking
92
93
    def test_uncommit_bound(self):
94
        os.mkdir('a')
95
        a = BzrDirMetaFormat1().initialize('a')
96
        a.create_repository()
97
        a.create_branch()
1908.6.1 by Robert Collins
Change all callers of set_last_revision to use set_parent_trees.
98
        t_a = a.create_workingtree()
99
        t_a.commit('commit 1')
100
        t_a.commit('commit 2')
101
        t_a.commit('commit 3')
1997.1.5 by Robert Collins
``Branch.bind(other_branch)`` no longer takes a write lock on the
102
        b = t_a.branch.create_checkout('b').branch
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
103
        uncommit.uncommit(b)
1558.9.1 by Aaron Bentley
Fix uncommit to handle bound branches, and to do locking
104
        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.
105
        self.assertEqual(len(t_a.branch.revision_history()), 2)
106
        # update A's tree to not have the uncomitted revision referenced.
107
        t_a.update()
108
        t_a.commit('commit 3b')
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
109
        self.assertRaises(BoundBranchOutOfDate, uncommit.uncommit, b)
1908.6.1 by Robert Collins
Change all callers of set_last_revision to use set_parent_trees.
110
        b.pull(t_a.branch)
1850.3.1 by John Arbash Meinel
cleanup the uncommit tests
111
        uncommit.uncommit(b)
1558.9.1 by Aaron Bentley
Fix uncommit to handle bound branches, and to do locking
112
1850.3.2 by John Arbash Meinel
Change uncommit -r 10 so that it uncommits *to* 10, rather than removing 10
113
    def test_uncommit_revision(self):
114
        wt = self.create_simple_tree()
115
116
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
117
        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
118
119
        self.assertNotContainsRe(out, 'initial commit')
120
        self.assertContainsRe(out, 'second commit')
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
121
        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
122
        self.assertEqual('a1', wt.branch.last_revision())
123
124
    def test_uncommit_neg_1(self):
125
        wt = self.create_simple_tree()
126
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
127
        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
128
        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.
129
130
    def test_uncommit_merges(self):
131
        wt = self.create_simple_tree()
132
133
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
134
135
        tree2.commit('unchanged', rev_id='b3')
136
        tree2.commit('unchanged', rev_id='b4')
137
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
138
        wt.merge_from_branch(tree2.branch)
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
139
        wt.commit('merge b4', rev_id='a3')
140
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
141
        self.assertEqual(['a3'], wt.get_parent_ids())
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
142
143
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
144
        out, err = self.run_bzr('uncommit --force')
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
145
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
146
        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.
147
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
148
    def test_uncommit_pending_merge(self):
149
        wt = self.create_simple_tree()
150
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
151
        tree2.commit('unchanged', rev_id='b3')
152
153
        wt.branch.fetch(tree2.branch)
154
        wt.set_pending_merges(['b3'])
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')
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
158
        self.assertEqual(['a1', 'b3'], wt.get_parent_ids())
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
159
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
160
    def test_uncommit_multiple_merge(self):
161
        wt = self.create_simple_tree()
162
163
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
164
165
        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.
166
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
167
        wt.merge_from_branch(tree2.branch)
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
168
        wt.commit('merge b3', rev_id='a3')
169
170
        tree2.commit('unchanged', rev_id='b4')
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
171
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
172
        wt.merge_from_branch(tree2.branch)
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
173
        wt.commit('merge b4', rev_id='a4')
174
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
175
        self.assertEqual(['a4'], wt.get_parent_ids())
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
176
177
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
178
        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.
179
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
180
        self.assertEqual(['a2', 'b3', 'b4'], wt.get_parent_ids())
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
181
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
182
    def test_uncommit_merge_plus_pending(self):
183
        wt = self.create_simple_tree()
184
185
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
186
187
        tree2.commit('unchanged', rev_id='b3')
188
        wt.branch.fetch(tree2.branch)
189
        wt.set_pending_merges(['b3'])
190
        wt.commit('merge b3', rev_id='a3')
191
192
        tree2.commit('unchanged', rev_id='b4')
193
        wt.branch.fetch(tree2.branch)
194
        wt.set_pending_merges(['b4'])
195
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
196
        self.assertEqual(['a3', 'b4'], wt.get_parent_ids())
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
197
198
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
199
        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
200
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
201
        self.assertEqual(['a2', 'b3', 'b4'], wt.get_parent_ids())
1956.1.1 by John Arbash Meinel
Fix bug #57660: 'bzr uncommit' should preserve pending merges
202
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
203
    def test_uncommit_octopus_merge(self):
204
        # Check that uncommit keeps the pending merges in the same order
205
        wt = self.create_simple_tree()
206
207
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
208
        tree3 = wt.bzrdir.sprout('tree3').open_workingtree()
209
210
        tree2.commit('unchanged', rev_id='b3')
211
        tree3.commit('unchanged', rev_id='c3')
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
212
        
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
213
        wt.merge_from_branch(tree2.branch)
214
        wt.merge_from_branch(tree3.branch)
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
215
        wt.commit('merge b3, c3', rev_id='a3')
216
217
        tree2.commit('unchanged', rev_id='b4')
218
        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.
219
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
220
        wt.merge_from_branch(tree3.branch)
221
        wt.merge_from_branch(tree2.branch)
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
222
        wt.commit('merge b4, c4', rev_id='a4')
223
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
224
        self.assertEqual(['a4'], wt.get_parent_ids())
1850.3.5 by John Arbash Meinel
Fix bug 31426, have uncommit keep track of pending merges.
225
226
        os.chdir('tree')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
227
        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.
228
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
229
        self.assertEqual(['a2', 'b3', 'c3', 'c4', 'b4'], wt.get_parent_ids())