~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')
1757.2.9 by Robert Collins
Remove spurious u cast from test_smart_add.py
62
        smart_add_tree(wt, (".",))
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
        smart_add_tree(wt, paths)
1092.1.28 by Robert Collins
test adding lists of paths
79
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
80
            self.assertNotEqual(wt.path2id(path), None)
1757.2.5 by Robert Collins
De-dup the add list so we only walk subtrees once for add.
81
    
82
    def test_add_ignored_nested_paths(self):
83
        """Test smart-adding a list of paths which includes ignored ones."""
84
        wt = self.make_branch_and_tree('.')
85
        tree_shape = ("adir/", "adir/CVS/", "adir/CVS/afile", "adir/CVS/afile2")
86
        add_paths = ("adir/CVS", "adir/CVS/afile", "adir")
87
        expected_paths = ("adir", "adir/CVS", "adir/CVS/afile", "adir/CVS/afile2")
88
        self.build_tree(tree_shape)
89
        smart_add_tree(wt, add_paths)
90
        for path in expected_paths:
91
            self.assertNotEqual(wt.path2id(path), None, "No id added for %s" % path)
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
92
1757.2.6 by Robert Collins
Steps towards a nicer smart add - unwind the conditional add logic - having parents not in the inventory was overly complicating the rest of the code.
93
    def test_save_false(self):
94
        """Test smart-adding a path with save set to false."""
95
        wt = self.make_branch_and_tree('.')
96
        self.build_tree(['file'])
97
        smart_add_tree(wt, ['file'], save=False)
98
        self.assertNotEqual(wt.path2id('file'), None, "No id added for 'file'")
99
        wt.read_working_inventory()
100
        self.assertEqual(wt.path2id('file'), None)
101
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
102
    def test_add_dry_run(self):
103
        """Test a dry run add, make sure nothing is added."""
104
        from bzrlib.commands import run_bzr
105
        eq = self.assertEqual
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
106
        wt = self.make_branch_and_tree('.')
107
        branch = wt.branch
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
108
        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.
109
        eq(list(wt.unknowns()), ['inertiatic'])
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
110
        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.
111
        eq(list(wt.unknowns()), ['inertiatic'])
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
112
1185.56.2 by Michael Ellerman
Raise NoSuchFile when someone tries to add a non-existant file.
113
    def test_add_non_existant(self):
114
        """Test smart-adding a file that does not exist."""
115
        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.
116
        wt = self.make_branch_and_tree('.')
117
        branch = wt.branch
118
        self.assertRaises(NoSuchFile, smart_add_tree, wt, 'non-existant-file')
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
119
120
    def test_returns(self):
121
        """Correctly returns added/ignored files"""
122
        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.
123
        wt = self.make_branch_and_tree('.')
124
        branch = wt.branch
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
125
        self.build_tree(['inertiatic/', 'inertiatic/esp', 'inertiatic/CVS', 
126
                        'inertiatic/foo.pyc'])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
127
        added, ignored = smart_add_tree(wt, u'.')
1553.5.3 by Martin Pool
[patch] Rename TestCase.AssertSubset to assertSubset for consistency (Jan Hudec)
128
        self.assertSubset(('inertiatic', 'inertiatic/esp'), added)
129
        self.assertSubset(('CVS', '*.py[oc]'), ignored)
130
        self.assertSubset(('inertiatic/CVS',), ignored['CVS'])
131
        self.assertSubset(('inertiatic/foo.pyc',), ignored['*.py[oc]'])
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
132
133
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
134
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
135
    """Test smart adds with a specified branch."""
136
137
    def test_add_dot_from_root(self):
138
        """Test adding . from the root of the tree.""" 
139
        paths = ("original/", "original/file1", "original/file2")
140
        self.build_tree(paths)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
141
        wt = self.make_branch_and_tree('.')
142
        branch = wt.branch
143
        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
144
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
145
            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
146
147
    def test_add_dot_from_subdir(self):
148
        """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)
149
        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
150
        paths = ("original/", "original/file1", "original/file2")
151
        self.build_tree(paths)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
152
        wt = self.make_branch_and_tree('.')
153
        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
154
        os.chdir("original")
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
155
        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
156
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
157
            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
158
159
    def test_add_tree_from_above_tree(self):
160
        """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)
161
        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
162
        paths = ("original/", "original/file1", "original/file2")
163
        branch_paths = ("branch/", "branch/original/", "branch/original/file1",
164
                        "branch/original/file2")
165
        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.
166
        tree = self.make_branch_and_tree('branch')
167
        branch = tree.branch
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
168
        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
169
        for path in paths:
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
170
            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
171
172
    def test_add_above_tree_preserves_tree(self):
173
        """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)
174
        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
175
        paths = ("original/", "original/file1", "original/file2")
176
        child_paths = ("path")
177
        full_child_paths = ("original/child", "original/child/path")
178
        build_paths = ("original/", "original/file1", "original/file2", 
179
                       "original/child/", "original/child/path")
180
        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.
181
        tree = self.make_branch_and_tree('.')
182
        branch = tree.branch
183
        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)
184
        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
185
        for path in paths:
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
186
            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
187
                                (path, None))
188
        for path in full_child_paths:
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
189
            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
190
                             (path, None))
191
        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.
192
            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
193
194
    def test_add_paths(self):
195
        """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)
196
        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
197
        paths = ("file1", "file2")
198
        self.build_tree(paths)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
199
        wt = self.make_branch_and_tree('.')
200
        branch = wt.branch
201
        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
202
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
203
            self.assertNotEqual(wt.path2id(path), None)
204
205
206
class TestAddActions(TestCase):
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
207
1757.2.6 by Robert Collins
Steps towards a nicer smart add - unwind the conditional add logic - having parents not in the inventory was overly complicating the rest of the code.
208
    def test_quiet(self):
209
        self.run_action("")
210
211
    def test__print(self):
212
        self.run_action("added path\n")
213
214
    def run_action(self, output):
1757.2.3 by Robert Collins
Get add tests passing.
215
        from bzrlib.add import AddAction, FastPath
1185.85.12 by John Arbash Meinel
Refactoring AddAction to allow redirecting to an encoding file.
216
        from cStringIO import StringIO
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
217
        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
218
        stdout = StringIO()
1757.2.6 by Robert Collins
Steps towards a nicer smart add - unwind the conditional add logic - having parents not in the inventory was overly complicating the rest of the code.
219
        action = AddAction(to_file=stdout, should_print=bool(output))
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
220
1757.2.3 by Robert Collins
Get add tests passing.
221
        self.apply_redirected(None, stdout, None, action, inv, None, FastPath('path'), 'file')
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
222
        self.assertEqual(stdout.getvalue(), output)