/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1092.1.26 by Robert Collins
start writing star-topology test, realise we need smart-add change
1
import os
2
import unittest
3
1830.3.6 by John Arbash Meinel
Test that smart_add_tree does the right thing in the presence of non-normalized filenames
4
from bzrlib import errors, osutils
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
5
from bzrlib.add import smart_add, smart_add_tree
1830.3.6 by John Arbash Meinel
Test that smart_add_tree does the right thing in the presence of non-normalized filenames
6
from bzrlib.tests import TestCase, TestCaseWithTransport, TestSkipped
1765.1.1 by Robert Collins
Remove the default ignores list from bzr, lowering the minimum overhead in bzr add.
7
from bzrlib.errors import 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
1830.3.4 by John Arbash Meinel
A couple no-op cleanups
11
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
12
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
13
14
    def test_add_dot_from_root(self):
15
        """Test adding . from the root of the tree.""" 
16
        from bzrlib.add import smart_add
17
        paths = ("original/", "original/file1", "original/file2")
18
        self.build_tree(paths)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
19
        wt = self.make_branch_and_tree('.')
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('.')
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
30
        os.chdir("original")
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
31
        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
32
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
33
            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
34
35
    def test_add_tree_from_above_tree(self):
36
        """Test adding a tree from above the tree.""" 
37
        from bzrlib.add import smart_add
38
        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
39
        branch_paths = ("branch/", "branch/original/", "branch/original/file1",
40
                        "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
41
        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.
42
        wt = self.make_branch_and_tree('branch')
43
        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
44
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
45
            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
46
47
    def test_add_above_tree_preserves_tree(self):
48
        """Test nested trees are not affect by an add above them."""
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
49
        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
50
        paths = ("original/", "original/file1", "original/file2")
1143 by Martin Pool
- remove dead code and remove some small errors (pychecker)
51
        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
52
        full_child_paths = ("original/child", "original/child/path")
53
        build_paths = ("original/", "original/file1", "original/file2", 
54
                       "original/child/", "original/child/path")
1143 by Martin Pool
- remove dead code and remove some small errors (pychecker)
55
        
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
56
        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.
57
        wt = self.make_branch_and_tree('.')
58
        child_tree = self.make_branch_and_tree('original/child')
1757.2.9 by Robert Collins
Remove spurious u cast from test_smart_add.py
59
        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
60
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
61
            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
62
                                (path, None))
63
        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.
64
            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
65
                             (path, None))
66
        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.
67
            self.assertEqual(child_tree.path2id(path), None)
1092.1.28 by Robert Collins
test adding lists of paths
68
69
    def test_add_paths(self):
70
        """Test smart-adding a list of paths."""
71
        from bzrlib.add import smart_add
72
        paths = ("file1", "file2")
73
        self.build_tree(paths)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
74
        wt = self.make_branch_and_tree('.')
75
        smart_add_tree(wt, paths)
1092.1.28 by Robert Collins
test adding lists of paths
76
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
77
            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.
78
    
79
    def test_add_ignored_nested_paths(self):
80
        """Test smart-adding a list of paths which includes ignored ones."""
81
        wt = self.make_branch_and_tree('.')
82
        tree_shape = ("adir/", "adir/CVS/", "adir/CVS/afile", "adir/CVS/afile2")
83
        add_paths = ("adir/CVS", "adir/CVS/afile", "adir")
84
        expected_paths = ("adir", "adir/CVS", "adir/CVS/afile", "adir/CVS/afile2")
85
        self.build_tree(tree_shape)
86
        smart_add_tree(wt, add_paths)
87
        for path in expected_paths:
88
            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
89
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.
90
    def test_save_false(self):
91
        """Test smart-adding a path with save set to false."""
92
        wt = self.make_branch_and_tree('.')
93
        self.build_tree(['file'])
94
        smart_add_tree(wt, ['file'], save=False)
95
        self.assertNotEqual(wt.path2id('file'), None, "No id added for 'file'")
96
        wt.read_working_inventory()
97
        self.assertEqual(wt.path2id('file'), None)
98
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
99
    def test_add_dry_run(self):
100
        """Test a dry run add, make sure nothing is added."""
101
        from bzrlib.commands import run_bzr
102
        eq = self.assertEqual
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
103
        wt = self.make_branch_and_tree('.')
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
104
        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.
105
        eq(list(wt.unknowns()), ['inertiatic'])
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
106
        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.
