~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
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
4
from bzrlib.tests import TestCaseInTempDir, TestCase
1092.1.26 by Robert Collins
start writing star-topology test, realise we need smart-add change
5
from bzrlib.branch import Branch
1185.56.2 by Michael Ellerman
Raise NoSuchFile when someone tries to add a non-existant file.
6
from bzrlib.errors import NotBranchError, NoSuchFile
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
7
from bzrlib.inventory import InventoryFile, Inventory
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
8
from bzrlib.workingtree import WorkingTree
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
9
from bzrlib.add import smart_add
1092.1.26 by Robert Collins
start writing star-topology test, realise we need smart-add change
10
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
11
class TestSmartAdd(TestCaseInTempDir):
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)
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
18
        branch = Branch.initialize(u".")
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
19
        smart_add((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
20
        for path in paths:
1497 by Robert Collins
Move Branch.read_working_inventory to WorkingTree.
21
            self.assertNotEqual(branch.working_tree().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
22
23
    def test_add_dot_from_subdir(self):
24
        """Test adding . from a subdir of the tree.""" 
25
        from bzrlib.add import smart_add
26
        paths = ("original/", "original/file1", "original/file2")
27
        self.build_tree(paths)
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
28
        branch = Branch.initialize(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
29
        os.chdir("original")
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
30
        smart_add((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
31
        for path in paths:
1497 by Robert Collins
Move Branch.read_working_inventory to WorkingTree.
32
            self.assertNotEqual(branch.working_tree().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
33
34
    def test_add_tree_from_above_tree(self):
35
        """Test adding a tree from above the tree.""" 
36
        from bzrlib.add import smart_add
37
        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
38
        branch_paths = ("branch/", "branch/original/", "branch/original/file1",
39
                        "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
40
        self.build_tree(branch_paths)
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
41
        branch = Branch.initialize("branch")
1159 by Martin Pool
- clean up parameters to smart_add and smart_add_branch
42
        smart_add(("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
43
        for path in paths:
1497 by Robert Collins
Move Branch.read_working_inventory to WorkingTree.
44
            self.assertNotEqual(branch.working_tree().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
45
46
    def test_add_above_tree_preserves_tree(self):
47
        """Test nested trees are not affect by an add above them."""
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
48
        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
49
        paths = ("original/", "original/file1", "original/file2")
1143 by Martin Pool
- remove dead code and remove some small errors (pychecker)
50
        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
51
        full_child_paths = ("original/child", "original/child/path")
52
        build_paths = ("original/", "original/file1", "original/file2", 
53
                       "original/child/", "original/child/path")
1143 by Martin Pool
- remove dead code and remove some small errors (pychecker)
54
        
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
55
        self.build_tree(build_paths)
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
56
        branch = Branch.initialize(u".")
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
57
        child_branch = Branch.initialize("original/child")
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
58
        smart_add((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
59
        for path in paths:
1497 by Robert Collins
Move Branch.read_working_inventory to WorkingTree.
60
            self.assertNotEqual((path, branch.working_tree().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
61
                                (path, None))
62
        for path in full_child_paths:
1497 by Robert Collins
Move Branch.read_working_inventory to WorkingTree.
63
            self.assertEqual((path, branch.working_tree().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
64
                             (path, None))
65
        for path in child_paths:
1497 by Robert Collins
Move Branch.read_working_inventory to WorkingTree.
66
            self.assertEqual(child_branch.working_tree().path2id(path), None)
1092.1.28 by Robert Collins
test adding lists of paths
67
68
    def test_add_paths(self):
69
        """Test smart-adding a list of paths."""
70
        from bzrlib.add import smart_add
71
        paths = ("file1", "file2")
72
        self.build_tree(paths)
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
73
        branch = Branch.initialize(u".")
1159 by Martin Pool
- clean up parameters to smart_add and smart_add_branch
74
        smart_add(paths)
1092.1.28 by Robert Collins
test adding lists of paths
75
        for path in paths:
1497 by Robert Collins
Move Branch.read_working_inventory to WorkingTree.
76
            self.assertNotEqual(branch.working_tree().path2id(path), None)
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
77
78
    def test_add_dry_run(self):
79
        """Test a dry run add, make sure nothing is added."""
80
        from bzrlib.commands import run_bzr
81
        eq = self.assertEqual
82
        b = Branch.initialize(u'.')
83
        t = b.working_tree()
84
        self.build_tree(['inertiatic/', 'inertiatic/esp'])
85
        eq(list(t.unknowns()), ['inertiatic'])
86
        self.capture('add --dry-run .')
87
        eq(list(t.unknowns()), ['inertiatic'])
88
1185.56.2 by Michael Ellerman
Raise NoSuchFile when someone tries to add a non-existant file.
89
    def test_add_non_existant(self):
90
        """Test smart-adding a file that does not exist."""
91
        from bzrlib.add import smart_add
92
        branch = Branch.initialize(u".")
93
        self.assertRaises(NoSuchFile, smart_add, 'non-existant-file')
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
94
95
    def test_returns(self):
96
        """Correctly returns added/ignored files"""
97
        from bzrlib.commands import run_bzr
98
        b = Branch.initialize(u'.')
99
        t = b.working_tree()
100
        self.build_tree(['inertiatic/', 'inertiatic/esp', 'inertiatic/CVS', 
101
                        'inertiatic/foo.pyc'])
102
        added, ignored = smart_add(u'.')
103
        self.AssertSubset(('inertiatic', 'inertiatic/esp'), added)
104
        self.AssertSubset(('CVS', '*.py[oc]'), ignored)
105
        self.AssertSubset(('inertiatic/CVS',), ignored['CVS'])
106
        self.AssertSubset(('inertiatic/foo.pyc',), ignored['*.py[oc]'])
107
108
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
109
class TestSmartAddBranch(TestCaseInTempDir):
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
110
    """Test smart adds with a specified branch."""
111
112
    def test_add_dot_from_root(self):
113
        """Test adding . from the root of the tree.""" 
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
114
        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
115
        paths = ("original/", "original/file1", "original/file2")
116
        self.build_tree(paths)
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
117
        Branch.initialize(u".")
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
118
        tree = WorkingTree()
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
119
        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
120
        for path in paths:
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
121
            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
122
123
    def test_add_dot_from_subdir(self):
124
        """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)
125
        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
126
        paths = ("original/", "original/file1", "original/file2")
127
        self.build_tree(paths)
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
128
        Branch.initialize(u".")
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
129
        tree = WorkingTree()
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
130
        os.chdir("original")
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
131
        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
132
        for path in paths:
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
133
            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
134
135
    def test_add_tree_from_above_tree(self):
136
        """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)
137
        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
138
        paths = ("original/", "original/file1", "original/file2")
139
        branch_paths = ("branch/", "branch/original/", "branch/original/file1",
140
                        "branch/original/file2")
141
        self.build_tree(branch_paths)
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
142
        Branch.initialize("branch")
143
        tree = WorkingTree("branch")
144
        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
145
        for path in paths:
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
146
            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
147
148
    def test_add_above_tree_preserves_tree(self):
149
        """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)
150
        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
151
        paths = ("original/", "original/file1", "original/file2")
152
        child_paths = ("path")
153
        full_child_paths = ("original/child", "original/child/path")
154
        build_paths = ("original/", "original/file1", "original/file2", 
155
                       "original/child/", "original/child/path")
156
        self.build_tree(build_paths)
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
157
        Branch.initialize(u".")
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
158
        tree = WorkingTree()
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
159
        child_branch = Branch.initialize("original/child")
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
160
        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
161
        for path in paths:
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
162
            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
163
                                (path, None))
164
        for path in full_child_paths:
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
165
            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
166
                             (path, None))
167
        for path in child_paths:
1497 by Robert Collins
Move Branch.read_working_inventory to WorkingTree.
168
            self.assertEqual(child_branch.working_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
169
170
    def test_add_paths(self):
171
        """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)
172
        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
173
        paths = ("file1", "file2")
174
        self.build_tree(paths)
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
175
        Branch.initialize(u".")
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
176
        tree = WorkingTree()
177
        smart_add_tree(tree, paths)
1092.1.29 by Robert Collins
break smart_add into smart_add and smart_add_branch which will accept a branch parameter
178
        for path in paths:
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
179
            self.assertNotEqual(tree.path2id(path), None)
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
180
1530 by Robert Collins
* bzr add now lists how many files were ignored per glob. add --verbose
181
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
182
class TestAddActions(TestCaseInTempDir):
183
184
    def test_null(self):
185
        from bzrlib.add import add_action_null
186
        self.run_action(add_action_null, "", False)
187
188
    def test_add(self):
1399.1.10 by Robert Collins
remove kind from the InventoryEntry constructor - only child classes should be created now
189
        self.entry = InventoryFile("id", "name", None)
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
190
        from bzrlib.add import add_action_add
191
        self.run_action(add_action_add, "", True)
192
193
    def test_add_and_print(self):
194
        from bzrlib.add import add_action_add_and_print
195
        self.run_action(add_action_add_and_print, "added path\n", True)
196
197
    def test_print(self):
198
        from bzrlib.add import add_action_print
199
        self.run_action(add_action_print, "added path\n", False)
200
201
    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
202
        from StringIO import StringIO
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
203
        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
204
        stdout = StringIO()
1185.53.2 by Michael Ellerman
Add tests for bzr add --dry-run
205
206
        self.apply_redirected(None, stdout, None, action, inv, 'path', 'file')
207
        self.assertEqual(stdout.getvalue(), output)
208
209
        if should_add:
210
            self.assertNotEqual(inv.path2id('path'), None)
211
        else:
212
            self.assertEqual(inv.path2id('path'), None)