/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1399.1.12 by Robert Collins
add new test script
1
# (C) 2005 Canonical Ltd
2
# Authors:  Robert Collins <robert.collins@canonical.com>
3
#
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
18
from cStringIO import StringIO
1399.1.12 by Robert Collins
add new test script
19
import os
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
20
21
import bzrlib
1399.1.12 by Robert Collins
add new test script
22
from bzrlib.branch import Branch
1508.1.3 by Robert Collins
Do not consider urls to be relative paths within working trees.
23
from bzrlib.errors import NotBranchError, NotVersionedError
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
24
from bzrlib.tests import TestCaseWithTransport
1399.1.12 by Robert Collins
add new test script
25
from bzrlib.trace import mutter
1185.31.49 by John Arbash Meinel
Some corrections using the new osutils.rename. **ALL TESTS PASS**
26
from bzrlib.osutils import pathjoin, getcwd, has_symlinks
1457.1.1 by Robert Collins
rather than getting the branch inventory, WorkingTree can use the whole Branch, or make its own.
27
from bzrlib.workingtree import (TreeEntry, TreeDirectory, TreeFile, TreeLink,
28
                                WorkingTree)
1399.1.12 by Robert Collins
add new test script
29
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
30
class TestTreeDirectory(TestCaseWithTransport):
1399.1.12 by Robert Collins
add new test script
31
32
    def test_kind_character(self):
33
        self.assertEqual(TreeDirectory().kind_character(), '/')
34
35
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
36
class TestTreeEntry(TestCaseWithTransport):
1399.1.12 by Robert Collins
add new test script
37
38
    def test_kind_character(self):
39
        self.assertEqual(TreeEntry().kind_character(), '???')
40
41
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
42
class TestTreeFile(TestCaseWithTransport):
1399.1.12 by Robert Collins
add new test script
43
44
    def test_kind_character(self):
45
        self.assertEqual(TreeFile().kind_character(), '')
46
47
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
48
class TestTreeLink(TestCaseWithTransport):
1399.1.12 by Robert Collins
add new test script
49
50
    def test_kind_character(self):
51
        self.assertEqual(TreeLink().kind_character(), '')
