/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_smart_add.py

  • Committer: Michael Ellerman
  • Date: 2006-05-31 08:44:29 UTC
  • mto: (1711.2.63 jam-integration)
  • mto: This revision was merged to the branch mainline in revision 1792.
  • Revision ID: michael@ellerman.id.au-20060531084429-35e5429abda9f560
Add optional location to ancestry and fix behaviour for checkouts.

This adds an optional location parameter to the ancestry command. It also
changes the behaviour of ancestry on checkouts such that if they have
been created with a subset of the branch history, only the subset is
shown by 'bzr ancestry'. Tests for all of that as well.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007, 2009, 2010 Canonical Ltd
2
 
#
3
 
# This program is free software; you can redistribute it and/or modify
4
 
# it under the terms of the GNU General Public License as published by
5
 
# the Free Software Foundation; either version 2 of the License, or
6
 
# (at your option) any later version.
7
 
#
8
 
# This program is distributed in the hope that it will be useful,
9
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
 
# GNU General Public License for more details.
12
 
#
13
 
# You should have received a copy of the GNU General Public License
14
 
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
 
 
17
 
from cStringIO import StringIO
18
 
 
19
 
from bzrlib import (
20
 
    add,
21
 
    inventory,
22
 
    osutils,
23
 
    tests,
24
 
    )
25
 
 
26
 
 
27
 
class AddCustomIDAction(add.AddAction):
28
 
 
29
 
    def __call__(self, inv, parent_ie, path, kind):
30
 
        # The first part just logs if appropriate
31
 
        # Now generate a custom id
32
 
        file_id = osutils.safe_file_id(kind + '-'
33
 
                                       + path.raw_path.replace('/', '%'),
34
 
                                       warn=False)
35
 
        if self.should_print:
36
 
            self._to_file.write('added %s with id %s\n'
37
 
                                % (path.raw_path, file_id))
38
 
        return file_id
39
 
 
40
 
 
41
 
class TestAddFrom(tests.TestCaseWithTransport):
42
 
    """Tests for AddFromBaseAction"""
43
 
 
44
 
    def make_base_tree(self):
45
 
        self.base_tree = self.make_branch_and_tree('base')
46
 
        self.build_tree(['base/a', 'base/b',
47
 
                         'base/dir/', 'base/dir/a',
48
 
                         'base/dir/subdir/',
49
 
                         'base/dir/subdir/b',
50
 
                        ])
51
 
        self.base_tree.add(['a', 'b', 'dir', 'dir/a',
52
 
                            'dir/subdir', 'dir/subdir/b'])
53
 
        self.base_tree.commit('creating initial tree.')
54
 
 
55
 
    def add_helper(self, base_tree, base_path, new_tree, file_list,
56
 
                   should_print=False):
57
 
        to_file = StringIO()
58
 
        base_tree.lock_read()
59
 
        try:
60
 
            new_tree.lock_write()
61
 
            try:
62
 
                action = add.AddFromBaseAction(base_tree, base_path,
63
 
                                               to_file=to_file,
64
 
                                               should_print=should_print)
65
 
                new_tree.smart_add(file_list, action=action)
66
 
            finally:
67
 
                new_tree.unlock()
68
 
        finally:
69
 
            base_tree.unlock()
70
 
        return to_file.getvalue()
71
 
 
72
 
    def test_copy_all(self):
73
 
        self.make_base_tree()
74
 
        new_tree = self.make_branch_and_tree('new')
75
 
        files = ['a', 'b',
76
 
                 'dir/', 'dir/a',
77
 
                 'dir/subdir/',
78
 
                 'dir/subdir/b',
79
 
                ]
80
 
        self.build_tree(['new/' + fn for fn in files])
81
 
        self.add_helper(self.base_tree, '', new_tree, ['new'])
82
 
 
83
 
        for fn in files:
84
 
            base_file_id = self.base_tree.path2id(fn)
85
 
            new_file_id = new_tree.path2id(fn)
86
 
            self.assertEqual(base_file_id, new_file_id)
87
 
 
88
 
    def test_copy_from_dir(self):
89
 
        self.make_base_tree()
90
 
        new_tree = self.make_branch_and_tree('new')
91
 
 
92
 
        self.build_tree(['new/a', 'new/b', 'new/c',
93
 
                         'new/subdir/', 'new/subdir/b', 'new/subdir/d'])
94
 
        new_tree.set_root_id(self.base_tree.get_root_id())
95
 
        self.add_helper(self.base_tree, 'dir', new_tree, ['new'])
96
 
 
97
 
        # We know 'a' and 'b' exist in the root, and they are being added
