~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_add.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
23
23
    osutils,
24
24
    tests,
25
25
    )
26
 
 
27
 
 
28
 
def load_tests(standard_tests, module, loader):
29
 
    """Parameterize tests for view-aware vs not."""
30
 
    to_adapt, result = tests.split_suite_by_condition(
31
 
        standard_tests, tests.condition_isinstance(TestAdd))
 
26
from bzrlib.tests import (
 
27
    features,
 
28
    script,
 
29
    )
 
30
from bzrlib.tests.scenarios import load_tests_apply_scenarios
 
31
 
 
32
 
 
33
load_tests = load_tests_apply_scenarios
 
34
 
 
35
 
 
36
class TestAdd(tests.TestCaseWithTransport):
 
37
 
32
38
    scenarios = [
33
39
        ('pre-views', {'branch_tree_format': 'pack-0.92'}),
34
 
        ('view-aware', {'branch_tree_format': 'development6-rich-root'}),
 
40
        ('view-aware', {'branch_tree_format': '2a'}),
35
41
        ]
36
 
    return tests.multiply_tests(to_adapt, scenarios, result)
37
 
 
38
 
 
39
 
class TestAdd(tests.TestCaseWithTransport):
40
42
 
41
43
    def make_branch_and_tree(self, dir):
42
44
        return super(TestAdd, self).make_branch_and_tree(
152
154
        new_tree = self.make_branch_and_tree('new')
153
155
        self.build_tree(['new/a', 'new/b/', 'new/b/c', 'd'])
154
156
 
155
 
        os.chdir('new')
156
 
        out, err = self.run_bzr('add --file-ids-from ../base')
 
157
        out, err = self.run_bzr('add --file-ids-from ../base',
 
158
                                working_dir='new')
157
159
        self.assertEqual('', err)
158
160
        self.assertEqualDiff('adding a w/ file id from a\n'
159
161
                             'adding b w/ file id from b\n'
173
175
        new_tree = self.make_branch_and_tree('new')
174
176
        self.build_tree(['new/c', 'new/d'])
175
177
 
176
 
        os.chdir('new')
177
 
        out, err = self.run_bzr('add --file-ids-from ../base/b')
 
178
        out, err = self.run_bzr('add --file-ids-from ../base/b',
 
179
                                working_dir='new')
178
180
        self.assertEqual('', err)
179
181
        self.assertEqualDiff('adding c w/ file id from b/c\n'
180
182
                             'adding d w/ file id from b/d\n',
181
183
                             out)
182
184
 
183
 
        new_tree = new_tree.bzrdir.open_workingtree()
 
185
        new_tree = new_tree.bzrdir.open_workingtree('new')
184
186
        self.assertEqual(base_tree.path2id('b/c'), new_tree.path2id('c'))
185
187
        self.assertEqual(base_tree.path2id('b/d'), new_tree.path2id('d'))
186
188
 
204
206
        self.assertContainsRe(err, r'ERROR:.*\.bzr.*control file')
205
207
 
206
208
    def test_add_via_symlink(self):
207
 
        self.requireFeature(tests.SymlinkFeature)
 
209
        self.requireFeature(features.SymlinkFeature)
208
210
        self.make_branch_and_tree('source')
209
211
        self.build_tree(['source/top.txt'])
210
212
        os.symlink('source', 'link')
212
214
        self.assertEquals(out, 'adding top.txt\n')
213
215
 
214
216
    def test_add_symlink_to_abspath(self):
215
 
        self.requireFeature(tests.SymlinkFeature)
 
217
        self.requireFeature(features.SymlinkFeature)
216
218
        self.make_branch_and_tree('tree')
217
219
        os.symlink(osutils.abspath('target'), 'tree/link')
218
220
        out = self.run_bzr(['add', 'tree/link'])[0]
219
221
        self.assertEquals(out, 'adding link\n')
 
222
 
 
223
    def test_add_not_child(self):
 
224
        # https://bugs.launchpad.net/bzr/+bug/98735
 
225
        sr = script.ScriptRunner()
 
226
        self.make_branch_and_tree('tree1')
 
227
        self.make_branch_and_tree('tree2')
 
228
        self.build_tree(['tree1/a', 'tree2/b'])
 
229
        sr.run_script(self, '''
 
230
        $ bzr add tree1/a tree2/b
 
231
        2>bzr: ERROR: Path "...tree2/b" is not a child of path "...tree1"
 
232
        ''')
 
233
 
 
234
    def test_add_multiple_files_in_unicode_cwd(self):
 
235
        """Adding multiple files in a non-ascii cwd, see lp:686611"""
 
236
        self.requireFeature(features.UnicodeFilenameFeature)
 
237
        self.make_branch_and_tree(u"\xA7")
 
238
        self.build_tree([u"\xA7/a", u"\xA7/b"])
 
239
        out, err = self.run_bzr(["add", "a", "b"], working_dir=u"\xA7")
 
240
        self.assertEquals(out, "adding a\n" "adding b\n")
 
241
        self.assertEquals(err, "")
 
242
 
 
243
    def test_add_skip_large_files(self):
 
244
        """Test skipping files larger than add.maximum_file_size"""
 
245
        tree = self.make_branch_and_tree('.')
 
246
        self.build_tree(['small.txt', 'big.txt', 'big2.txt'])
 
247
        self.build_tree_contents([('small.txt', '0\n')])
 
248
        self.build_tree_contents([('big.txt', '01234567890123456789\n')])
 
249
        self.build_tree_contents([('big2.txt', '01234567890123456789\n')])
 
250
        tree.branch.get_config_stack().set('add.maximum_file_size', 5)
 
251
        out = self.run_bzr('add')[0]
 
252
        results = sorted(out.rstrip('\n').split('\n'))
 
253
        self.assertEquals(['adding small.txt'], results)
 
254
        # named items never skipped, even if over max
 
255
        out, err = self.run_bzr(["add", "big2.txt"])
 
256
        results = sorted(out.rstrip('\n').split('\n'))
 
257
        self.assertEquals(['adding big2.txt'], results)
 
258
        self.assertEquals("", err)
 
259
        tree.branch.get_config_stack().set('add.maximum_file_size', 30)
 
260
        out = self.run_bzr('add')[0]
 
261
        results = sorted(out.rstrip('\n').split('\n'))
 
262
        self.assertEquals(['adding big.txt'], results)