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.run_bzr('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.run_bzr('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')
72
79
def test_checkout_reconstitutes_working_trees(self):
73
80
# doing a 'bzr checkout' in the directory of a branch with no tree
98
105
branch.bzrdir.open_workingtree()
100
107
out, err = self.run_bzr('diff')
109
def _test_checkout_existing_dir(self, lightweight):
110
source = self.make_branch_and_tree('source')
111
self.build_tree_contents([('source/file1', 'content1'),
112
('source/file2', 'content2'),])
113
source.add(['file1', 'file2'])
114
source.commit('added files')
115
self.build_tree_contents([('target/', ''),
116
('target/file1', 'content1'),
117
('target/file2', 'content3'),])
118
cmd = ['checkout', 'source', 'target']
120
cmd.append('--lightweight')
121
self.run_bzr('checkout source target')
122
# files with unique content should be moved
123
self.assertPathExists('target/file2.moved')
124
# files with content matching tree should not be moved
125
self.assertPathDoesNotExist('target/file1.moved')
127
def test_checkout_existing_dir_heavy(self):
128
self._test_checkout_existing_dir(False)
130
def test_checkout_existing_dir_lightweight(self):
131
self._test_checkout_existing_dir(True)
133
def test_checkout_in_branch_with_r(self):
134
branch = _mod_branch.Branch.open('branch')
135
branch.bzrdir.destroy_workingtree()
137
self.run_bzr('checkout -r 1')
138
tree = workingtree.WorkingTree.open('.')
139
self.assertEqual('1', tree.last_revision())
140
branch.bzrdir.destroy_workingtree()
141
self.run_bzr('checkout -r 0')
142
self.assertEqual('null:', tree.last_revision())
144
def test_checkout_files_from(self):
145
branch = _mod_branch.Branch.open('branch')
146
self.run_bzr(['checkout', 'branch', 'branch2', '--files-from',
149
def test_checkout_hardlink(self):
150
self.requireFeature(HardlinkFeature)
151
source = self.make_branch_and_tree('source')
152
self.build_tree(['source/file1'])
154
source.commit('added file')
155
out, err = self.run_bzr('checkout source target --hardlink')
156
source_stat = os.stat('source/file1')
157
target_stat = os.stat('target/file1')
158
self.assertEqual(source_stat, target_stat)
160
def test_checkout_hardlink_files_from(self):
161
self.requireFeature(HardlinkFeature)
162
source = self.make_branch_and_tree('source')
163
self.build_tree(['source/file1'])
165
source.commit('added file')
166
source.bzrdir.sprout('second')
167
out, err = self.run_bzr('checkout source target --hardlink'
168
' --files-from second')
169
second_stat = os.stat('second/file1')
170
target_stat = os.stat('target/file1')
171
self.assertEqual(second_stat, target_stat)
174
class TestSmartServerCheckout(TestCaseWithTransport):
176
def test_heavyweight_checkout(self):
177
self.setup_smart_server_with_call_log()
178
t = self.make_branch_and_tree('from')
179
for count in range(9):
180
t.commit(message='commit %d' % count)
181
self.reset_smart_call_log()
182
out, err = self.run_bzr(['checkout', self.get_url('from'),
184
# This figure represent the amount of work to perform this use case. It
185
# is entirely ok to reduce this number if a test fails due to rpc_count
186
# being too low. If rpc_count increases, more network roundtrips have
187
# become necessary for this use case. Please do not adjust this number
188
# upwards without agreement from bzr's network support maintainers.
189
self.assertLength(17, self.hpss_calls)
190
self.expectFailure("checkouts require VFS access",
191
self.assertThat, self.hpss_calls, ContainsNoVfsCalls)
193
def test_lightweight_checkout(self):
194
self.setup_smart_server_with_call_log()
195
t = self.make_branch_and_tree('from')
196
for count in range(9):
197
t.commit(message='commit %d' % count)
198
self.reset_smart_call_log()
199
out, err = self.run_bzr(['checkout', '--lightweight', self.get_url('from'),
201
# This figure represent the amount of work to perform this use case. It
202
# is entirely ok to reduce this number if a test fails due to rpc_count
203
# being too low. If rpc_count increases, more network roundtrips have
204
# become necessary for this use case. Please do not adjust this number
205
# upwards without agreement from bzr's network support maintainers.
206
if len(self.hpss_calls) < 34 or len(self.hpss_calls) > 48:
208
"Incorrect length: wanted between 34 and 48, got %d for %r" % (
209
len(self.hpss_calls), self.hpss_calls))
210
self.expectFailure("lightweight checkouts require VFS calls",
211
self.assertThat, self.hpss_calls, ContainsNoVfsCalls)