~bzr-pqm/bzr/bzr.dev

1092.1.26 by Robert Collins
start writing star-topology test, realise we need smart-add change
1
import os
2
import unittest
3
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
4
from bzrlib.add import smart_add, smart_add_tree
5
from bzrlib.tests import TestCaseWithTransport, TestCase
1092.1.26 by Robert Collins
start writing star-topology test, realise we need smart-add change
6
from bzrlib.branch import Branch
1185.56.2 by Michael Ellerman
Raise NoSuchFile when someone tries to add a non-existant file.
7
from bzrlib.errors import NotBranchError, NoSuchFile
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
8
from bzrlib.inventory import InventoryFile, Inventory
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
9
from bzrlib.workingtree import WorkingTree
1092.1.26 by Robert Collins
start writing star-topology test, realise we need smart-add change
10
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
11
class TestSmartAdd(TestCaseWithTransport):
1092.1.27 by Robert Collins
two bugfixes to smart_add - do not add paths from nested trees to the parent tree, and do not mutate the user supplied file list
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)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
18
        wt = self.make_branch_and_tree('.')
19
        branch = wt.branch
20
        smart_add_tree(wt, (u".",))
1092.1.27 by Robert Collins
two bugfixes to smart_add - do not add paths from nested trees to the parent tree, and do not mutate the user supplied file list
21
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
22
            self.assertNotEqual(wt.path2id(path), None)
1092.1.27 by Robert Collins
two bugfixes to smart_add - do not add paths from nested trees to the parent tree, and do not mutate the user supplied file list
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)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
29
        wt = self.make_branch_and_tree('.')
30
        branch = wt.branch
1092.1.27 by Robert Collins
two bugfixes to smart_add - do not add paths from nested trees to the parent tree, and do not mutate the user supplied file list
31
        os.chdir("original")
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
32
        smart_add_tree(wt, (u".",))
1092.1.27 by Robert Collins
two bugfixes to smart_add - do not add paths from nested trees to the parent tree, and do not mutate the user supplied file list
33
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
34
            self.assertNotEqual(wt.path2id(path), None)
1092.1.27 by Robert Collins
two bugfixes to smart_add - do not add paths from nested trees to the parent tree, and do not mutate the user supplied file list
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")
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
40
        branch_paths = ("branch/", "branch/original/", "branch/original/file1",
41
                        "branch/original/file2")
1092.1.27 by Robert Collins
two bugfixes to smart_add - do not add paths from nested trees to the parent tree, and do not mutate the user supplied file list
42
        self.build_tree(branch_paths)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
43
        wt = self.make_branch_and_tree('branch')
44
        branch = wt.branch
45
        smart_add_tree(wt, ("branch",))
1092.1.27 by Robert Collins
two bugfixes to smart_add - do not add paths from nested trees to the parent tree, and do not mutate the user supplied file list
46
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
47
            self.assertNotEqual(wt.path2id(path), None)
1092.1.27 by Robert Collins
two bugfixes to smart_add - do not add paths from nested trees to the parent tree, and do not mutate the user supplied file list
48
49
    def test_add_above_tree_preserves_tree(self):
50
        """Test nested trees are not affect by an add above them."""
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
51
        from bzrlib.add import smart_add
1092.1.27 by Robert Collins
two bugfixes to smart_add - do not add paths from nested trees to the parent tree, and do not mutate the user supplied file list
52
        paths = ("original/", "original/file1", "original/file2")
1143 by Martin Pool
- remove dead code and remove some small errors (pychecker)
53
        child_paths = ("path",)
1092.1.27 by Robert Collins
two bugfixes to smart_add - do not add paths from nested trees to the parent tree, and do not mutate the user supplied file list
54
        full_child_paths = ("original/child", "original/child/path")
55
        build_paths = ("original/", "original/file1", "original/file2", 
56
                       "original/child/", "original/child/path")
1143 by Martin Pool
- remove dead code and remove some small errors (pychecker)
57
        
1092.1.27 by Robert Collins
two bugfixes to smart_add - do not add paths from nested trees to the parent tree, and do not mutate the user supplied file list
58
        self.build_tree(build_paths)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
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".",))
1092.1.27 by Robert Collins
two bugfixes to smart_add - do not add paths from nested trees to the parent tree, and do not mutate the user supplied file list
63
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
64
            self.assertNotEqual((path, wt.path2id(path)),
1092.1.27 by Robert Collins
two bugfixes to smart_add - do not add paths from nested trees to the parent tree, and do not mutate the user supplied file list
65
                                (path, None))
66
        for path in full_child_paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
67
            self.assertEqual((path, wt.path2id(path)),
1092.1.27 by Robert Collins
two bugfixes to smart_add - do not add paths from nested trees to the parent tree, and do not mutate the user supplied file list
68
                             (path, None))
