~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Olaf Conradi
  • Date: 2006-03-28 23:30:02 UTC
  • mto: (1661.1.1 bzr.mbp.remember)
  • mto: This revision was merged to the branch mainline in revision 1663.
  • Revision ID: olaf@conradi.org-20060328233002-f6262df0e19c1963
Added testcases for using pull with --remember. Moved remember code to
beginning of cmd_pull. This remembers the location in case of a failure
during pull.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005 by Canonical Ltd
 
2
# -*- coding: utf-8 -*-
 
3
 
 
4
# This program is free software; you can redistribute it and/or modify
 
5
# it under the terms of the GNU General Public License as published by
 
6
# the Free Software Foundation; either version 2 of the License, or
 
7
# (at your option) any later version.
 
8
 
 
9
# This program is distributed in the hope that it will be useful,
 
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
12
# GNU General Public License for more details.
 
13
 
 
14
# You should have received a copy of the GNU General Public License
 
15
# along with this program; if not, write to the Free Software
 
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
17
 
 
18
 
 
19
"""Black-box tests for bzr pull.
 
20
"""
 
21
 
 
22
import os
 
23
import sys
 
24
 
 
25
from bzrlib.branch import Branch
 
26
from bzrlib.tests.blackbox import ExternalBase
 
27
from bzrlib.osutils import abspath
 
28
 
 
29
 
 
30
class TestPull(ExternalBase):
 
31
 
 
32
    def example_branch(test):
 
33
        test.runbzr('init')
 
34
        file('hello', 'wt').write('foo')
 
35
        test.runbzr('add hello')
 
36
        test.runbzr('commit -m setup hello')
 
37
        file('goodbye', 'wt').write('baz')
 
38
        test.runbzr('add goodbye')
 
39
        test.runbzr('commit -m setup goodbye')
 
40
 
 
41
    def test_pull(self):
 
42
        """Pull changes from one branch to another."""
 
43
        os.mkdir('a')
 
44
        os.chdir('a')
 
45
 
 
46
        self.example_branch()
 
47
        self.runbzr('pull', retcode=3)
 
48
        self.runbzr('missing', retcode=3)
 
49
        self.runbzr('missing .')
 
50
        self.runbzr('missing')
 
51
        if sys.platform not in ('win32', 'cygwin'):
 
52
            # This is equivalent to doing "bzr pull ."
 
53
            # Which means that bzr creates 2 branches grabbing
 
54
            # the same location, and tries to pull.
 
55
            # However, 2 branches mean 2 locks on the same file
 
56
            # which ultimately implies a deadlock.
 
57
            # (non windows platforms allow multiple locks on the
 
58
            # same file by the same calling process)
 
59
            self.runbzr('pull')
 
60
        self.runbzr('pull /', retcode=3)
 
61
        if sys.platform not in ('win32', 'cygwin'):
 
62
            self.runbzr('pull')
 
63
 
 
64
        os.chdir('..')
 
65
        self.runbzr('branch a b')
 
66
        os.chdir('b')
 
67
        self.runbzr('pull')
 
68
        os.mkdir('subdir')
 
69
        self.runbzr('add subdir')
 
70
        self.runbzr('commit -m blah --unchanged')
 
71
        os.chdir('../a')
 
72
        a = Branch.open('.')
 
73
        b = Branch.open('../b')
 
74
        self.assertEquals(a.revision_history(), b.revision_history()[:-1])
 
75
        self.runbzr('pull ../b')
 
76
        self.assertEquals(a.revision_history(), b.revision_history())
 
77
        self.runbzr('commit -m blah2 --unchanged')
 
78
        os.chdir('../b')
 
79
        self.runbzr('commit -m blah3 --unchanged')
 
80
        # no overwrite
 
81
        self.runbzr('pull ../a', retcode=3)
 
82
        os.chdir('..')
 
83
        self.runbzr('branch b overwriteme')
 
84
        os.chdir('overwriteme')
 
85
        self.runbzr('pull --overwrite ../a')
 
