26
26
it's normally invoked.
30
from bzrlib.selftest import InTempDir, BzrTestBase
33
class ExternalBase(InTempDir):
35
def runbzr(self, args, retcode=0,backtick=False):
38
from subprocess import call
39
except ImportError, e:
43
if isinstance(args, basestring):
47
return self.backtick(['python', self.BZRPATH,] + args,
50
return self.runcmd(['python', self.BZRPATH,] + args,
53
class TestCommands(ExternalBase):
55
def test_help_commands(self):
58
self.runbzr('help commands')
59
self.runbzr('help help')
60
self.runbzr('commit -h')
62
def test_init_branch(self):
66
def test_whoami(self):
67
# this should always identify something, if only "john@localhost"
69
self.runbzr("whoami --email")
71
self.assertEquals(self.runbzr("whoami --email",
72
backtick=True).count('@'), 1)
74
def test_whoami_branch(self):
75
"""branch specific user identity works."""
77
f = file('.bzr/email', 'wt')
78
f.write('Branch Identity <branch@identi.ty>')
80
whoami = self.runbzr("whoami",backtick=True)
81
whoami_email = self.runbzr("whoami --email",backtick=True)
82
self.assertTrue(whoami.startswith('Branch Identity <branch@identi.ty>'))
83
self.assertTrue(whoami_email.startswith('branch@identi.ty'))
85
def test_invalid_commands(self):
86
self.runbzr("pants", retcode=1)
87
self.runbzr("--pants off", retcode=1)
88
self.runbzr("diff --message foo", retcode=1)
90
def test_empty_commit(self):
92
self.build_tree(['hello.txt'])
93
self.runbzr("commit -m empty", retcode=1)
94
self.runbzr("add hello.txt")
95
self.runbzr("commit -m added")
97
def test_ignore_patterns(self):
98
from bzrlib.branch import Branch
100
b = Branch('.', init=True)
101
self.assertEquals(list(b.unknowns()), [])
103
file('foo.tmp', 'wt').write('tmp files are ignored')
104
self.assertEquals(list(b.unknowns()), [])
105
assert self.backtick('bzr unknowns') == ''
107
file('foo.c', 'wt').write('int main() {}')
108
self.assertEquals(list(b.unknowns()), ['foo.c'])
109
assert self.backtick('bzr unknowns') == 'foo.c\n'
111
self.runbzr(['add', 'foo.c'])
112
assert self.backtick('bzr unknowns') == ''
114
# 'ignore' works when creating the .bzignore file
115
file('foo.blah', 'wt').write('blah')
116
self.assertEquals(list(b.unknowns()), ['foo.blah'])
117
self.runbzr('ignore *.blah')
118
self.assertEquals(list(b.unknowns()), [])
119
assert file('.bzrignore', 'rb').read() == '*.blah\n'
121
# 'ignore' works when then .bzrignore file already exists
122
file('garh', 'wt').write('garh')
123
self.assertEquals(list(b.unknowns()), ['garh'])
124
assert self.backtick('bzr unknowns') == 'garh\n'
125
self.runbzr('ignore garh')
126
self.assertEquals(list(b.unknowns()), [])
127
assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
129
def test_revert(self):
134
file('hello', 'wt').write('foo')
135
self.runbzr('add hello')
136
self.runbzr('commit -m setup hello')
138
file('goodbye', 'wt').write('baz')
139
self.runbzr('add goodbye')
140
self.runbzr('commit -m setup goodbye')
142
file('hello', 'wt').write('bar')
143
file('goodbye', 'wt').write('qux')
144
self.runbzr('revert hello')
145
self.check_file_contents('hello', 'foo')
146
self.check_file_contents('goodbye', 'qux')
147
self.runbzr('revert')
148
self.check_file_contents('goodbye', 'baz')
150
os.mkdir('revertdir')
151
self.runbzr('add revertdir')
152
self.runbzr('commit -m f')
153
os.rmdir('revertdir')
154
self.runbzr('revert')
157
def skipped_test_mv_modes(self):
158
"""Test two modes of operation for mv"""
159
from bzrlib.branch import Branch
160
b = Branch('.', init=True)
161
self.build_tree(['a', 'c', 'subdir/'])
162
self.run_bzr('mv', 'a', 'b')
163
self.run_bzr('mv', 'b', 'subdir')
164
self.run_bzr('mv', 'subdir/b', 'a')
165
self.run_bzr('mv', 'a', 'b', 'subdir')
166
self.run_bzr('mv', 'subdir/a', 'subdir/newa')
168
def test_main_version(self):
169
"""Check output from version command and master option is reasonable"""
29
# this code was previously in testbzr
31
from unittest import TestCase
32
from bzrlib.selftest import TestBase, InTempDir
34
class TestVersion(TestBase):
170
36
# output is intentionally passed through to stdout so that we
171
37
# can see the version being tested
172
output = self.runbzr('version', backtick=1)
173
self.log('bzr version output:')
175
self.assert_(output.startswith('bzr (bazaar-ng) '))
176
self.assertNotEqual(output.index('Canonical'), -1)
177
# make sure --version is consistent
178
tmp_output = self.runbzr('--version', backtick=1)
179
self.log('bzr --version output:')
181
self.assertEquals(output, tmp_output)
183
class OldTests(ExternalBase):
38
self.runcmd(['bzr', 'version'])
42
class HelpCommands(TestBase):
44
self.runcmd('bzr --help')
45
self.runcmd('bzr help')
46
self.runcmd('bzr help commands')
47
self.runcmd('bzr help help')
48
self.runcmd('bzr commit -h')
51
class InitBranch(InTempDir):
54
self.runcmd(['bzr', 'init'])
58
class UserIdentity(InTempDir):
60
# this should always identify something, if only "john@localhost"
61
self.runcmd("bzr whoami")
62
self.runcmd("bzr whoami --email")
63
self.assertEquals(self.backtick("bzr whoami --email").count('@'),
67
class InvalidCommands(InTempDir):
69
self.runcmd("bzr pants", retcode=1)
70
self.runcmd("bzr --pants off", retcode=1)
71
self.runcmd("bzr diff --message foo", retcode=1)
75
class OldTests(InTempDir):
184
76
# old tests moved from ./testbzr
186
78
from os import chdir, mkdir
187
79
from os.path import exists
191
83
backtick = self.backtick
192
84
progress = self.log
194
86
progress("basic branch creation")
87
runcmd(['mkdir', 'branch1'])
199
91
self.assertEquals(backtick('bzr root').rstrip(),
200
92
os.path.join(self.test_dir, 'branch1'))
243
135
progress("command help")
246
runbzr("help commands")
247
runbzr("help slartibartfast", 1)
136
runcmd("bzr help st")
138
runcmd("bzr help commands")
139
runcmd("bzr help slartibartfast", 1)
249
141
out = backtick("bzr help ci")
250
142
out.index('aliases: ')
252
144
progress("can't rename unversioned file")
253
runbzr("rename test.txt new-test.txt", 1)
145
runcmd("bzr rename test.txt new-test.txt", 1)
255
147
progress("adding a file")
257
runbzr("add test.txt")
149
runcmd("bzr add test.txt")
258
150
assert backtick("bzr unknowns") == ''
259
151
assert backtick("bzr status --all") == ("added:\n"
262
154
progress("rename newly-added file")
263
runbzr("rename test.txt hello.txt")
155
runcmd("bzr rename test.txt hello.txt")
264
156
assert os.path.exists("hello.txt")
265
157
assert not os.path.exists("test.txt")
267
159
assert backtick("bzr revno") == '0\n'
269
161
progress("add first revision")
270
runbzr(['commit', '-m', 'add first revision'])
162
runcmd(["bzr", "commit", "-m", 'add first revision'])
272
164
progress("more complex renames")
274
runbzr("rename hello.txt sub1", 1)
275
runbzr("rename hello.txt sub1/hello.txt", 1)
276
runbzr("move hello.txt sub1", 1)
166
runcmd("bzr rename hello.txt sub1", 1)
167
runcmd("bzr rename hello.txt sub1/hello.txt", 1)
168
runcmd("bzr move hello.txt sub1", 1)
279
runbzr("rename sub1 sub2")
280
runbzr("move hello.txt sub2")
170
runcmd("bzr add sub1")
171
runcmd("bzr rename sub1 sub2")
172
runcmd("bzr move hello.txt sub2")
281
173
assert backtick("bzr relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
283
175
assert exists("sub2")
285
177
assert not exists("sub1")
286
178
assert not exists("hello.txt")
288
runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
180
runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
292
runbzr('move sub2/hello.txt sub1')
183
runcmd('bzr add sub1')
184
runcmd('bzr move sub2/hello.txt sub1')
293
185
assert not exists('sub2/hello.txt')
294
186
assert exists('sub1/hello.txt')
295
runbzr('move sub2 sub1')
187
runcmd('bzr move sub2 sub1')
296
188
assert not exists('sub2')
297
189
assert exists('sub1/sub2')
299
runbzr(['commit', '-m', 'rename nested subdirectories'])
191
runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
301
193
chdir('sub1/sub2')
302
194
self.assertEquals(backtick('bzr root')[:-1],
303
195
os.path.join(self.test_dir, 'branch1'))
304
runbzr('move ../hello.txt .')
196
runcmd('bzr move ../hello.txt .')
305
197
assert exists('./hello.txt')
306
198
assert backtick('bzr relpath hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
307
199
assert backtick('bzr relpath ../../sub1/sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
308
runbzr(['commit', '-m', 'move to parent directory'])
200
runcmd(['bzr', 'commit', '-m', 'move to parent directory'])
310
202
assert backtick('bzr relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
312
runbzr('move sub2/hello.txt .')
204
runcmd('bzr move sub2/hello.txt .')
313
205
assert exists('hello.txt')
315
207
f = file('hello.txt', 'wt')
320
212
f.write('this is my new commit\n')
323
runbzr('commit -F msg.tmp')
215
runcmd('bzr commit -F msg.tmp')
325
217
assert backtick('bzr revno') == '5\n'
326
runbzr('export -r 5 export-5.tmp')
327
runbzr('export export.tmp')
331
runbzr('log -v --forward')
332
runbzr('log -m', retcode=1)
333
log_out = backtick('bzr log -m commit')
334
assert "this is my new commit" in log_out
335
assert "rename nested" not in log_out
336
assert 'revision-id' not in log_out
337
assert 'revision-id' in backtick('bzr log --show-ids -m commit')
218
runcmd('bzr export -r 5 export-5.tmp')
219
runcmd('bzr export export.tmp')
340
226
progress("file with spaces in name")
341
227
mkdir('sub directory')
342
228
file('sub directory/file with spaces ', 'wt').write('see how this works\n')
345
runbzr('commit -m add-spaces')
349
runbzr('log --forward')
355
def example_branch(test):
358
file('hello', 'wt').write('foo')
359
test.runbzr('add hello')
360
test.runbzr('commit -m setup hello')
362
file('goodbye', 'wt').write('baz')
363
test.runbzr('add goodbye')
364
test.runbzr('commit -m setup goodbye')
367
class RevertCommand(ExternalBase):
370
file('hello', 'wt').write('bar')
371
file('goodbye', 'wt').write('qux')
372
self.runbzr('revert hello')
373
self.check_file_contents('hello', 'foo')
374
self.check_file_contents('goodbye', 'qux')
375
self.runbzr('revert')
376
self.check_file_contents('goodbye', 'baz')
379
class MergeCommand(ExternalBase):
381
from bzrlib.branch import Branch
387
self.runbzr('branch a b')
389
file('goodbye', 'wt').write('quux')
390
self.runbzr(['commit', '-m', "more u's are always good"])
393
file('hello', 'wt').write('quuux')
394
# We can't merge when there are in-tree changes
395
self.runbzr('merge ../b', retcode=1)
396
self.runbzr(['commit', '-m', "Like an epidemic of u's"])
397
self.runbzr('merge ../b')
398
self.check_file_contents('goodbye', 'quux')
399
# Merging a branch pulls its revision into the tree
402
a.get_revision_xml(b.last_patch())
403
print "Pending: %s" % a.pending_merges()
404
# assert a.pending_merges() == [b.last_patch()], "Assertion %s %s" \
405
# % (a.pending_merges(), b.last_patch())
231
runcmd('bzr commit -m add-spaces')
235
runcmd('bzr log --forward')
247
# Can't create a branch if it already exists
248
runcmd('bzr branch branch1', retcode=1)
249
# Can't create a branch if its parent doesn't exist
250
runcmd('bzr branch /unlikely/to/exist', retcode=1)
251
runcmd('bzr branch branch1 branch2')
255
runcmd('bzr pull', retcode=1)
256
runcmd('bzr pull ../branch2')
259
runcmd('bzr commit -m empty')
261
chdir('../../branch2')
263
runcmd('bzr commit -m empty')
265
runcmd('bzr commit -m empty')
266
runcmd('bzr pull', retcode=1)
269
progress('status after remove')
270
mkdir('status-after-remove')
271
# see mail from William Dodé, 2005-05-25
272
# $ bzr init; touch a; bzr add a; bzr commit -m "add a"
273
# * looking for changes...
278
# bzr: local variable 'kind' referenced before assignment
279
# at /vrac/python/bazaar-ng/bzrlib/diff.py:286 in compare_trees()
280
# see ~/.bzr.log for debug information
281
chdir('status-after-remove')
283
file('a', 'w').write('foo')
285
runcmd(['bzr', 'commit', '-m', 'add a'])
286
runcmd('bzr remove a')
291
progress('ignore patterns')
292
mkdir('ignorebranch')
293
chdir('ignorebranch')
295
assert backtick('bzr unknowns') == ''
297
file('foo.tmp', 'wt').write('tmp files are ignored')
298
assert backtick('bzr unknowns') == ''
300
file('foo.c', 'wt').write('int main() {}')
301
assert backtick('bzr unknowns') == 'foo.c\n'
302
runcmd('bzr add foo.c')
303
assert backtick('bzr unknowns') == ''
305
# 'ignore' works when creating the .bzignore file
306
file('foo.blah', 'wt').write('blah')
307
assert backtick('bzr unknowns') == 'foo.blah\n'
308
runcmd('bzr ignore *.blah')
309
assert backtick('bzr unknowns') == ''
310
assert file('.bzrignore', 'rb').read() == '*.blah\n'
312
# 'ignore' works when then .bzrignore file already exists
313
file('garh', 'wt').write('garh')
314
assert backtick('bzr unknowns') == 'garh\n'
315
runcmd('bzr ignore garh')
316
assert backtick('bzr unknowns') == ''
317
assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
324
progress("recursive and non-recursive add")
329
fp = os.path.join('foo', 'test.txt')
333
runcmd('bzr add --no-recurse foo')
334
runcmd('bzr file-id foo')
335
runcmd('bzr file-id ' + fp, 1) # not versioned yet
336
runcmd('bzr commit -m add-dir-only')
338
runcmd('bzr file-id ' + fp, 1) # still not versioned
340
runcmd('bzr add foo')
341
runcmd('bzr file-id ' + fp)
342
runcmd('bzr commit -m add-sub-file')
352
# lists all tests from this module in the best order to run them. we
353
# do it this way rather than just discovering them all because it
354
# allows us to test more basic functions first where failures will be
355
# easiest to understand.
358
from unittest import TestSuite
360
s.addTests([TestVersion(),