69
        for path in child_paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
70
            self.assertEqual(child_tree.path2id(path), None)
1092.1.28 by Robert Collins
test adding lists of paths
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)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
77
        wt = self.make_branch_and_tree('.')
78
        branch = wt.branch
79
        smart_add_tree(wt, paths)
1092.1.28 by Robert Collins
test adding lists of paths
80
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
81
            self.assertNotEqual(wt.path2id(path), None)
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
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
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
87
        wt = self.make_branch_and_tree('.')
88
        branch = wt.branch
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
89
        self.build_tree(['inertiatic/', 'inertiatic/esp'])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
90
        eq(list(wt.unknowns()), ['inertiatic'])
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
91
        self.capture('add --dry-run .')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
92
        eq(list(wt.unknowns()), ['inertiatic'])
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
93
1185.56.2 by Michael Ellerman
Raise NoSuchFile when someone tries to add a non-existant file.
94
    def test_add_non_existant(self):
95
        """Test smart-adding a file that does not exist."""
96
        from bzrlib.add import smart_add
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
97
        wt = self.make_branch_and_tree('.')
98
        branch = wt.branch
99
        self.assertRaises(NoSuchFile, smart_add_tree, wt, 'non-existant-file')
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
100
101
    def test_returns(self):
102
        """Correctly returns added/ignored files"""
103
        from bzrlib.commands import run_bzr
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
104
        wt = self.make_branch_and_tree('.')
105
        branch = wt.branch
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
106
        self.build_tree(['inertiatic/', 'inertiatic/esp', 'inertiatic/CVS', 
107
                        'inertiatic/foo.pyc'])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
108
        added, ignored = smart_add_tree(wt, u'.')
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
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
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
115
class TestSmartAddBranch(TestCaseWithTransport):
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
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)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
122
        wt = self.make_branch_and_tree('.')
123
        branch = wt.branch
124
        smart_add_tree(wt, (u".",))
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
125
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
126
            self.assertNotEqual(wt.path2id(path), None)
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
127
128
    def test_add_dot_from_subdir(self):
129
        """Test adding . from a subdir of the tree.""" 
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
130
        from bzrlib.add import smart_add_tree
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
131
        paths = ("original/", "original/file1", "original/file2")
132
        self.build_tree(paths)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
133
        wt = self.make_branch_and_tree('.')
134
        branch = wt.branch
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
135
        os.chdir("original")
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
136
        smart_add_tree(wt, (u".",))
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
137
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
138
            self.assertNotEqual(wt.path2id(path), None)
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
139
140
    def test_add_tree_from_above_tree(self):
141
        """Test adding a tree from above the tree.""" 
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
142
        from bzrlib.add import smart_add_tree
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
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)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
147
        tree = self.make_branch_and_tree('branch')
148
        branch = tree.branch
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
149
        smart_add_tree(tree, ("branch",))
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
150
        for path in paths:
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
151
            self.assertNotEqual(tree.path2id(path), None)
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
152
153
    def test_add_above_tree_preserves_tree(self):
154
        """Test nested trees are not affect by an add above them."""
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
155
        from bzrlib.add import smart_add_tree
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
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)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
162
        tree = self.make_branch_and_tree('.')
163
        branch = tree.branch
164
        child_tree = self.make_branch_and_tree("original/child")
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
165
        smart_add_tree(tree, (u".",))
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
166
        for path in paths:
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
167
            self.assertNotEqual((path, tree.path2id(path)),
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
168
                                (path, None))
169
        for path in full_child_paths:
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
170
            self.assertEqual((path, tree.path2id(path)),
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
171
                             (path, None))
172
        for path in child_paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
173
            self.assertEqual(child_tree.path2id(path), None)
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
174
175
    def test_add_paths(self):
176
        """Test smart-adding a list of paths."""
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
177
        from bzrlib.add import smart_add_tree
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
178
        paths = ("file1", "file2")
179
        self.build_tree(paths)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
180
        wt = self.make_branch_and_tree('.')
181
        branch = wt.branch
182
        smart_add_tree(wt, paths)
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
183
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
184
            self.assertNotEqual(wt.path2id(path), None)
185
186
187
class TestAddActions(TestCase):
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
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):
1399.1.10 by Robert Collins
remove kind from the InventoryEntry constructor - only child classes should be created now
194
        self.entry = InventoryFile("id", "name", None)
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
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):
1092.1.30 by Robert Collins
change smart_add reporting of added files to callback with the entry, and change the inventory.add signature to return the added entry
207
        from StringIO import StringIO
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
208
        inv = Inventory()
1092.1.30 by Robert Collins
change smart_add reporting of added files to callback with the entry, and change the inventory.add signature to return the added entry
209
        stdout = StringIO()
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
210
211
        self.apply_redirected(None, stdout, None, action, inv, 'path', 'file')
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)