1
# Copyright (C) 2005, 2006 Canonical Ltd
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
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
6
from bzrlib.selftest import InTempDir, TestBase
7
from bzrlib.branch import ScratchBranch, Branch
8
from bzrlib.errors import NotBranchError, NotVersionedError
11
class Unknowns(InTempDir):
13
b = Branch('.', init=True)
15
self.build_tree(['hello.txt',
18
self.assertEquals(list(b.unknowns()),
23
class NoChanges(InTempDir):
25
from bzrlib.errors import PointlessCommit
27
b = Branch('.', init=True)
29
self.build_tree(['hello.txt'])
31
self.assertRaises(PointlessCommit,
33
'commit without adding',
34
allow_pointless=False)
36
b.commit('commit pointless tree',
41
b.commit('commit first added file',
42
allow_pointless=False)
44
self.assertRaises(PointlessCommit,
46
'commit after adding file',
47
allow_pointless=False)
49
b.commit('commit pointless revision with one file',
52
b.add_pending_merge('mbp@892739123-2005-123123')
53
b.commit('commit new merge with no text changes',
54
allow_pointless=False)
58
class ValidateRevisionId(TestBase):
60
from bzrlib.revision import validate_revision_id
61
validate_revision_id('mbp@sourcefrog.net-20050311061123-96a255005c7c9dbe')
63
self.assertRaises(ValueError,
68
self.assertRaises(ValueError,
70
'mbp@sourcefrog.net-20050311061123-96a255005c7c9dbe\n')
73
self.assertRaises(ValueError,
75
' mbp@sourcefrog.net-20050311061123-96a255005c7c9dbe')
77
self.assertRaises(ValueError,
79
'Martin Pool <mbp@sourcefrog.net>-20050311061123-96a255005c7c9dbe')
83
class PendingMerges(InTempDir):
84
"""Tracking pending-merged revisions."""
86
b = Branch('.', init=True)
88
self.assertEquals(b.pending_merges(), [])
90
b.add_pending_merge('foo@azkhazan-123123-abcabc')
92
self.assertEquals(b.pending_merges(), ['foo@azkhazan-123123-abcabc'])
94
b.add_pending_merge('foo@azkhazan-123123-abcabc')
96
self.assertEquals(b.pending_merges(), ['foo@azkhazan-123123-abcabc'])
98
b.add_pending_merge('wibble@fofof--20050401--1928390812')
99
self.assertEquals(b.pending_merges(),
100
['foo@azkhazan-123123-abcabc',
101
'wibble@fofof--20050401--1928390812'])
103
b.commit("commit from base with two merges")
105
rev = b.get_revision(b.revision_history()[0])
106
self.assertEquals(len(rev.parents), 2)
107
self.assertEquals(rev.parents[0].revision_id,
108
'foo@azkhazan-123123-abcabc')
109
self.assertEquals(rev.parents[1].revision_id,
110
'wibble@fofof--20050401--1928390812')
112
# list should be cleared when we do a commit
113
self.assertEquals(b.pending_merges(), [])
118
class Revert(InTempDir):
119
"""Test selected-file revert"""
121
b = Branch('.', init=True)
123
self.build_tree(['hello.txt'])
124
file('hello.txt', 'w').write('initial hello')
126
self.assertRaises(NotVersionedError,
127
b.revert, ['hello.txt'])
130
b.commit('create initial hello.txt')
132
self.check_file_contents('hello.txt', 'initial hello')
133
file('hello.txt', 'w').write('new hello')
134
self.check_file_contents('hello.txt', 'new hello')
136
# revert file modified since last revision
137
b.revert(['hello.txt'])
138
self.check_file_contents('hello.txt', 'initial hello')
139
self.check_file_contents('hello.txt~', 'new hello')
141
# reverting again clobbers the backup
142
b.revert(['hello.txt'])
143
self.check_file_contents('hello.txt', 'initial hello')
144
self.check_file_contents('hello.txt~', 'initial hello')
148
class RenameDirs(InTempDir):
149
"""Test renaming directories and the files within them."""
151
b = Branch('.', init=True)
152
self.build_tree(['dir/', 'dir/sub/', 'dir/sub/file'])
153
b.add(['dir', 'dir/sub', 'dir/sub/file'])
155
b.commit('create initial state')
157
# TODO: lift out to a test helper that checks the shape of
160
revid = b.revision_history()[0]
161
self.log('first revision_id is {%s}' % revid)
163
inv = b.get_revision_inventory(revid)
164
self.log('contents of inventory: %r' % inv.entries())
166
self.check_inventory_shape(inv,
167
['dir', 'dir/sub', 'dir/sub/file'])
169
b.rename_one('dir', 'newdir')
171
self.check_inventory_shape(b.inventory,
172
['newdir', 'newdir/sub', 'newdir/sub/file'])
174
b.rename_one('newdir/sub', 'newdir/newsub')
175
self.check_inventory_shape(b.inventory,
176
['newdir', 'newdir/newsub',
177
'newdir/newsub/file'])
182
class BranchPathTestCase(TestBase):
183
"""test for branch path lookups
185
Branch.relpath and bzrlib.branch._relpath do a simple but subtle
186
job: given a path (either relative to cwd or absolute), work out
187
if it is inside a branch and return the path relative to the base.
191
from bzrlib.branch import _relpath
192
import tempfile, shutil
23
from bzrlib.tests import TestCaseWithTransport, TestCase
24
from bzrlib.branch import Branch
25
from bzrlib.errors import PathNotChild
26
from bzrlib.osutils import relpath, pathjoin, abspath, realpath
29
class MoreTests(TestCaseWithTransport):
31
def test_relpath(self):
32
"""test for branch path lookups
34
bzrlib.osutils._relpath do a simple but subtle
35
job: given a path (either relative to cwd or absolute), work out
36
if it is inside a branch and return the path relative to the base.
194
40
savedir = os.getcwdu()
195
dtmp = tempfile.mkdtemp()
41
dtmp = osutils.mkdtemp()
196
42
# On Mac OSX, /tmp actually expands to /private/tmp
197
dtmp = os.path.realpath(dtmp)
200
return _relpath(dtmp, p)
46
return relpath(dtmp, p)
203
49
# check paths inside dtmp while standing outside it
204
self.assertEqual(rp(os.path.join(dtmp, 'foo')), 'foo')
50
self.assertEqual(rp(pathjoin(dtmp, 'foo')), 'foo')
207
53
self.assertEqual(rp(dtmp), '')
209
self.assertRaises(NotBranchError,
55
self.assertRaises(PathNotChild,
213
59
# now some near-miss operations -- note that
214
60
# os.path.commonprefix gets these wrong!
215
self.assertRaises(NotBranchError,
61
self.assertRaises(PathNotChild,
217
63
dtmp.rstrip('\\/') + '2')
219
self.assertRaises(NotBranchError,
65
self.assertRaises(PathNotChild,
221
67
dtmp.rstrip('\\/') + '2/foo')