~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_uncommit.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2006-08-29 15:50:49 UTC
  • mfrom: (1551.8.18 Aaron's mergeable stuff)
  • Revision ID: pqm@pqm.ubuntu.com-20060829155049-e4506d82e4e703ef
Tweak font settings in stylesheet

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005, 2006 by Canonical Ltd
 
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."""
 
18
 
 
19
import os
 
20
 
 
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
 
 
26
 
 
27
class TestUncommit(TestCaseWithTransport):
 
28
 
 
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'])
 
33
        wt.commit('initial commit', rev_id='a1')
 
34
 
 
35
        open('tree/a', 'wb').write('new contents of a\n')
 
36
        wt.commit('second commit', rev_id='a2')
 
37
 
 
38
        return wt
 
39
 
 
40
    def test_uncommit(self):
 
41
        """Test uncommit functionality."""
 
42
        wt = self.create_simple_tree()
 
43
 
 
44
        os.chdir('tree')
 
45
        out, err = self.run_bzr('uncommit', '--dry-run', '--force')
 
46
        self.assertContainsRe(out, 'Dry-run')
 
47
        self.assertNotContainsRe(out, 'initial commit')
 
48
        self.assertContainsRe(out, 'second commit')
 
49
 
 
50
        # Nothing has changed
 
51
        self.assertEqual('a2', wt.last_revision())
 
52
 
 
53
        # Uncommit, don't prompt
 
54
        out, err = self.run_bzr('uncommit', '--force')
 
55
        self.assertNotContainsRe(out, 'initial commit')
 
56
        self.assertContainsRe(out, 'second commit')
 
57
 
 
58
        # This should look like we are back in revno 1
 
59
        self.assertEqual('a1', wt.last_revision())
 
60
        out, err = self.run_bzr('status')
 
61
        self.assertEquals(out, 'modified:\n  a\n')
 
62
 
 
63
    def test_uncommit_checkout(self):
 
64
        wt = self.create_simple_tree()
 
65
 
 
66
        checkout_tree = wt.bzrdir.sprout('checkout').open_workingtree()
 
67
        checkout_tree.branch.bind(wt.branch)
 
68
 
 
69
        self.assertEqual('a2', checkout_tree.last_revision())
 
70
 
 
71
        os.chdir('checkout')
 
72
        out, err = self.run_bzr('uncommit', '--dry-run', '--force')
 
73
        self.assertContainsRe(out, 'Dry-run')
 
74
        self.assertNotContainsRe(out, 'initial commit')
 
75
        self.assertContainsRe(out, 'second commit')
 
76
 
 
77
        self.assertEqual('a2', checkout_tree.last_revision())
 
78
 
 
79
        out, err = self.run_bzr('uncommit', '--force')
 
80
        self.assertNotContainsRe(out, 'initial commit')
 
81
        self.assertContainsRe(out, 'second commit')
 
82
 
 
83
        # uncommit in a checkout should uncommit the parent branch
 
84
        # (but doesn't effect the other working tree)
 
85
        self.assertEquals('a1', checkout_tree.last_revision())
 
86
        self.assertEquals('a1', wt.branch.last_revision())
 
87
        self.assertEquals('a2', wt.last_revision())
 
88
 
 
89
    def test_uncommit_bound(self):
 
90
        os.mkdir('a')
 
91
        a = BzrDirMetaFormat1().initialize('a')
 
92
        a.create_repository()
 
93
        a.create_branch()
 
94
        t = a.create_workingtree()
 
95
        t.commit('commit 1')
 
96
        t.commit('commit 2')
 
97
        t.commit('commit 3')
 
98
        b = t.bzrdir.sprout('b').open_branch()
 
99
        b.bind(t.branch)
 
100
        uncommit.uncommit(b)
 
101
        t.set_last_revision(t.branch.last_revision())
 
102
        self.assertEqual(len(b.revision_history()), 2)
 
103
        self.assertEqual(len(t.branch.revision_history()), 2)
 
104
        t.commit('commit 3b')
 
105
        self.assertRaises(BoundBranchOutOfDate, uncommit.uncommit, b)
 
106
        b.pull(t.branch)
 
107
        uncommit.uncommit(b)
 
108
 
 
109
    def test_uncommit_revision(self):
 
110
        wt = self.create_simple_tree()
 
111
 
 
112
        os.chdir('tree')
 
113
        out, err = self.run_bzr('uncommit', '-r1', '--force')
 
114
 
 
115
        self.assertNotContainsRe(out, 'initial commit')
 
116
        self.assertContainsRe(out, 'second commit')
 
117
        self.assertEqual('a1', wt.last_revision())
 
118
        self.assertEqual('a1', wt.branch.last_revision())
 
119
 
 
120
    def test_uncommit_neg_1(self):
 
121
        wt = self.create_simple_tree()
 
122
        os.chdir('tree')
 
123
        out, err = self.run_bzr('uncommit', '-r', '-1', retcode=1)
 
124
        self.assertEqual('No revisions to uncommit.\n', out)
 
125
 
 
126
    def test_uncommit_merges(self):
 
127
        wt = self.create_simple_tree()
 
128
 
 
129
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
 
130
 
 
131
        tree2.commit('unchanged', rev_id='b3')
 
132
        tree2.commit('unchanged', rev_id='b4')
 
133
 
 
134
        wt.branch.fetch(tree2.branch)
 
135
        wt.set_pending_merges(['b4'])
 
136
        wt.commit('merge b4', rev_id='a3')
 
137
 
 
138
        self.assertEqual('a3', wt.last_revision())
 
139
        self.assertEqual([], wt.pending_merges())
 
140
 
 
141
        os.chdir('tree')
 
142
        out, err = self.run_bzr('uncommit', '--force')
 
143
 
 
144
        self.assertEqual('a2', wt.last_revision())
 
145
        self.assertEqual(['b4'], wt.pending_merges())
 
146
 
 
147
    def test_uncommit_pending_merge(self):
 
148
        wt = self.create_simple_tree()
 
149
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
 
150
        tree2.commit('unchanged', rev_id='b3')
 
151
 
 
152
        wt.branch.fetch(tree2.branch)
 
153
        wt.set_pending_merges(['b3'])
 
154
 
 
155
        os.chdir('tree')
 
156
        out, err = self.run_bzr('uncommit', '--force')
 
157
        self.assertEqual('a1', wt.last_revision())
 
158
        self.assertEqual(['b3'], wt.pending_merges())
 
159
 
 
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')
 
166
        wt.branch.fetch(tree2.branch)
 
167
        wt.set_pending_merges(['b3'])
 
168
        wt.commit('merge b3', rev_id='a3')
 
169
 
 
170
        tree2.commit('unchanged', rev_id='b4')
 
171
        wt.branch.fetch(tree2.branch)
 
172
        wt.set_pending_merges(['b4'])
 
173
        wt.commit('merge b4', rev_id='a4')
 
174
 
 
175
        self.assertEqual('a4', wt.last_revision())
 
176
        self.assertEqual([], wt.pending_merges())
 
177
 
 
178
        os.chdir('tree')
 
179
        out, err = self.run_bzr('uncommit', '--force', '-r', '2')
 
180
 
 
181
        self.assertEqual('a2', wt.last_revision())
 
182
        self.assertEqual(['b3', 'b4'], wt.pending_merges())
 
183
 
 
184
    def test_uncommit_merge_plus_pending(self):
 
185
        wt = self.create_simple_tree()
 
186
 
 
187
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
 
188
 
 
189
        tree2.commit('unchanged', rev_id='b3')
 
190
        wt.branch.fetch(tree2.branch)
 
191
        wt.set_pending_merges(['b3'])
 
192
        wt.commit('merge b3', rev_id='a3')
 
193
 
 
194
        tree2.commit('unchanged', rev_id='b4')
 
195
        wt.branch.fetch(tree2.branch)
 
196
        wt.set_pending_merges(['b4'])
 
197
 
 
198
        self.assertEqual('a3', wt.last_revision())
 
199
        self.assertEqual(['b4'], wt.pending_merges())
 
200
 
 
201
        os.chdir('tree')
 
202
        out, err = self.run_bzr('uncommit', '--force', '-r', '2')
 
203
 
 
204
        self.assertEqual('a2', wt.last_revision())
 
205
        self.assertEqual(['b3', 'b4'], wt.pending_merges())
 
206
 
 
207
    def test_uncommit_octopus_merge(self):
 
208
        # Check that uncommit keeps the pending merges in the same order
 
209
        wt = self.create_simple_tree()
 
210
 
 
211
        tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
 
212
        tree3 = wt.bzrdir.sprout('tree3').open_workingtree()
 
213
 
 
214
        tree2.commit('unchanged', rev_id='b3')
 
215
        tree3.commit('unchanged', rev_id='c3')
 
216
        wt.branch.fetch(tree2.branch)
 
217
        wt.branch.fetch(tree3.branch)
 
218
        wt.set_pending_merges(['b3', 'c3'])
 
219
        wt.commit('merge b3, c3', rev_id='a3')
 
220
 
 
221
        tree2.commit('unchanged', rev_id='b4')
 
222
        tree3.commit('unchanged', rev_id='c4')
 
223
        wt.branch.fetch(tree2.branch)
 
224
        wt.branch.fetch(tree3.branch)
 
225
        wt.set_pending_merges(['c4', 'b4'])
 
226
        wt.commit('merge b4, c4', rev_id='a4')
 
227
 
 
228
        self.assertEqual('a4', wt.last_revision())
 
229
        self.assertEqual([], wt.pending_merges())
 
230
 
 
231
        os.chdir('tree')
 
232
        out, err = self.run_bzr('uncommit', '--force', '-r', '2')
 
233
 
 
234
        self.assertEqual('a2', wt.last_revision())
 
235
        self.assertEqual(['b3', 'c3', 'c4', 'b4'], wt.pending_merges())