13
13
# You should have received a copy of the GNU General Public License
14
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
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
"""Tests for the 'checkout' CLI command."""
19
from cStringIO import StringIO
25
import bzrlib.bzrdir as bzrdir
26
import bzrlib.errors as errors
27
from bzrlib.tests.blackbox import ExternalBase
30
class TestCheckout(ExternalBase):
22
branch as _mod_branch,
27
from bzrlib.tests import (
28
TestCaseWithTransport,
30
from bzrlib.tests.matchers import ContainsNoVfsCalls
31
from bzrlib.tests.features import (
36
class TestCheckout(TestCaseWithTransport):
33
39
super(TestCheckout, self).setUp()
34
40
tree = bzrdir.BzrDir.create_standalone_workingtree('branch')
54
60
result.open_branch().bzrdir.root_transport.base)
56
62
def test_checkout_dash_r(self):
57
self.runbzr('checkout -r -2 branch checkout')
63
out, err = self.run_bzr(['checkout', '-r', '-2', 'branch', 'checkout'])
58
64
# the working tree should now be at revision '1' with the content
60
66
result = bzrdir.BzrDir.open('checkout')
61
67
self.assertEqual(['1'], result.open_workingtree().get_parent_ids())
62
self.failIfExists('checkout/added_in_2')
68
self.assertPathDoesNotExist('checkout/added_in_2')
64
70
def test_checkout_light_dash_r(self):
65
self.runbzr('checkout --lightweight -r -2 branch checkout')
71
out, err = self.run_bzr(['checkout','--lightweight', '-r', '-2',
72
'branch', 'checkout'])
66
73
# the working tree should now be at revision '1' with the content
68
75
result = bzrdir.BzrDir.open('checkout')
69
76
self.assertEqual(['1'], result.open_workingtree().get_parent_ids())
70
self.failIfExists('checkout/added_in_2')
77
self.assertPathDoesNotExist('checkout/added_in_2')
79
def test_checkout_into_empty_dir(self):
80
self.make_bzrdir('checkout')
81
out, err = self.run_bzr(['checkout', 'branch', 'checkout'])
82
result = bzrdir.BzrDir.open('checkout')
83
tree = result.open_workingtree()
84
branch = result.open_branch()
72
86
def test_checkout_reconstitutes_working_trees(self):
73
87
# doing a 'bzr checkout' in the directory of a branch with no tree
98
112
branch.bzrdir.open_workingtree()
100
114
out, err = self.run_bzr('diff')
116
def _test_checkout_existing_dir(self, lightweight):
117
source = self.make_branch_and_tree('source')
118
self.build_tree_contents([('source/file1', 'content1'),
119
('source/file2', 'content2'),])
120
source.add(['file1', 'file2'])
121
source.commit('added files')
122
self.build_tree_contents([('target/', ''),
123
('target/file1', 'content1'),
124
('target/file2', 'content3'),])
125
cmd = ['checkout', 'source', 'target']
127
cmd.append('--lightweight')
128
self.run_bzr('checkout source target')
129
# files with unique content should be moved
130
self.assertPathExists('target/file2.moved')
131
# files with content matching tree should not be moved
132
self.assertPathDoesNotExist('target/file1.moved')
134
def test_checkout_existing_dir_heavy(self):
135
self._test_checkout_existing_dir(False)
137
def test_checkout_existing_dir_lightweight(self):
138
self._test_checkout_existing_dir(True)
140
def test_checkout_in_branch_with_r(self):
141
branch = _mod_branch.Branch.open('branch')
142
branch.bzrdir.destroy_workingtree()
143
self.run_bzr('checkout -r 1', working_dir='branch')
144
tree = workingtree.WorkingTree.open('branch')
145
self.assertEqual('1', tree.last_revision())
146
branch.bzrdir.destroy_workingtree()
147
self.run_bzr('checkout -r 0', working_dir='branch')
148
self.assertEqual('null:', tree.last_revision())
150
def test_checkout_files_from(self):
151
branch = _mod_branch.Branch.open('branch')
152
self.run_bzr(['checkout', 'branch', 'branch2', '--files-from',
155
def test_checkout_hardlink(self):
156
self.requireFeature(HardlinkFeature)
157
source = self.make_branch_and_tree('source')
158
self.build_tree(['source/file1'])
160
source.commit('added file')
161
out, err = self.run_bzr('checkout source target --hardlink')
162
source_stat = os.stat('source/file1')
163
target_stat = os.stat('target/file1')
164
self.assertEqual(source_stat, target_stat)
166
def test_checkout_hardlink_files_from(self):
167
self.requireFeature(HardlinkFeature)
168
source = self.make_branch_and_tree('source')
169
self.build_tree(['source/file1'])
171
source.commit('added file')
172
source.bzrdir.sprout('second')
173
out, err = self.run_bzr('checkout source target --hardlink'
174
' --files-from second')
175
second_stat = os.stat('second/file1')
176
target_stat = os.stat('target/file1')
177
self.assertEqual(second_stat, target_stat)
179
def test_colo_checkout(self):
180
source = self.make_branch_and_tree('source', format='development-colo')
181
self.build_tree(['source/file1'])
183
source.commit('added file')
184
target = source.bzrdir.sprout('file:second,branch=somebranch',
185
create_tree_if_local=False)
186
out, err = self.run_bzr('checkout file:,branch=somebranch .',
187
working_dir='second')
188
# We should always be creating a lighweight checkout for colocated
191
target.open_branch(name='somebranch').base,
192
target.get_branch_reference(name=""))
195
class TestSmartServerCheckout(TestCaseWithTransport):
197
def test_heavyweight_checkout(self):
198
self.setup_smart_server_with_call_log()
199
t = self.make_branch_and_tree('from')
200
for count in range(9):
201
t.commit(message='commit %d' % count)
202
self.reset_smart_call_log()
203
out, err = self.run_bzr(['checkout', self.get_url('from'), 'target'])
204
# This figure represent the amount of work to perform this use case. It
205
# is entirely ok to reduce this number if a test fails due to rpc_count
206
# being too low. If rpc_count increases, more network roundtrips have
207
# become necessary for this use case. Please do not adjust this number
208
# upwards without agreement from bzr's network support maintainers.
209
self.assertLength(10, self.hpss_calls)
210
self.assertLength(1, self.hpss_connections)
211
self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
213
def test_lightweight_checkout(self):
214
self.setup_smart_server_with_call_log()
215
t = self.make_branch_and_tree('from')
216
for count in range(9):
217
t.commit(message='commit %d' % count)
218
self.reset_smart_call_log()
219
out, err = self.run_bzr(['checkout', '--lightweight', self.get_url('from'),
221
# This figure represent the amount of work to perform this use case. It
222
# is entirely ok to reduce this number if a test fails due to rpc_count
223
# being too low. If rpc_count increases, more network roundtrips have
224
# become necessary for this use case. Please do not adjust this number
225
# upwards without agreement from bzr's network support maintainers.
226
self.assertLength(15, self.hpss_calls)
227
self.assertThat(self.hpss_calls, ContainsNoVfsCalls)