~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: John Arbash Meinel
  • Date: 2005-12-01 19:27:48 UTC
  • mto: (1185.50.19 bzr-jam-integration)
  • mto: This revision was merged to the branch mainline in revision 1532.
  • Revision ID: john@arbash-meinel.com-20051201192748-369238cd06ecf7e8
Added osutils.mkdtemp()

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.
 
20
 
 
21
These check that it behaves properly when it's invoked through the regular
 
22
command-line interface. This doesn't actually run a new interpreter but 
 
23
rather starts again from the run_bzr function.
 
24
"""
 
25
 
 
26
 
 
27
# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
28
# Note: Please don't add new tests here, it's too big and bulky.  Instead add
 
29
# them into small suites in bzrlib.tests.blackbox.test_FOO for the particular
 
30
# UI command/aspect that is being tested.
 
31
 
 
32
 
 
33
from cStringIO import StringIO
 
34
import os
 
35
import re
 
36
import shutil
 
37
import sys
 
38
 
 
39
from bzrlib.branch import Branch
 
40
from bzrlib.clone import copy_branch
 
41
from bzrlib.errors import BzrCommandError
 
42
from bzrlib.osutils import has_symlinks
 
43
from bzrlib.tests.HTTPTestUtil import TestCaseWithWebserver
 
44
from bzrlib.tests.blackbox import ExternalBase
 
45
 
 
46
class TestPull(ExternalBase):
 
47
 
 
48
    def example_branch(test):
 
49
        test.runbzr('init')
 
50
        file('hello', 'wt').write('foo')
 
51
        test.runbzr('add hello')
 
52
        test.runbzr('commit -m setup hello')
 
53
        file('goodbye', 'wt').write('baz')
 
54
        test.runbzr('add goodbye')
 
55
        test.runbzr('commit -m setup goodbye')
 
56
 
 
57
    def test_pull(self):
 
58
        """Pull changes from one branch to another."""
 
59
        os.mkdir('a')
 
60
        os.chdir('a')
 
61
 
 
62
        self.example_branch()
 
63
        self.runbzr('pull', retcode=3)
 
64
        self.runbzr('missing', retcode=3)
 
65
        self.runbzr('missing .')
 
66
        self.runbzr('missing')
 
67
        if sys.platform not in ('win32', 'cygwin'):
 
68
            # This is equivalent to doing "bzr pull ."
 
69
            # Which means that bzr creates 2 branches grabbing
 
70
            # the same location, and tries to pull.
 
71
            # However, 2 branches mean 2 locks on the same file
 
72
            # which ultimately implies a deadlock.
 
73
            # (non windows platforms allow multiple locks on the
 
74
            # same file by the same calling process)
 
75
            self.runbzr('pull')
 
76
        self.runbzr('pull /', retcode=3)
 
77
        if sys.platform not in ('win32', 'cygwin'):
 
78
            self.runbzr('pull')
 
79
 
 
80
        os.chdir('..')
 
81
        self.runbzr('branch a b')
 
82
        os.chdir('b')
 
83
        self.runbzr('pull')
 
84
        os.mkdir('subdir')
 
85
        self.runbzr('add subdir')
 
86
        self.runbzr('commit -m blah --unchanged')
 
87
        os.chdir('../a')
 
88
        a = Branch.open('.')
 
89
        b = Branch.open('../b')
 
90
        self.assertEquals(a.revision_history(), b.revision_history()[:-1])
 
91
        self.runbzr('pull ../b')
 
92
        self.assertEquals(a.revision_history(), b.revision_history())
 
93
        self.runbzr('commit -m blah2 --unchanged')
 
94
        os.chdir('../b')
 
95
        self.runbzr('commit -m blah3 --unchanged')
 
96
        # no overwrite
 
97
        self.runbzr('pull ../a', retcode=3)
 
98
        os.chdir('..')
 
99
        self.runbzr('branch b overwriteme')
 
100
        os.chdir('overwriteme')
 
101
        self.runbzr('pull --overwrite ../a')
 
102
        overwritten = Branch.open('.')
 
103
        self.assertEqual(overwritten.revision_history(),
 
104
                         a.revision_history())
 
105
        os.chdir('../a')
 
106
        self.runbzr('merge ../b')
 
107
        self.runbzr('commit -m blah4 --unchanged')
 
108
        os.chdir('../b/subdir')
 
109
        self.runbzr('pull ../../a')
 
110
        self.assertEquals(a.revision_history()[-1], b.revision_history()[-1])
 
111
        self.runbzr('commit -m blah5 --unchanged')
 
112
        self.runbzr('commit -m blah6 --unchanged')
 
113
        os.chdir('..')
 
114
        self.runbzr('pull ../a')
 
115
        os.chdir('../a')
 
116
        self.runbzr('commit -m blah7 --unchanged')
 
117
        self.runbzr('merge ../b')
 
118
        self.runbzr('commit -m blah8 --unchanged')
 
119
        self.runbzr('pull ../b')
 
120
        self.runbzr('pull ../b')
 
121
 
 
122
    def test_overwrite_uptodate(self):
 
123
        # Make sure pull --overwrite overwrites
 
124
        # even if the target branch has merged
 
125
        # everything already.
 
126
        bzr = self.run_bzr
 
127
 
 
128
        def get_rh(expected_len):
 
129
            rh = self.capture('revision-history')
 
130
            # Make sure we don't have trailing empty revisions
 
131
            rh = rh.strip().split('\n')
 
132
            self.assertEqual(len(rh), expected_len)
 
133
            return rh
 
134
 
 
135
        os.mkdir('a')
 
136
        os.chdir('a')
 
137
        bzr('init')
 
138
        open('foo', 'wb').write('original\n')
 
139
        bzr('add', 'foo')
 
140
        bzr('commit', '-m', 'initial commit')
 
141
 
 
142
        os.chdir('..')
 
143
        bzr('branch', 'a', 'b')
 
144
 
 
145
        os.chdir('a')
 
146
        open('foo', 'wb').write('changed\n')
 
147
        bzr('commit', '-m', 'later change')
 
148
 
 
149
        open('foo', 'wb').write('another\n')
 
150
        bzr('commit', '-m', 'a third change')
 
151
 
 
152
        rev_history_a = get_rh(3)
 
153
 
 
154
        os.chdir('../b')
 
155
        bzr('merge', '../a')
 
156
        bzr('commit', '-m', 'merge')
 
157
 
 
158
        rev_history_b = get_rh(2)
 
159
 
 
160
        bzr('pull', '--overwrite', '../a')
 
161
        rev_history_b = get_rh(3)
 
162
 
 
163
        self.assertEqual(rev_history_b, rev_history_a)
 
164
 
 
165
    def test_overwrite_children(self):
 
166
        # Make sure pull --overwrite sets the revision-history
 
167
        # to be identical to the pull source, even if we have convergence
 
168
        bzr = self.run_bzr
 
169
 
 
170
        def get_rh(expected_len):
 
171
            rh = self.capture('revision-history')
 
172
            # Make sure we don't have trailing empty revisions
 
173
            rh = rh.strip().split('\n')
 
174
            self.assertEqual(len(rh), expected_len)
 
175
            return rh
 
176
 
 
177
        os.mkdir('a')
 
178
        os.chdir('a')
 
179
        bzr('init')
 
180
        open('foo', 'wb').write('original\n')
 
181
        bzr('add', 'foo')
 
182
        bzr('commit', '-m', 'initial commit')
 
183
 
 
184
        os.chdir('..')
 
185
        bzr('branch', 'a', 'b')
 
186
 
 
187
        os.chdir('a')
 
188
        open('foo', 'wb').write('changed\n')
 
189
        bzr('commit', '-m', 'later change')
 
190
 
 
191
        open('foo', 'wb').write('another\n')
 
192
        bzr('commit', '-m', 'a third change')
 
193
 
 
194
        rev_history_a = get_rh(3)
 
195
 
 
196
        os.chdir('../b')
 
197
        bzr('merge', '../a')
 
198
        bzr('commit', '-m', 'merge')
 
199
 
 
200
        rev_history_b = get_rh(2)
 
201
 
 
202
        os.chdir('../a')
 
203
        open('foo', 'wb').write('a fourth change\n')
 
204
        bzr('commit', '-m', 'a fourth change')
 
205
 
 
206
        rev_history_a = get_rh(4)
 
207
 
 
208
        # With convergence, we could just pull over the
 
209
        # new change, but with --overwrite, we want to switch our history
 
210
        os.chdir('../b')
 
211
        bzr('pull', '--overwrite', '../a')
 
212
        rev_history_b = get_rh(4)
 
213
 
 
214
        self.assertEqual(rev_history_b, rev_history_a)
 
215
 
 
216