107
        eq(list(wt.unknowns()), ['inertiatic'])
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
108
1185.56.2 by Michael Ellerman
Raise NoSuchFile when someone tries to add a non-existant file.
109
    def test_add_non_existant(self):
110
        """Test smart-adding a file that does not exist."""
111
        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.
112
        wt = self.make_branch_and_tree('.')
113
        self.assertRaises(NoSuchFile, smart_add_tree, wt, 'non-existant-file')
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
114
1765.1.1 by Robert Collins
Remove the default ignores list from bzr, lowering the minimum overhead in bzr add.
115
    def test_returns_and_ignores(self):
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
116
        """Correctly returns added/ignored files"""
117
        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.
118
        wt = self.make_branch_and_tree('.')
1765.1.1 by Robert Collins
Remove the default ignores list from bzr, lowering the minimum overhead in bzr add.
119
        # no files should be ignored by default, so we need to create
120
        # an ignore rule - we create one for the pyc files, which means
121
        # CVS should not be ignored.
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
122
        self.build_tree(['inertiatic/', 'inertiatic/esp', 'inertiatic/CVS', 
123
                        'inertiatic/foo.pyc'])
1765.1.1 by Robert Collins
Remove the default ignores list from bzr, lowering the minimum overhead in bzr add.
124
        self.build_tree_contents([('.bzrignore', '*.py[oc]\n')])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
125
        added, ignored = smart_add_tree(wt, u'.')
1765.1.1 by Robert Collins
Remove the default ignores list from bzr, lowering the minimum overhead in bzr add.
126
        self.assertSubset(('inertiatic', 'inertiatic/esp', 'inertiatic/CVS'),
127
                          added)
128
        self.assertSubset(('*.py[oc]',), ignored)
1553.5.3 by Martin Pool
[patch] Rename TestCase.AssertSubset to assertSubset for consistency (Jan Hudec)
129
        self.assertSubset(('inertiatic/foo.pyc',), ignored['*.py[oc]'])
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
130
131
1765.1.1 by Robert Collins
Remove the default ignores list from bzr, lowering the minimum overhead in bzr add.
132
class TestSmartAddTree(TestCaseWithTransport):
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
133
    """Test smart adds with a specified branch."""
134
135
    def test_add_dot_from_root(self):
136
        """Test adding . from the root of the tree.""" 
137
        paths = ("original/", "original/file1", "original/file2")
138
        self.build_tree(paths)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
139
        wt = self.make_branch_and_tree('.')
140
        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
141
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
142
            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
143
144
    def test_add_dot_from_subdir(self):
145
        """Test adding . from a subdir of the tree.""" 
146
        paths = ("original/", "original/file1", "original/file2")
147
        self.build_tree(paths)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
148
        wt = self.make_branch_and_tree('.')
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
149
        os.chdir("original")
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
150
        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
151
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
152
            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
153
154
    def test_add_tree_from_above_tree(self):
155
        """Test adding a tree from above the tree.""" 
156
        paths = ("original/", "original/file1", "original/file2")
157
        branch_paths = ("branch/", "branch/original/", "branch/original/file1",
158
                        "branch/original/file2")
159
        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.
160
        tree = self.make_branch_and_tree('branch')
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
161
        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
162
        for path in paths:
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
163
            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
164
165
    def test_add_above_tree_preserves_tree(self):
166
        """Test nested trees are not affect by an add above them."""
167
        paths = ("original/", "original/file1", "original/file2")
168
        child_paths = ("path")
169
        full_child_paths = ("original/child", "original/child/path")
170
        build_paths = ("original/", "original/file1", "original/file2", 
171
                       "original/child/", "original/child/path")
172
        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.
173
        tree = self.make_branch_and_tree('.')
174
        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)
175
        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
176
        for path in paths:
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
177
            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
178
                                (path, None))
179
        for path in full_child_paths:
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
180
            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
181
                             (path, None))
182
        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.
183
            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
184
185
    def test_add_paths(self):
186
        """Test smart-adding a list of paths."""
187
        paths = ("file1", "file2")
188
        self.build_tree(paths)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
189
        wt = self.make_branch_and_tree('.')
190
        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
191
        for path in paths:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
192
            self.assertNotEqual(wt.path2id(path), None)
193
1850.2.1 by John Arbash Meinel
Fix bug #52578, smart-add wasn't recursing all supplied directories.
194
    def test_add_multiple_dirs(self):
195
        """Test smart adding multiple directories at once."""