86
        overwritten = Branch.open('.')
 
87
        self.assertEqual(overwritten.revision_history(),
 
88
                         a.revision_history())
 
89
        os.chdir('../a')
 
90
        self.runbzr('merge ../b')
 
91
        self.runbzr('commit -m blah4 --unchanged')
 
92
        os.chdir('../b/subdir')
 
93
        self.runbzr('pull ../../a')
 
94
        self.assertEquals(a.revision_history()[-1], b.revision_history()[-1])
 
95
        self.runbzr('commit -m blah5 --unchanged')
 
96
        self.runbzr('commit -m blah6 --unchanged')
 
97
        os.chdir('..')
 
98
        self.runbzr('pull ../a')
 
99
        os.chdir('../a')
 
100
        self.runbzr('commit -m blah7 --unchanged')
 
101
        self.runbzr('merge ../b')
 
102
        self.runbzr('commit -m blah8 --unchanged')
 
103
        self.runbzr('pull ../b')
 
104
        self.runbzr('pull ../b')
 
105
 
 
106
    def test_pull_revision(self):
 
107
        """Pull some changes from one branch to another."""
 
108
        os.mkdir('a')
 
109
        os.chdir('a')
 
110
 
 
111
        self.example_branch()
 
112
        file('hello2', 'wt').write('foo')
 
113
        self.runbzr('add hello2')
 
114
        self.runbzr('commit -m setup hello2')
 
115
        file('goodbye2', 'wt').write('baz')
 
116
        self.runbzr('add goodbye2')
 
117
        self.runbzr('commit -m setup goodbye2')
 
118
 
 
119
        os.chdir('..')
 
120
        self.runbzr('branch -r 1 a b')
 
121
        os.chdir('b')
 
122
        self.runbzr('pull -r 2')
 
123
        a = Branch.open('../a')
 
124
        b = Branch.open('.')
 
125
        self.assertEquals(a.revno(),4)
 
126
        self.assertEquals(b.revno(),2)
 
127
        self.runbzr('pull -r 3')
 
128
        self.assertEquals(b.revno(),3)
 
129
        self.runbzr('pull -r 4')
 
130
        self.assertEquals(a.revision_history(), b.revision_history())
 
131
 
 
132
 
 
133
    def test_overwrite_uptodate(self):
 
134
        # Make sure pull --overwrite overwrites
 
135
        # even if the target branch has merged
 
136
        # everything already.
 
137
        bzr = self.run_bzr
 
138
 
 
139
        def get_rh(expected_len):
 
140
            rh = self.capture('revision-history')
 
141
            # Make sure we don't have trailing empty revisions
 
142
            rh = rh.strip().split('\n')
 
143
            self.assertEqual(len(rh), expected_len)
 
144
            return rh
 
145
 
 
146
        os.mkdir('a')
 
147
        os.chdir('a')
 
148
        bzr('init')
 
149
        open('foo', 'wb').write('original\n')
 
150
        bzr('add', 'foo')
 
151
        bzr('commit', '-m', 'initial commit')
 
152
 
 
153
        os.chdir('..')
 
154
        bzr('branch', 'a', 'b')
 
155
 
 
156
        os.chdir('a')
 
157
        open('foo', 'wb').write('changed\n')
 
158
        bzr('commit', '-m', 'later change')
 
159
 
 
160
        open('foo', 'wb').write('another\n')
 
161
        bzr('commit', '-m', 'a third change')
 
162
 
 
163
        rev_history_a = get_rh(3)
 
164
 
 
165
        os.chdir('../b')
 
166
        bzr('merge', '../a')
 
167
        bzr('commit', '-m', 'merge')
 
168
 
 
169
        rev_history_b = get_rh(2)
 
170
 
 
171
        bzr('pull', '--overwrite', '../a')
 
172
        rev_history_b = get_rh(3)
 
173
 
 
174
        self.assertEqual(rev_history_b, rev_history_a)
 
175
 
 
176
    def test_overwrite_children(self):
 
