~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Vincent Ladeuil
  • Date: 2012-01-18 14:09:19 UTC
  • mto: This revision was merged to the branch mainline in revision 6468.
  • Revision ID: v.ladeuil+lp@free.fr-20120118140919-rlvdrhpc0nq1lbwi
Change set/remove to require a lock for the branch config files.

This means that tests (or any plugin for that matter) do not requires an
explicit lock on the branch anymore to change a single option. This also
means the optimisation becomes "opt-in" and as such won't be as
spectacular as it may be and/or harder to get right (nothing fails
anymore).

This reduces the diff by ~300 lines.

Code/tests that were updating more than one config option is still taking
a lock to at least avoid some IOs and demonstrate the benefits through
the decreased number of hpss calls.

The duplication between BranchStack and BranchOnlyStack will be removed
once the same sharing is in place for local config files, at which point
the Stack class itself may be able to host the changes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006, 2007, 2009, 2010 Canonical Ltd
 
1
# Copyright (C) 2006, 2007, 2009-2012 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
16
16
 
17
17
"""Tests for the 'checkout' CLI command."""
18
18
 
19
 
from cStringIO import StringIO
20
19
import os
21
 
import re
22
 
import shutil
23
 
import sys
24
20
 
25
21
from bzrlib import (
26
22
    branch as _mod_branch,
28
24
    errors,
29
25
    workingtree,
30
26
    )
31
 
from bzrlib.tests.blackbox import (
32
 
    ExternalBase,
33
 
    )
34
27
from bzrlib.tests import (
 
28
    TestCaseWithTransport,
 
29
    )
 
30
from bzrlib.tests.matchers import ContainsNoVfsCalls
 
31
from bzrlib.tests.features import (
35
32
    HardlinkFeature,
36
 
    KnownFailure,
37
33
    )
38
34
 
39
35
 
40
 
class TestCheckout(ExternalBase):
 
36
class TestCheckout(TestCaseWithTransport):
41
37
 
42
38
    def setUp(self):
43
39
        super(TestCheckout, self).setUp()
64
60
                         result.open_branch().bzrdir.root_transport.base)
65
61
 
66
62
    def test_checkout_dash_r(self):
67
 
        self.run_bzr('checkout -r -2 branch checkout')
 
63
        out, err = self.run_bzr(['checkout', '-r', '-2', 'branch', 'checkout'])
68
64
        # the working tree should now be at revision '1' with the content
69
65
        # from 1.
70
66
        result = bzrdir.BzrDir.open('checkout')
71
67
        self.assertEqual(['1'], result.open_workingtree().get_parent_ids())
72
 
        self.failIfExists('checkout/added_in_2')
 
68
        self.assertPathDoesNotExist('checkout/added_in_2')
73
69
 
74
70
    def test_checkout_light_dash_r(self):
75
 
        self.run_bzr('checkout --lightweight -r -2 branch checkout')
 
71
        out, err = self.run_bzr(['checkout','--lightweight', '-r', '-2',
 
72
            'branch', 'checkout'])
76
73
        # the working tree should now be at revision '1' with the content
77
74
        # from 1.
78
75
        result = bzrdir.BzrDir.open('checkout')
79
76
        self.assertEqual(['1'], result.open_workingtree().get_parent_ids())
80
 
        self.failIfExists('checkout/added_in_2')
 
77
        self.assertPathDoesNotExist('checkout/added_in_2')
81
78
 
82
79
    def test_checkout_reconstitutes_working_trees(self):
83
80
        # doing a 'bzr checkout' in the directory of a branch with no tree
123
120
            cmd.append('--lightweight')
124
121
        self.run_bzr('checkout source target')
125
122
        # files with unique content should be moved
126
 
        self.failUnlessExists('target/file2.moved')
 
123
        self.assertPathExists('target/file2.moved')
127
124
        # files with content matching tree should not be moved
128
 
        self.failIfExists('target/file1.moved')
 
125
        self.assertPathDoesNotExist('target/file1.moved')
129
126
 