196
        added_paths = ['file1', 'file2',
197
                       'dir1/', 'dir1/file3',
198
                       'dir1/subdir2/', 'dir1/subdir2/file4',
199
                       'dir2/', 'dir2/file5',
200
                      ]
201
        not_added = ['file6', 'dir3/', 'dir3/file7', 'dir3/file8']
202
        self.build_tree(added_paths)
203
        self.build_tree(not_added)
204
205
        wt = self.make_branch_and_tree('.')
206
        smart_add_tree(wt, ['file1', 'file2', 'dir1', 'dir2'])
207
208
        for path in added_paths:
209
            self.assertNotEqual(None, wt.path2id(path.rstrip('/')),
210
                    'Failed to add path: %s' % (path,))
211
        for path in not_added:
212
            self.assertEqual(None, wt.path2id(path.rstrip('/')),
213
                    'Accidentally added path: %s' % (path,))
214
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
215
1830.3.6 by John Arbash Meinel
Test that smart_add_tree does the right thing in the presence of non-normalized filenames
216
class TestAddNonNormalized(TestCaseWithTransport):
217
218
    def make(self):
219
        try:
220
            self.build_tree([u'a\u030a'])
221
        except UnicodeError:
222
            raise TestSkipped('Filesystem cannot create unicode filenames')
223
224
        self.wt = self.make_branch_and_tree('.')
225
226
    def test_accessible_explicit(self):
227
        self.make()
228
        orig = osutils.normalized_filename
229
        osutils.normalized_filename = osutils._accessible_normalized_filename
230
        try:
231
            smart_add_tree(self.wt, [u'a\u030a'])
1830.3.17 by John Arbash Meinel
list_files() with wrong normalized_filename code raises exceptions. Fix this
232
            self.assertEqual([(u'\xe5', 'file')],
233
                    [(path, ie.kind) for path,ie in 
234
                        self.wt.inventory.iter_entries()])
1830.3.6 by John Arbash Meinel
Test that smart_add_tree does the right thing in the presence of non-normalized filenames
235
        finally:
236
            osutils.normalized_filename = orig
237
238
    def test_accessible_implicit(self):
239
        self.make()
240
        orig = osutils.normalized_filename
241
        osutils.normalized_filename = osutils._accessible_normalized_filename
242
        try:
243
            smart_add_tree(self.wt, [])
1830.3.17 by John Arbash Meinel
list_files() with wrong normalized_filename code raises exceptions. Fix this
244
            self.assertEqual([(u'\xe5', 'file')],
245
                    [(path, ie.kind) for path,ie in 
246
                        self.wt.inventory.iter_entries()])
1830.3.6 by John Arbash Meinel
Test that smart_add_tree does the right thing in the presence of non-normalized filenames
247
        finally:
248
            osutils.normalized_filename = orig
249
250
    def test_inaccessible_explicit(self):
251
        self.make()
252
        orig = osutils.normalized_filename
253
        osutils.normalized_filename = osutils._inaccessible_normalized_filename
254
        try:
255
            self.assertRaises(errors.InvalidNormalization,
256
                    smart_add_tree, self.wt, [u'a\u030a'])
257
        finally:
258
            osutils.normalized_filename = orig
259
260
    def test_inaccessible_implicit(self):
261
        self.make()
262
        orig = osutils.normalized_filename
263
        osutils.normalized_filename = osutils._inaccessible_normalized_filename
264
        try:
265
            # TODO: jam 20060701 In the future, this should probably
266
            #       just ignore files that don't fit the normalization
267
            #       rules, rather than exploding
268
            self.assertRaises(errors.InvalidNormalization,
269
                    smart_add_tree, self.wt, [])
270
        finally:
271
            osutils.normalized_filename = orig
272
273
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
274
class TestAddActions(TestCase):
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
275
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.
276
    def test_quiet(self):
277
        self.run_action("")
278
279
    def test__print(self):
280
        self.run_action("added path\n")
281
282
    def run_action(self, output):
1757.2.3 by Robert Collins
Get add tests passing.
283
        from bzrlib.add import AddAction, FastPath
1185.85.12 by John Arbash Meinel
Refactoring AddAction to allow redirecting to an encoding file.
284
        from cStringIO import StringIO
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
285
        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
286
        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.
287
        action = AddAction(to_file=stdout, should_print=bool(output))
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
288
1757.2.3 by Robert Collins
Get add tests passing.
289
        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
290
        self.assertEqual(stdout.getvalue(), output)