1
# Copyright (C) 2005 Canonical Ltd
1
# Copyright (C) 2005 by Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
11
# GNU General Public License for more details.
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
18
"""Tests of simple versioning operations"""
25
from bzrlib.tests import TestCaseInTempDir
25
from bzrlib.selftest import BzrTestBase, TestCaseInTempDir
26
26
from bzrlib.branch import Branch
27
from bzrlib.trace import mutter
28
from bzrlib.osutils import pathjoin
29
from bzrlib.workingtree import WorkingTree
29
logger = logging.getLogger('bzr.test.versioning')
32
33
class TestVersioning(TestCaseInTempDir):
35
36
"""Basic 'bzr mkdir' operation"""
37
38
self.run_bzr('init')
38
self.run_bzr('mkdir foo')
39
self.run_bzr('mkdir', 'foo')
39
40
self.assert_(os.path.isdir('foo'))
41
self.run_bzr('mkdir foo', retcode=3)
43
wt = WorkingTree.open('.')
45
delta = wt.changes_from(wt.basis_tree())
42
self.run_bzr('mkdir', 'foo', retcode=2)
44
from bzrlib.diff import compare_trees
45
from bzrlib.branch import Branch
48
delta = compare_trees(b.basis_tree(), b.working_tree())
47
50
self.log('delta.added = %r' % delta.added)
54
57
"""'bzr mkdir' operation in subdirectory"""
56
59
self.run_bzr('init')
57
self.run_bzr('mkdir dir')
60
self.run_bzr('mkdir', 'dir')
58
61
self.assert_(os.path.isdir('dir'))
61
64
self.log('Run mkdir in subdir')
62
self.run_bzr('mkdir subdir')
65
self.run_bzr('mkdir', 'subdir')
63
66
self.assert_(os.path.isdir('subdir'))
66
wt = WorkingTree.open('.')
68
delta = wt.changes_from(wt.basis_tree())
69
from bzrlib.diff import compare_trees
70
from bzrlib.branch import Branch
73
delta = compare_trees(b.basis_tree(), b.working_tree())
70
75
self.log('delta.added = %r' % delta.added)
72
77
self.assertEquals(len(delta.added), 2)
73
78
self.assertEquals(delta.added[0][0], 'dir')
74
self.assertEquals(delta.added[1][0], pathjoin('dir','subdir'))
79
self.assertEquals(delta.added[1][0], os.path.join('dir','subdir'))
75
80
self.failIf(delta.modified)
77
83
def test_mkdir_w_nested_trees(self):
78
84
"""'bzr mkdir' with nested trees"""
86
92
self.run_bzr('init')
89
self.run_bzr('mkdir dir a/dir a/b/dir')
95
self.run_bzr('mkdir', 'dir', 'a/dir', 'a/b/dir')
90
96
self.failUnless(os.path.isdir('dir'))
91
97
self.failUnless(os.path.isdir('a/dir'))
92
98
self.failUnless(os.path.isdir('a/b/dir'))
94
wt = WorkingTree.open('.')
95
wt_a = WorkingTree.open('a')
96
wt_b = WorkingTree.open('a/b')
98
delta = wt.changes_from(wt.basis_tree())
99
self.assertEquals(len(delta.added), 1)
100
self.assertEquals(delta.added[0][0], 'dir')
101
self.failIf(delta.modified)
103
delta = wt_a.changes_from(wt_a.basis_tree())
104
self.assertEquals(len(delta.added), 1)
105
self.assertEquals(delta.added[0][0], 'dir')
106
self.failIf(delta.modified)
108
delta = wt_b.changes_from(wt_b.basis_tree())
109
self.assertEquals(len(delta.added), 1)
110
self.assertEquals(delta.added[0][0], 'dir')
111
self.failIf(delta.modified)
100
from bzrlib.diff import compare_trees
102
b_a = Branch.open('a')
103
b_b = Branch.open('a/b')
105
delta = compare_trees(b.basis_tree(), b.working_tree())
106
self.assertEquals(len(delta.added), 1)
107
self.assertEquals(delta.added[0][0], 'dir')
108
self.failIf(delta.modified)
110
delta = compare_trees(b_a.basis_tree(), b_a.working_tree())
111
self.assertEquals(len(delta.added), 1)
112
self.assertEquals(delta.added[0][0], 'dir')
113
self.failIf(delta.modified)
115
delta = compare_trees(b_b.basis_tree(), b_b.working_tree())
116
self.assertEquals(len(delta.added), 1)
117
self.assertEquals(delta.added[0][0], 'dir')
118
self.failIf(delta.modified)
121
def test_branch_add_in_unversioned(self):
122
"""Try to add a file in an unversioned directory.
124
"bzr add" adds the parent as necessary, but simple branch add
127
from bzrlib.branch import Branch
128
from bzrlib.errors import NotVersionedError
130
b = Branch.initialize('.')
132
self.build_tree(['foo/',
135
self.assertRaises(NotVersionedError,
141
def test_add_in_unversioned(self):
142
"""Try to add a file in an unversioned directory.
144
"bzr add" should add the parent(s) as necessary.
146
from bzrlib.branch import Branch
147
eq = self.assertEqual
149
b = Branch.initialize('.')
151
self.build_tree(['inertiatic/', 'inertiatic/esp'])
152
eq(list(b.unknowns()), ['inertiatic'])
153
self.run_bzr('add', 'inertiatic/esp')
154
eq(list(b.unknowns()), [])
156
# Multiple unversioned parents
157
self.build_tree(['veil/', 'veil/cerpin/', 'veil/cerpin/taxt'])
158
eq(list(b.unknowns()), ['veil'])
159
self.run_bzr('add', 'veil/cerpin/taxt')
160
eq(list(b.unknowns()), [])
162
# Check whacky paths work
163
self.build_tree(['cicatriz/', 'cicatriz/esp'])
164
eq(list(b.unknowns()), ['cicatriz'])
165
self.run_bzr('add', 'inertiatic/../cicatriz/esp')
166
eq(list(b.unknowns()), [])
168
def test_add_in_versioned(self):
169
"""Try to add a file in a versioned directory.
171
"bzr add" should do this happily.
173
from bzrlib.branch import Branch
174
eq = self.assertEqual
176
b = Branch.initialize('.')
178
self.build_tree(['inertiatic/', 'inertiatic/esp'])
179
eq(list(b.unknowns()), ['inertiatic'])
180
self.run_bzr('add', '--no-recurse', 'inertiatic')
181
eq(list(b.unknowns()), ['inertiatic'+os.sep+'esp'])
182
self.run_bzr('add', 'inertiatic/esp')
183
eq(list(b.unknowns()), [])
185
def test_subdir_add(self):
186
"""Add in subdirectory should add only things from there down"""
188
from bzrlib.branch import Branch
190
eq = self.assertEqual
194
b = Branch.initialize('.')
196
self.build_tree(['src/', 'README'])
198
eq(sorted(b.unknowns()),
201
self.run_bzr('add', 'src')
203
self.build_tree(['src/foo.c'])
208
eq(sorted(b.unknowns()),
210
eq(len(t.read_working_inventory()), 3)
214
eq(list(b.unknowns()), [])
113
218
def check_branch(self):
114
219
"""After all the above changes, run the check and upgrade commands.
116
221
The upgrade should be a no-op."""
117
b = Branch.open(u'.')
118
mutter('branch has %d revisions', b.revno())
120
mutter('check branch...')
223
debug('branch has %d revisions', b.revno())
225
debug('check branch...')
121
226
from bzrlib.check import check
125
231
class SubdirCommit(TestCaseInTempDir):
127
233
def test_subdir_commit(self):
130
236
eq = self.assertEqual
132
238
self.build_tree(['a/', 'b/'])
135
b = Branch.open(u'.')
137
243
for fn in ('a/one', 'b/two', 'top'):
138
244
file(fn, 'w').write('old contents')
141
run_bzr(['commit', '-m', 'first revision'])
247
run_bzr('commit', '-m', 'first revision')
143
249
for fn in ('a/one', 'b/two', 'top'):
144
250
file(fn, 'w').write('new contents')
146
mutter('start selective subdir commit')
147
run_bzr(['commit', 'a', '-m', 'commit a only'])
149
old = b.repository.revision_tree(b.get_rev_id(1))
150
new = b.repository.revision_tree(b.get_rev_id(2))
252
debug('start selective subdir commit')
253
run_bzr('commit', 'a', '-m', 'commit a only')
255
old = b.revision_tree(b.get_rev_id(1))
256
new = b.revision_tree(b.get_rev_id(2))
153
258
eq(new.get_file_by_path('b/two').read(), 'old contents')
154
259
eq(new.get_file_by_path('top').read(), 'old contents')
155
260
eq(new.get_file_by_path('a/one').read(), 'new contents')
159
263
# commit from here should do nothing
160
run_bzr(['commit', '.', '-m', 'commit subdir only', '--unchanged'])
161
v3 = b.repository.revision_tree(b.get_rev_id(3))
264
run_bzr('commit', '.', '-m', 'commit subdir only', '--unchanged')
265
v3 = b.revision_tree(b.get_rev_id(3))
163
266
eq(v3.get_file_by_path('b/two').read(), 'old contents')
164
267
eq(v3.get_file_by_path('top').read(), 'old contents')
165
268
eq(v3.get_file_by_path('a/one').read(), 'new contents')
168
270
# commit in subdirectory commits whole tree
169
run_bzr(['commit', '-m', 'commit whole tree from subdir'])
170
v4 = b.repository.revision_tree(b.get_rev_id(4))
172
eq(v4.get_file_by_path('b/two').read(), 'new contents')
271
run_bzr('commit', '-m', 'commit whole tree from subdir')
272
v4 = b.revision_tree(b.get_rev_id(4))
273
eq(v4.get_file_by_path('b/two').read(), 'new contents')
173
274
eq(v4.get_file_by_path('top').read(), 'new contents')
176
276
# TODO: factor out some kind of assert_tree_state() method
179
279
if __name__ == '__main__':