98
 
        # in a new 'root'. Since ROOT ids have been set as the same, we will
99
 
        # use those ids
100
 
        self.assertEqual(self.base_tree.path2id('a'),
101
 
                         new_tree.path2id('a'))
102
 
        self.assertEqual(self.base_tree.path2id('b'),
103
 
                         new_tree.path2id('b'))
104
 
 
105
 
        # Because we specified 'dir/' as the base path, and we have
106
 
        # nothing named 'subdir' in the base tree, we should grab the
107
 
        # ids from there
108
 
        self.assertEqual(self.base_tree.path2id('dir/subdir'),
109
 
                         new_tree.path2id('subdir'))
110
 
        self.assertEqual(self.base_tree.path2id('dir/subdir/b'),
111
 
                         new_tree.path2id('subdir/b'))
112
 
 
113
 
        # These should get newly generated ids
114
 
        c_id = new_tree.path2id('c')
115
 
        self.assertNotEqual(None, c_id)
116
 
        self.base_tree.lock_read()
117
 
        self.addCleanup(self.base_tree.unlock)
118
 
        self.failIf(c_id in self.base_tree)
119
 
 
120
 
        d_id = new_tree.path2id('subdir/d')
121
 
        self.assertNotEqual(None, d_id)
122
 
        self.failIf(d_id in self.base_tree)
123
 
 
124
 
    def test_copy_existing_dir(self):
125
 
        self.make_base_tree()
126
 
        new_tree = self.make_branch_and_tree('new')
127
 
        self.build_tree(['new/subby/', 'new/subby/a', 'new/subby/b'])
128
 
 
129
 
        subdir_file_id = self.base_tree.path2id('dir/subdir')
130
 
        new_tree.add(['subby'], [subdir_file_id])
131
 
        self.add_helper(self.base_tree, '', new_tree, ['new'])
132
 
        # Because 'subby' already points to subdir, we should add
133
 
        # 'b' with the same id
134
 
        self.assertEqual(self.base_tree.path2id('dir/subdir/b'),
135
 
                         new_tree.path2id('subby/b'))
136
 
 
137
 
        # 'subby/a' should be added with a new id because there is no
138
 
        # matching path or child of 'subby'.
139
 
        a_id = new_tree.path2id('subby/a')
140
 
        self.assertNotEqual(None, a_id)
141
 
        self.base_tree.lock_read()
142
 
        self.addCleanup(self.base_tree.unlock)
143
 
        self.failIf(a_id in self.base_tree)
144
 
 
145
 
 
146
 
class TestAddActions(tests.TestCase):
147
 
 
148
 
    def test_quiet(self):
149
 
        self.run_action("")
150
 
 
151
 
    def test__print(self):
152
 
        self.run_action("adding path\n")
153
 
 
154
 
    def run_action(self, output):
155
 
        from bzrlib.mutabletree import _FastPath
156
 
        inv = inventory.Inventory()
 
1
import os
 
2
import unittest
 
3
 
 
4
from bzrlib.add import smart_add, smart_add_tree
 
5
from bzrlib.tests import TestCaseWithTransport, TestCase
 
6
from bzrlib.branch import Branch
 
7
from bzrlib.errors import NotBranchError, NoSuchFile
 
8
from bzrlib.inventory import InventoryFile, Inventory
 
9
from bzrlib.workingtree import WorkingTree
 
10
 
 
11
class TestSmartAdd(TestCaseWithTransport):
 
12
 
 
13
    def test_add_dot_from_root(self):
 
14
        """Test adding . from the root of the tree.""" 
 
15
        from bzrlib.add import smart_add
 
16
        paths = ("original/", "original/file1", "original/file2")
 
17
        self.build_tree(paths)
 
18
        wt = self.make_branch_and_tree('.')
 
19
        branch = wt.branch
 
20
        smart_add_tree(wt, (u".",))
 
21
        for path in paths:
 
22
            self.assertNotEqual(wt.path2id(path), None)
 
23
 
 
24
    def test_add_dot_from_subdir(self):
 
25
        """Test adding . from a subdir of the tree.""" 
 
26
        from bzrlib.add import smart_add
 
27
        paths = ("original/", "original/file1", "original/file2")
 
28
        self.build_tree(paths)
 
29
        wt = self.make_branch_and_tree('.')
 
30
        branch = wt.branch
 
31
        os.chdir("original")
 
32
        smart_add_tree(wt, (u".",))
 
33
        for path in paths:
 
34
            self.assertNotEqual(wt.path2id(path), None)
 