52
53
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
54
class TestWorkingTree(TestCaseWithTransport):
1399.1.12 by Robert Collins
add new test script
55
56
    def test_listfiles(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
57
        tree = WorkingTree.create_standalone('.')
1399.1.12 by Robert Collins
add new test script
58
        os.mkdir('dir')
59
        print >> open('file', 'w'), "content"
1185.31.49 by John Arbash Meinel
Some corrections using the new osutils.rename. **ALL TESTS PASS**
60
        if has_symlinks():
61
            os.symlink('target', 'symlink')
1399.1.12 by Robert Collins
add new test script
62
        files = list(tree.list_files())
63
        self.assertEqual(files[0], ('dir', '?', 'directory', None, TreeDirectory()))
64
        self.assertEqual(files[1], ('file', '?', 'file', None, TreeFile()))
1185.31.49 by John Arbash Meinel
Some corrections using the new osutils.rename. **ALL TESTS PASS**
65
        if has_symlinks():
66
            self.assertEqual(files[2], ('symlink', '?', 'symlink', None, TreeLink()))
1457.1.1 by Robert Collins
rather than getting the branch inventory, WorkingTree can use the whole Branch, or make its own.
67
1508.1.1 by Robert Collins
Provide a open_containing for WorkingTree.
68
    def test_open_containing(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
69
        branch = WorkingTree.create_standalone('.').branch
1508.1.1 by Robert Collins
Provide a open_containing for WorkingTree.
70
        wt, relpath = WorkingTree.open_containing()
71
        self.assertEqual('', relpath)
1530.1.3 by Robert Collins
transport implementations now tested consistently.
72
        self.assertEqual(wt.basedir + '/', branch.base)
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
73
        wt, relpath = WorkingTree.open_containing(u'.')
1508.1.1 by Robert Collins
Provide a open_containing for WorkingTree.
74
        self.assertEqual('', relpath)
1530.1.3 by Robert Collins
transport implementations now tested consistently.
75
        self.assertEqual(wt.basedir + '/', branch.base)
1508.1.1 by Robert Collins
Provide a open_containing for WorkingTree.
76
        wt, relpath = WorkingTree.open_containing('./foo')
77
        self.assertEqual('foo', relpath)
1530.1.3 by Robert Collins
transport implementations now tested consistently.
78
        self.assertEqual(wt.basedir + '/', branch.base)
1508.1.3 by Robert Collins
Do not consider urls to be relative paths within working trees.
79
        # paths that are urls are just plain wrong for working trees.
80
        self.assertRaises(NotBranchError,
81
                          WorkingTree.open_containing, 
1185.31.39 by John Arbash Meinel
Replacing os.getcwdu() with osutils.getcwd(),
82
                          'file:///' + getcwd())
1508.1.1 by Robert Collins
Provide a open_containing for WorkingTree.
83
1457.1.1 by Robert Collins
rather than getting the branch inventory, WorkingTree can use the whole Branch, or make its own.
84
    def test_construct_with_branch(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
85
        branch = WorkingTree.create_standalone('.').branch
1457.1.1 by Robert Collins
rather than getting the branch inventory, WorkingTree can use the whole Branch, or make its own.
86
        tree = WorkingTree(branch.base, branch)
87
        self.assertEqual(branch, tree.branch)
1530.1.3 by Robert Collins
transport implementations now tested consistently.
88
        self.assertEqual(branch.base, tree.basedir + '/')
1457.1.1 by Robert Collins
rather than getting the branch inventory, WorkingTree can use the whole Branch, or make its own.
89
    
90
    def test_construct_without_branch(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
91
        branch = WorkingTree.create_standalone('.').branch
1457.1.1 by Robert Collins
rather than getting the branch inventory, WorkingTree can use the whole Branch, or make its own.
92
        tree = WorkingTree(branch.base)
93
        self.assertEqual(branch.base, tree.branch.base)
1530.1.3 by Robert Collins
transport implementations now tested consistently.
94
        self.assertEqual(branch.base, tree.basedir + '/')
1457.1.3 by Robert Collins
make Branch.relpath delegate to the working tree.
95
96
    def test_basic_relpath(self):
97
        # for comprehensive relpath tests, see whitebox.py.
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
98
        tree = WorkingTree.create_standalone('.')
1457.1.3 by Robert Collins
make Branch.relpath delegate to the working tree.
99
        self.assertEqual('child',
1185.31.39 by John Arbash Meinel
Replacing os.getcwdu() with osutils.getcwd(),
100
                         tree.relpath(pathjoin(getcwd(), 'child')))
1442.1.65 by Robert Collins
Branch.remove has been moved to WorkingTree.
101
102
    def test_lock_locks_branch(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
103
        tree = WorkingTree.create_standalone('.')
1442.1.65 by Robert Collins
Branch.remove has been moved to WorkingTree.
104
        tree.lock_read()
105
        self.assertEqual(1, tree.branch._lock_count)
106
        self.assertEqual('r', tree.branch._lock_mode)
107
        tree.unlock()
108
        self.assertEqual(None, tree.branch._lock_count)
109
        tree.lock_write()
110
        self.assertEqual(1, tree.branch._lock_count)
111
        self.assertEqual('w', tree.branch._lock_mode)
112
        tree.unlock()
113
        self.assertEqual(None, tree.branch._lock_count)
1442.1.68 by Robert Collins
'bzr pull' now accepts '--clobber'.
114
 
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
115
    def get_pullable_trees(self):
1442.1.67 by Robert Collins
Factor out the guts of 'pull' from the command into WorkingTree.pull().
116
        self.build_tree(['from/', 'from/file', 'to/'])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
117
        tree = WorkingTree.create_standalone('from')
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
118
        tree.add('file')
119
        tree.commit('foo', rev_id='A')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
120
        tree_b = WorkingTree.create_standalone('to')
121
        return tree, tree_b
1442.1.68 by Robert Collins
'bzr pull' now accepts '--clobber'.
122
 
123
    def test_pull(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
124
        tree_a, tree_b = self.get_pullable_trees()
125
        tree_b.pull(tree_a.branch)
126
        self.failUnless(tree_b.branch.has_revision('A'))
127
        self.assertEqual(['A'], tree_b.branch.revision_history())
1442.1.68 by Robert Collins
'bzr pull' now accepts '--clobber'.
128
1185.12.92 by Aaron Bentley
Fixed pull help, renamed clobber to overwrite
129
    def test_pull_overwrites(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
130
        tree_a, tree_b = self.get_pullable_trees()
131
        tree_b.commit('foo', rev_id='B')
132
        self.assertEqual(['B'], tree_b.branch.revision_history())
133
        tree_b.pull(tree_a.branch, overwrite=True)
134
        self.failUnless(tree_b.branch.has_revision('A'))
135
        self.failUnless(tree_b.branch.has_revision('B'))
136
        self.assertEqual(['A'], tree_b.branch.revision_history())
1501 by Robert Collins
Move revert from Branch to WorkingTree.
137
138
    def test_revert(self):
139
        """Test selected-file revert"""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
140
        tree = WorkingTree.create_standalone('.')
1501 by Robert Collins
Move revert from Branch to WorkingTree.
141
142
        self.build_tree(['hello.txt'])
143
        file('hello.txt', 'w').write('initial hello')
144
145
        self.assertRaises(NotVersionedError,
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
146
                          tree.revert, ['hello.txt'])
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
147
        tree.add(['hello.txt'])
148
        tree.commit('create initial hello.txt')
1501 by Robert Collins
Move revert from Branch to WorkingTree.
149
150
        self.check_file_contents('hello.txt', 'initial hello')
151
        file('hello.txt', 'w').write('new hello')
152
        self.check_file_contents('hello.txt', 'new hello')
153
154
        # revert file modified since last revision
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
155
        tree.revert(['hello.txt'])
1501 by Robert Collins
Move revert from Branch to WorkingTree.
156
        self.check_file_contents('hello.txt', 'initial hello')
157
        self.check_file_contents('hello.txt~', 'new hello')
158
1457.1.8 by Robert Collins
Replace the WorkingTree.revert method algorithm with a call to merge_inner.
159
        # reverting again does not clobber the backup
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
160
        tree.revert(['hello.txt'])
1501 by Robert Collins
Move revert from Branch to WorkingTree.
161
        self.check_file_contents('hello.txt', 'initial hello')
1457.1.8 by Robert Collins
Replace the WorkingTree.revert method algorithm with a call to merge_inner.
162
        self.check_file_contents('hello.txt~', 'new hello')
1508.1.6 by Robert Collins
Move Branch.unknowns() to WorkingTree.
163
164
    def test_unknowns(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
165
        tree = WorkingTree.create_standalone('.')
1508.1.6 by Robert Collins
Move Branch.unknowns() to WorkingTree.
166
        self.build_tree(['hello.txt',
167
                         'hello.txt~'])
168
        self.assertEquals(list(tree.unknowns()),
169
                          ['hello.txt'])
170
1185.60.6 by Aaron Bentley
Fixed hashcache
171
    def test_hashcache(self):
172
        from bzrlib.tests.test_hashcache import pause
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
173
        tree = WorkingTree.create_standalone('.')
1185.60.6 by Aaron Bentley
Fixed hashcache
174
        self.build_tree(['hello.txt',
175
                         'hello.txt~'])
176
        tree.add('hello.txt')
177
        pause()
178
        sha = tree.get_file_sha1(tree.path2id('hello.txt'))
179
        self.assertEqual(1, tree._hashcache.miss_count)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
180
        tree2 = WorkingTree('.', tree.branch)
1185.60.6 by Aaron Bentley
Fixed hashcache
181
        sha2 = tree2.get_file_sha1(tree2.path2id('hello.txt'))
182
        self.assertEqual(0, tree2._hashcache.miss_count)
183
        self.assertEqual(1, tree2._hashcache.hit_count)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
184
185
    def test_checkout(self):
186
        # at this point as we dont have checkout versions, checkout simply
187
        # populates the required files for a working tree at the dir.
188
        self.build_tree(['branch/'])
189
        b = Branch.create('branch')
190
        t = WorkingTree.create(b, 'tree')
191
        # as we are moving the ownership to working tree, we will check here
192
        # that its split out correctly
193
        self.failIfExists('branch/.bzr/inventory')
194
        self.failIfExists('branch/.bzr/pending-merges')
195
        sio = StringIO()
196
        bzrlib.xml5.serializer_v5.write_inventory(bzrlib.inventory.Inventory(),
197
                                                  sio)
198
        self.assertFileEqual(sio.getvalue(), 'tree/.bzr/inventory')
199
        self.assertFileEqual('', 'tree/.bzr/pending-merges')
200
201
    def test_initialize(self):
202
        # initialize should create a working tree and branch in an existing dir
203
        t = WorkingTree.create_standalone('.')
204
        b = Branch.open('.')
205
        self.assertEqual(t.branch.base, b.base)
206
        t2 = WorkingTree('.')
207
        self.assertEqual(t.basedir, t2.basedir)
208
        self.assertEqual(b.base, t2.branch.base)
209
        # TODO maybe we should check the branch format? not sure if its
210
        # appropriate here.
211
212
    def test_rename_dirs(self):
213
        """Test renaming directories and the files within them."""
214
        wt = self.make_branch_and_tree('.')
215
        b = wt.branch
216
        self.build_tree(['dir/', 'dir/sub/', 'dir/sub/file'])
217
        wt.add(['dir', 'dir/sub', 'dir/sub/file'])
218
219
        wt.commit('create initial state')
220
221
        revid = b.revision_history()[0]
222
        self.log('first revision_id is {%s}' % revid)
223
        
224
        inv = b.get_revision_inventory(revid)
225
        self.log('contents of inventory: %r' % inv.entries())
226
227
        self.check_inventory_shape(inv,
228
                                   ['dir', 'dir/sub', 'dir/sub/file'])
229
230
        wt.rename_one('dir', 'newdir')
231
232
        self.check_inventory_shape(wt.read_working_inventory(),
233
                                   ['newdir', 'newdir/sub', 'newdir/sub/file'])
234
235
        wt.rename_one('newdir/sub', 'newdir/newsub')
236
        self.check_inventory_shape(wt.read_working_inventory(),
237
                                   ['newdir', 'newdir/newsub',
238
                                    'newdir/newsub/file'])
239
240
    def test_add_in_unversioned(self):
241
        """Try to add a file in an unversioned directory.
242
243
        "bzr add" adds the parent as necessary, but simple working tree add
244
        doesn't do that.
245
        """
246
        from bzrlib.errors import NotVersionedError
247
        wt = self.make_branch_and_tree('.')
248
        self.build_tree(['foo/',
249
                         'foo/hello'])
250
        self.assertRaises(NotVersionedError,
251
                          wt.add,
252
                          'foo/hello')
253
254
    def test_remove_verbose(self):
255
        #FIXME the remove api should not print or otherwise depend on the
256
        # text UI - RBC 20060124
257
        wt = self.make_branch_and_tree('.')
258
        self.build_tree(['hello'])
259
        wt.add(['hello'])
260
        wt.commit(message='add hello')
261
        stdout = StringIO()
262
        stderr = StringIO()
263
        self.assertEqual(None, self.apply_redirected(None, stdout, stderr,
264
                                                     wt.remove,
265
                                                     ['hello'],
266
                                                     verbose=True))
267
        self.assertEqual('?       hello\n', stdout.getvalue())
268
        self.assertEqual('', stderr.getvalue())