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 BzrTestBase, TestCaseInTempDir
25
26
from bzrlib.branch import Branch
27
from bzrlib.trace import mutter
26
28
from bzrlib.osutils import pathjoin
27
from bzrlib.tests import TestCaseInTempDir, TestCaseWithTransport
28
from bzrlib.trace import mutter
29
from bzrlib.workingtree import WorkingTree
32
31
class TestVersioning(TestCaseInTempDir):
35
34
"""Basic 'bzr mkdir' operation"""
37
36
self.run_bzr('init')
38
self.run_bzr('mkdir foo')
37
self.run_bzr('mkdir', 'foo')
39
38
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())
40
self.run_bzr('mkdir', 'foo', retcode=3)
42
from bzrlib.diff import compare_trees
43
from bzrlib.branch import Branch
46
delta = compare_trees(b.basis_tree(), b.working_tree())
47
48
self.log('delta.added = %r' % delta.added)
54
55
"""'bzr mkdir' operation in subdirectory"""
56
57
self.run_bzr('init')
57
self.run_bzr('mkdir dir')
58
self.run_bzr('mkdir', 'dir')
58
59
self.assert_(os.path.isdir('dir'))
61
62
self.log('Run mkdir in subdir')
62
self.run_bzr('mkdir subdir')
63
self.run_bzr('mkdir', 'subdir')
63
64
self.assert_(os.path.isdir('subdir'))
66
wt = WorkingTree.open('.')
68
delta = wt.changes_from(wt.basis_tree())
67
from bzrlib.diff import compare_trees
68
from bzrlib.branch import Branch
71
delta = compare_trees(b.basis_tree(), b.working_tree())
70
73
self.log('delta.added = %r' % delta.added)
86
89
self.run_bzr('init')
89
self.run_bzr('mkdir dir a/dir a/b/dir')
92
self.run_bzr('mkdir', 'dir', 'a/dir', 'a/b/dir')
90
93
self.failUnless(os.path.isdir('dir'))
91
94
self.failUnless(os.path.isdir('a/dir'))
92
95
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)
97
from bzrlib.diff import compare_trees
99
b_a = Branch.open('a')
100
b_b = Branch.open('a/b')
102
delta = compare_trees(b.basis_tree(), b.working_tree())
103
self.assertEquals(len(delta.added), 1)
104
self.assertEquals(delta.added[0][0], 'dir')
105
self.failIf(delta.modified)
107
delta = compare_trees(b_a.basis_tree(), b_a.working_tree())
108
self.assertEquals(len(delta.added), 1)
109
self.assertEquals(delta.added[0][0], 'dir')
110
self.failIf(delta.modified)
112
delta = compare_trees(b_b.basis_tree(), b_b.working_tree())
113
self.assertEquals(len(delta.added), 1)
114
self.assertEquals(delta.added[0][0], 'dir')
115
self.failIf(delta.modified)
117
def test_working_tree_add_in_unversioned(self):
118
"""Try to add a file in an unversioned directory.
120
"bzr add" adds the parent as necessary, but simple working tree add
123
from bzrlib.branch import Branch
124
from bzrlib.errors import NotVersionedError
125
from bzrlib.workingtree import WorkingTree
127
b = Branch.initialize(u'.')
129
self.build_tree(['foo/',
132
self.assertRaises(NotVersionedError,
133
WorkingTree(b.base, b).add,
113
138
def check_branch(self):
114
139
"""After all the above changes, run the check and upgrade commands.
116
141
The upgrade should be a no-op."""
117
142
b = Branch.open(u'.')
118
143
mutter('branch has %d revisions', b.revno())
120
145
mutter('check branch...')
121
146
from bzrlib.check import check
125
class SubdirCommit(TestCaseWithTransport):
150
class SubdirCommit(TestCaseInTempDir):
127
152
def test_subdir_commit(self):
128
"""Test committing a subdirectory, and committing a directory."""
129
tree = self.make_branch_and_tree('.')
153
"""Test committing a subdirectory, and committing within a directory."""
154
run_bzr = self.run_bzr
155
eq = self.assertEqual
131
157
self.build_tree(['a/', 'b/'])
132
def set_contents(contents):
133
self.build_tree_contents([
138
set_contents('old contents')
139
tree.smart_add(['.'])
140
tree.commit('first revision')
141
set_contents('new contents')
160
b = Branch.open(u'.')
162
for fn in ('a/one', 'b/two', 'top'):
163
file(fn, 'w').write('old contents')
166
run_bzr('commit', '-m', 'first revision')
168
for fn in ('a/one', 'b/two', 'top'):
169
file(fn, 'w').write('new contents')
143
171
mutter('start selective subdir commit')
144
self.run_bzr(['commit', 'a', '-m', 'commit a only'])
146
new = b.repository.revision_tree(b.get_rev_id(2))
149
self.assertEqual(new.get_file_by_path('b/two').read(), 'old contents')
150
self.assertEqual(new.get_file_by_path('top').read(), 'old contents')
151
self.assertEqual(new.get_file_by_path('a/one').read(), 'new contents')
172
run_bzr('commit', 'a', '-m', 'commit a only')
174
old = b.revision_tree(b.get_rev_id(1))
175
new = b.revision_tree(b.get_rev_id(2))
177
eq(new.get_file_by_path('b/two').read(), 'old contents')
178
eq(new.get_file_by_path('top').read(), 'old contents')
179
eq(new.get_file_by_path('a/one').read(), 'new contents')
155
182
# commit from here should do nothing
156
self.run_bzr(['commit', '.', '-m', 'commit subdir only', '--unchanged'])
157
v3 = b.repository.revision_tree(b.get_rev_id(3))
159
self.assertEqual(v3.get_file_by_path('b/two').read(), 'old contents')
160
self.assertEqual(v3.get_file_by_path('top').read(), 'old contents')
161
self.assertEqual(v3.get_file_by_path('a/one').read(), 'new contents')
183
run_bzr('commit', '.', '-m', 'commit subdir only', '--unchanged')
184
v3 = b.revision_tree(b.get_rev_id(3))
185
eq(v3.get_file_by_path('b/two').read(), 'old contents')
186
eq(v3.get_file_by_path('top').read(), 'old contents')
187
eq(v3.get_file_by_path('a/one').read(), 'new contents')
164
189
# commit in subdirectory commits whole tree
165
self.run_bzr(['commit', '-m', 'commit whole tree from subdir'])
166
v4 = b.repository.revision_tree(b.get_rev_id(4))
168
self.assertEqual(v4.get_file_by_path('b/two').read(), 'new contents')
169
self.assertEqual(v4.get_file_by_path('top').read(), 'new contents')
190
run_bzr('commit', '-m', 'commit whole tree from subdir')
191
v4 = b.revision_tree(b.get_rev_id(4))
192
eq(v4.get_file_by_path('b/two').read(), 'new contents')
193
eq(v4.get_file_by_path('top').read(), 'new contents')
172
195
# TODO: factor out some kind of assert_tree_state() method
198
if __name__ == '__main__':