177
        # Make sure pull --overwrite sets the revision-history
 
178
        # to be identical to the pull source, even if we have convergence
 
179
        bzr = self.run_bzr
 
180
 
 
181
        def get_rh(expected_len):
 
182
            rh = self.capture('revision-history')
 
183
            # Make sure we don't have trailing empty revisions
 
184
            rh = rh.strip().split('\n')
 
185
            self.assertEqual(len(rh), expected_len)
 
186
            return rh
 
187
 
 
188
        os.mkdir('a')
 
189
        os.chdir('a')
 
190
        bzr('init')
 
191
        open('foo', 'wb').write('original\n')
 
192
        bzr('add', 'foo')
 
193
        bzr('commit', '-m', 'initial commit')
 
194
 
 
195
        os.chdir('..')
 
196
        bzr('branch', 'a', 'b')
 
197
 
 
198
        os.chdir('a')
 
199
        open('foo', 'wb').write('changed\n')
 
200
        bzr('commit', '-m', 'later change')
 
201
 
 
202
        open('foo', 'wb').write('another\n')
 
203
        bzr('commit', '-m', 'a third change')
 
204
 
 
205
        rev_history_a = get_rh(3)
 
206
 
 
207
        os.chdir('../b')
 
208
        bzr('merge', '../a')
 
209
        bzr('commit', '-m', 'merge')
 
210
 
 
211
        rev_history_b = get_rh(2)
 
212
 
 
213
        os.chdir('../a')
 
214
        open('foo', 'wb').write('a fourth change\n')
 
215
        bzr('commit', '-m', 'a fourth change')
 
216
 
 
217
        rev_history_a = get_rh(4)
 
218
 
 
219
        # With convergence, we could just pull over the
 
220
        # new change, but with --overwrite, we want to switch our history
 
221
        os.chdir('../b')
 
222
        bzr('pull', '--overwrite', '../a')
 
223
        rev_history_b = get_rh(4)
 
224
 
 
225
        self.assertEqual(rev_history_b, rev_history_a)
 
226
 
 
227
    def test_pull_remember(self):
 
228
        """Pull changes from one branch to another and test parent location."""
 
229
        os.mkdir('a')
 
230
        os.chdir('a')
 
231
 
 
232
        self.example_branch()
 
233
        self.runbzr('branch . ../b')
 
234
        self.runbzr('branch . ../c')
 
235
        file('bottles', 'wt').write('99 bottles of beer on the wall')
 
236
        self.runbzr('add bottles')
 
237
        self.runbzr('commit -m 99_bottles')
 
238
        os.chdir('../b')
 
239
        b = Branch.open('')
 
240
        parent = b.get_parent()
 
241
        # reset parent
 
242
        b.set_parent(None)
 
243
        self.assertEqual(None, b.get_parent())
 
244
        # test pull for failure without parent set
 
245
        out = self.runbzr('pull', retcode=3)
 
246
        self.assertEquals(out,
 
247
                ('','bzr: ERROR: No pull location known or specified.\n'))
 
248
        # test implicit --remember when no parent set, this pull conflicts
 
249
        file('bottles', 'wt').write('98 bottles of beer on the wall')
 
250
        self.runbzr('add bottles')
 
251
        self.runbzr('commit -m 98_bottles')
 
252
        out = self.runbzr('pull ../a', retcode=3)
 
253
        self.assertEquals(out,
 
254
                ('','bzr: ERROR: These branches have diverged.  Try merge.\n'))
 
255
        self.assertEquals(abspath(b.get_parent()), abspath(parent))
 
256
        # test implicit --remember after resolving previous failure
 
257
        self.runbzr('uncommit --force')
 
258
        self.runbzr('pull')
 
259
        self.assertEquals(abspath(b.get_parent()), abspath(parent))
 
260
        # test explicit --remember
 
261
        self.runbzr('pull ../c --remember')
 
262
        self.assertEquals(abspath(b.get_parent()), abspath('../c'))