35
 
 
36
    def test_add_tree_from_above_tree(self):
 
37
        """Test adding a tree from above the tree.""" 
 
38
        from bzrlib.add import smart_add
 
39
        paths = ("original/", "original/file1", "original/file2")
 
40
        branch_paths = ("branch/", "branch/original/", "branch/original/file1",
 
41
                        "branch/original/file2")
 
42
        self.build_tree(branch_paths)
 
43
        wt = self.make_branch_and_tree('branch')
 
44
        branch = wt.branch
 
45
        smart_add_tree(wt, ("branch",))
 
46
        for path in paths:
 
47
            self.assertNotEqual(wt.path2id(path), None)
 
48
 
 
49
    def test_add_above_tree_preserves_tree(self):
 
50
        """Test nested trees are not affect by an add above them."""
 
51
        from bzrlib.add import smart_add
 
52
        paths = ("original/", "original/file1", "original/file2")
 
53
        child_paths = ("path",)
 
54
        full_child_paths = ("original/child", "original/child/path")
 
55
        build_paths = ("original/", "original/file1", "original/file2", 
 
56
                       "original/child/", "original/child/path")
 
57
        
 
58
        self.build_tree(build_paths)
 
59
        wt = self.make_branch_and_tree('.')
 
60
        branch = wt.branch
 
61
        child_tree = self.make_branch_and_tree('original/child')
 
62
        smart_add_tree(wt, (u".",))
 
63
        for path in paths:
 
64
            self.assertNotEqual((path, wt.path2id(path)),
 
65
                                (path, None))
 
66
        for path in full_child_paths:
 
67
            self.assertEqual((path, wt.path2id(path)),
 
68
                             (path, None))
 
69
        for path in child_paths:
 
70
            self.assertEqual(child_tree.path2id(path), None)
 
71
 
 
72
    def test_add_paths(self):
 
73
        """Test smart-adding a list of paths."""
 
74
        from bzrlib.add import smart_add
 
75
        paths = ("file1", "file2")
 
76
        self.build_tree(paths)
 
77
        wt = self.make_branch_and_tree('.')
 
78
        branch = wt.branch
 
79
        smart_add_tree(wt, paths)
 
80
        for path in paths:
 
81
            self.assertNotEqual(wt.path2id(path), None)
 
82
 
 
83
    def test_add_dry_run(self):
 
84
        """Test a dry run add, make sure nothing is added."""
 
85
        from bzrlib.commands import run_bzr
 
86
        eq = self.assertEqual
 
87
        wt = self.make_branch_and_tree('.')
 
88
        branch = wt.branch
 
89
        self.build_tree(['inertiatic/', 'inertiatic/esp'])
 
90
        eq(list(wt.unknowns()), ['inertiatic'])
 
91
        self.capture('add --dry-run .')
 
92
        eq(list(wt.unknowns()), ['inertiatic'])
 
93
 
 
94
    def test_add_non_existant(self):
 
95
        """Test smart-adding a file that does not exist."""
 
96
        from bzrlib.add import smart_add
 
97
        wt = self.make_branch_and_tree('.')
 
98
        branch = wt.branch
 
99
        self.assertRaises(NoSuchFile, smart_add_tree, wt, 'non-existant-file')
 
100
 
 
101
    def test_returns(self):
 
102
        """Correctly returns added/ignored files"""
 
103
        from bzrlib.commands import run_bzr
 
104
        wt = self.make_branch_and_tree('.')
 
105
        branch = wt.branch
 
106
        self.build_tree(['inertiatic/', 'inertiatic/esp', 'inertiatic/CVS', 
 
107
                        'inertiatic/foo.pyc'])
 
108
        added, ignored = smart_add_tree(wt, u'.')
 
109
        self.assertSubset(('inertiatic', 'inertiatic/esp'), added)
 
110
        self.assertSubset(('CVS', '*.py[oc]'), ignored)
 
111
        self.assertSubset(('inertiatic/CVS',), ignored['CVS'])
 
112
        self.assertSubset(('inertiatic/foo.pyc',), ignored['*.py[oc]'])
 
113
 
 
114
 
 
115
class TestSmartAddBranch(TestCaseWithTransport):
 
116
    """Test smart adds with a specified branch."""
 
117
 
 
118
    def test_add_dot_from_root(self):
 
119
        """Test adding . from the root of the tree.""" 
 
120
        paths = ("original/", "original/file1", "original/file2")
 
121
        self.build_tree(paths)
 
122
        wt = self.make_branch_and_tree('.')
 
123
        branch = wt.branch
 