130
127
    def test_checkout_existing_dir_heavy(self):
131
128
        self._test_checkout_existing_dir(False)
136
133
    def test_checkout_in_branch_with_r(self):
137
134
        branch = _mod_branch.Branch.open('branch')
138
135
        branch.bzrdir.destroy_workingtree()
139
 
        os.chdir('branch')
140
 
        self.run_bzr('checkout -r 1')
141
 
        tree = workingtree.WorkingTree.open('.')
 
136
        self.run_bzr('checkout -r 1', working_dir='branch')
 
137
        tree = workingtree.WorkingTree.open('branch')
142
138
        self.assertEqual('1', tree.last_revision())
143
139
        branch.bzrdir.destroy_workingtree()
144
 
        self.run_bzr('checkout -r 0')
 
140
        self.run_bzr('checkout -r 0', working_dir='branch')
145
141
        self.assertEqual('null:', tree.last_revision())
146
142
 
147
143
    def test_checkout_files_from(self):
155
151
        self.build_tree(['source/file1'])
156
152
        source.add('file1')
157
153
        source.commit('added file')
158
 
        out, err = self.run_bzr(['checkout', 'source', 'target',
159
 
            '--files-from', 'source',
160
 
            '--hardlink'])
 
154
        out, err = self.run_bzr('checkout source target --hardlink')
161
155
        source_stat = os.stat('source/file1')
162
156
        target_stat = os.stat('target/file1')
163
157
        self.assertEqual(source_stat, target_stat)
 
158
 
 
159
    def test_checkout_hardlink_files_from(self):
 
160
        self.requireFeature(HardlinkFeature)
 
161
        source = self.make_branch_and_tree('source')
 
162
        self.build_tree(['source/file1'])
 
163
        source.add('file1')
 
164
        source.commit('added file')
 
165
        source.bzrdir.sprout('second')
 
166
        out, err = self.run_bzr('checkout source target --hardlink'
 
167
                                ' --files-from second')
 
168
        second_stat = os.stat('second/file1')
 
169
        target_stat = os.stat('target/file1')
 
170
        self.assertEqual(second_stat, target_stat)
 
171
 
 
172
 
 
173
class TestSmartServerCheckout(TestCaseWithTransport):
 
174
 
 
175
    def test_heavyweight_checkout(self):
 
176
        self.setup_smart_server_with_call_log()
 
177
        t = self.make_branch_and_tree('from')
 
178
        for count in range(9):
 
179
            t.commit(message='commit %d' % count)
 
180
        self.reset_smart_call_log()
 
181
        out, err = self.run_bzr(['checkout', self.get_url('from'), 'target'])
 
182
        # This figure represent the amount of work to perform this use case. It
 
183
        # is entirely ok to reduce this number if a test fails due to rpc_count
 
184
        # being too low. If rpc_count increases, more network roundtrips have
 
185
        # become necessary for this use case. Please do not adjust this number
 
186
        # upwards without agreement from bzr's network support maintainers.
 
187
        self.assertLength(10, self.hpss_calls)
 
188
        self.assertLength(1, self.hpss_connections)
 
189
        self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
 
190
 
 
191
    def test_lightweight_checkout(self):
 
192
        self.setup_smart_server_with_call_log()
 
193
        t = self.make_branch_and_tree('from')
 
194
        for count in range(9):
 
195
            t.commit(message='commit %d' % count)
 
196
        self.reset_smart_call_log()
 
197
        out, err = self.run_bzr(['checkout', '--lightweight', self.get_url('from'),
 
198
            'target'])
 
199
        # This figure represent the amount of work to perform this use case. It
 
200
        # is entirely ok to reduce this number if a test fails due to rpc_count
 
201
        # being too low. If rpc_count increases, more network roundtrips have
 
202
        # become necessary for this use case. Please do not adjust this number
 
203
        # upwards without agreement from bzr's network support maintainers.
 
204
        self.assertLength(13, self.hpss_calls)
 
205
        self.assertThat(self.hpss_calls, ContainsNoVfsCalls)