~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

[merge] 0.7-bugfix: Fix fileid_involved to unescape xml characters, fix StubServer to handle paramiko > 1.5.2

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