124
        smart_add_tree(wt, (u".",))
 
125
        for path in paths:
 
126
            self.assertNotEqual(wt.path2id(path), None)
 
127
 
 
128
    def test_add_dot_from_subdir(self):
 
129
        """Test adding . from a subdir of the tree.""" 
 
130
        from bzrlib.add import smart_add_tree
 
131
        paths = ("original/", "original/file1", "original/file2")
 
132
        self.build_tree(paths)
 
133
        wt = self.make_branch_and_tree('.')
 
134
        branch = wt.branch
 
135
        os.chdir("original")
 
136
        smart_add_tree(wt, (u".",))
 
137
        for path in paths:
 
138
            self.assertNotEqual(wt.path2id(path), None)
 
139
 
 
140
    def test_add_tree_from_above_tree(self):
 
141
        """Test adding a tree from above the tree.""" 
 
142
        from bzrlib.add import smart_add_tree
 
143
        paths = ("original/", "original/file1", "original/file2")
 
144
        branch_paths = ("branch/", "branch/original/", "branch/original/file1",
 
145
                        "branch/original/file2")
 
146
        self.build_tree(branch_paths)
 
147
        tree = self.make_branch_and_tree('branch')
 
148
        branch = tree.branch
 
149
        smart_add_tree(tree, ("branch",))
 
150
        for path in paths:
 
151
            self.assertNotEqual(tree.path2id(path), None)
 
152
 
 
153
    def test_add_above_tree_preserves_tree(self):
 
154
        """Test nested trees are not affect by an add above them."""
 
155
        from bzrlib.add import smart_add_tree
 
156
        paths = ("original/", "original/file1", "original/file2")
 
157
        child_paths = ("path")
 
158
        full_child_paths = ("original/child", "original/child/path")
 
159
        build_paths = ("original/", "original/file1", "original/file2", 
 
160
                       "original/child/", "original/child/path")
 
161
        self.build_tree(build_paths)
 
162
        tree = self.make_branch_and_tree('.')
 
163
        branch = tree.branch
 
164
        child_tree = self.make_branch_and_tree("original/child")
 
165
        smart_add_tree(tree, (u".",))
 
166
        for path in paths:
 
167
            self.assertNotEqual((path, tree.path2id(path)),
 
168
                                (path, None))
 
169
        for path in full_child_paths:
 
170
            self.assertEqual((path, tree.path2id(path)),
 
171
                             (path, None))
 
172
        for path in child_paths:
 
173
            self.assertEqual(child_tree.path2id(path), None)
 
174
 
 
175
    def test_add_paths(self):
 
176
        """Test smart-adding a list of paths."""
 
177
        from bzrlib.add import smart_add_tree
 
178
        paths = ("file1", "file2")
 
179
        self.build_tree(paths)
 
180
        wt = self.make_branch_and_tree('.')
 
181
        branch = wt.branch
 
182
        smart_add_tree(wt, paths)
 
183
        for path in paths:
 
184
            self.assertNotEqual(wt.path2id(path), None)
 
185
 
 
186
 
 
187
class TestAddActions(TestCase):
 
188
 
 
189
    def test_null(self):
 
190
        from bzrlib.add import add_action_null
 
191
        self.run_action(add_action_null, "", False)
 
192
 
 
193
    def test_add(self):
 
194
        self.entry = InventoryFile("id", "name", None)
 
195
        from bzrlib.add import add_action_add
 
196
        self.run_action(add_action_add, "", True)
 
197
 
 
198
    def test_add_and_print(self):
 
199
        from bzrlib.add import add_action_add_and_print
 
200
        self.run_action(add_action_add_and_print, "added path\n", True)
 
201
 
 
202
    def test_print(self):
 
203
        from bzrlib.add import add_action_print
 
204
        self.run_action(add_action_print, "added path\n", False)
 
205
 
 
206
    def run_action(self, action, output, should_add):
 
207
        from StringIO import StringIO
 
208
        inv = Inventory()
157
209
        stdout = StringIO()
158
 
        action = add.AddAction(to_file=stdout, should_print=bool(output))
159
210
 
160
 
        self.apply_redirected(None, stdout, None, action, inv, None,
161
 
            _FastPath('path'), 'file')
 
211
        self.apply_redirected(None, stdout, None, action, inv, None, 'path', 'file')
162
212
        self.assertEqual(stdout.getvalue(), output)
 
213
 
 
214
        if should_add:
 
215
            self.assertNotEqual(inv.path2id('path'), None)
 
216
        else:
 
217
            self.assertEqual(inv.path2id('path'), None)