26
26
it's normally invoked.
29
# this code was previously in testbzr
31
from unittest import TestCase
32
from bzrlib.selftest import TestBase, InTempDir
34
class TestVersion(TestBase):
31
from bzrlib.selftest import InTempDir, BzrTestBase
35
class ExternalBase(InTempDir):
36
def runbzr(self, args, retcode=0,backtick=False):
39
from subprocess import call
40
except ImportError, e:
44
if isinstance(args, basestring):
48
return self.backtick(['python', self.BZRPATH,] + args,
51
return self.runcmd(['python', self.BZRPATH,] + args,
56
class MvCommand(BzrTestBase):
58
"""Test two modes of operation for mv"""
59
b = Branch('.', init=True)
60
self.build_tree(['a', 'c', 'subdir/'])
61
self.run_bzr('mv', 'a', 'b')
62
self.run_bzr('mv', 'b', 'subdir')
63
self.run_bzr('mv', 'subdir/b', 'a')
64
self.run_bzr('mv', 'a', 'b', 'subdir')
65
self.run_bzr('mv', 'subdir/a', 'subdir/newa')
69
class TestVersion(BzrTestBase):
70
"""Check output from version command and master option is reasonable"""
36
72
# output is intentionally passed through to stdout so that we
37
73
# can see the version being tested
38
self.runcmd(['bzr', 'version'])
42
class HelpCommands(TestBase):
74
from cStringIO import StringIO
77
sys.stdout = tmp_out = StringIO()
79
self.run_bzr('version')
83
output = tmp_out.getvalue()
84
self.log('bzr version output:')
87
self.assert_(output.startswith('bzr (bazaar-ng) '))
88
self.assertNotEqual(output.index('Canonical'), -1)
90
# make sure --version is consistent
92
sys.stdout = tmp_out = StringIO()
94
self.run_bzr('--version')
98
self.log('bzr --version output:')
99
self.log(tmp_out.getvalue())
101
self.assertEquals(output, tmp_out.getvalue())
107
class HelpCommands(ExternalBase):
43
108
def runTest(self):
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):
109
self.runbzr('--help')
111
self.runbzr('help commands')
112
self.runbzr('help help')
113
self.runbzr('commit -h')
116
class InitBranch(ExternalBase):
52
117
def runTest(self):
54
self.runcmd(['bzr', 'init'])
58
class UserIdentity(InTempDir):
119
self.runbzr(['init'])
122
class UserIdentity(ExternalBase):
59
123
def runTest(self):
60
124
# 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):
125
self.runbzr("whoami")
126
self.runbzr("whoami --email")
128
self.assertEquals(self.runbzr("whoami --email",
129
backtick=True).count('@'), 1)
131
class UserIdentityBranch(ExternalBase):
133
# tests branch specific user identity
135
f = file('.bzr/email', 'wt')
136
f.write('Branch Identity <branch@identi.ty>')
138
whoami = self.runbzr("whoami",backtick=True)
139
whoami_email = self.runbzr("whoami --email",backtick=True)
140
self.assertTrue(whoami.startswith('Branch Identity <branch@identi.ty>'))
141
self.assertTrue(whoami_email.startswith('branch@identi.ty'))
144
class InvalidCommands(ExternalBase):
146
self.runbzr("pants", retcode=1)
147
self.runbzr("--pants off", retcode=1)
148
self.runbzr("diff --message foo", retcode=1)
152
class EmptyCommit(ExternalBase):
155
self.build_tree(['hello.txt'])
156
self.runbzr("commit -m empty", retcode=1)
157
self.runbzr("add hello.txt")
158
self.runbzr("commit -m added")
162
class IgnorePatterns(ExternalBase):
164
from bzrlib.branch import Branch
166
b = Branch('.', init=True)
167
self.assertEquals(list(b.unknowns()), [])
169
file('foo.tmp', 'wt').write('tmp files are ignored')
170
self.assertEquals(list(b.unknowns()), [])
171
assert self.backtick('bzr unknowns') == ''
173
file('foo.c', 'wt').write('int main() {}')
174
self.assertEquals(list(b.unknowns()), ['foo.c'])
175
assert self.backtick('bzr unknowns') == 'foo.c\n'
177
self.runbzr(['add', 'foo.c'])
178
assert self.backtick('bzr unknowns') == ''
180
# 'ignore' works when creating the .bzignore file
181
file('foo.blah', 'wt').write('blah')
182
self.assertEquals(list(b.unknowns()), ['foo.blah'])
183
self.runbzr('ignore *.blah')
184
self.assertEquals(list(b.unknowns()), [])
185
assert file('.bzrignore', 'rb').read() == '*.blah\n'
187
# 'ignore' works when then .bzrignore file already exists
188
file('garh', 'wt').write('garh')
189
self.assertEquals(list(b.unknowns()), ['garh'])
190
assert self.backtick('bzr unknowns') == 'garh\n'
191
self.runbzr('ignore garh')
192
self.assertEquals(list(b.unknowns()), [])
193
assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
198
class OldTests(ExternalBase):
76
199
# old tests moved from ./testbzr
77
200
def runTest(self):
78
201
from os import chdir, mkdir
79
202
from os.path import exists
83
206
backtick = self.backtick
84
207
progress = self.log
86
209
progress("basic branch creation")
87
runcmd(['mkdir', 'branch1'])
91
214
self.assertEquals(backtick('bzr root').rstrip(),
92
215
os.path.join(self.test_dir, 'branch1'))
135
258
progress("command help")
136
runcmd("bzr help st")
138
runcmd("bzr help commands")
139
runcmd("bzr help slartibartfast", 1)
261
runbzr("help commands")
262
runbzr("help slartibartfast", 1)
141
264
out = backtick("bzr help ci")
142
265
out.index('aliases: ')
144
267
progress("can't rename unversioned file")
145
runcmd("bzr rename test.txt new-test.txt", 1)
268
runbzr("rename test.txt new-test.txt", 1)
147
270
progress("adding a file")
149
runcmd("bzr add test.txt")
272
runbzr("add test.txt")
150
273
assert backtick("bzr unknowns") == ''
151
274
assert backtick("bzr status --all") == ("added:\n"
154
277
progress("rename newly-added file")
155
runcmd("bzr rename test.txt hello.txt")
278
runbzr("rename test.txt hello.txt")
156
279
assert os.path.exists("hello.txt")
157
280
assert not os.path.exists("test.txt")
159
282
assert backtick("bzr revno") == '0\n'
161
284
progress("add first revision")
162
runcmd(["bzr", "commit", "-m", 'add first revision'])
285
runbzr(['commit', '-m', 'add first revision'])
164
287
progress("more complex renames")
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)
289
runbzr("rename hello.txt sub1", 1)
290
runbzr("rename hello.txt sub1/hello.txt", 1)
291
runbzr("move hello.txt sub1", 1)
170
runcmd("bzr add sub1")
171
runcmd("bzr rename sub1 sub2")
172
runcmd("bzr move hello.txt sub2")
294
runbzr("rename sub1 sub2")
295
runbzr("move hello.txt sub2")
173
296
assert backtick("bzr relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
175
298
assert exists("sub2")
177
300
assert not exists("sub1")
178
301
assert not exists("hello.txt")
180
runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
303
runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
183
runcmd('bzr add sub1')
184
runcmd('bzr move sub2/hello.txt sub1')
307
runbzr('move sub2/hello.txt sub1')
185
308
assert not exists('sub2/hello.txt')
186
309
assert exists('sub1/hello.txt')
187
runcmd('bzr move sub2 sub1')
310
runbzr('move sub2 sub1')
188
311
assert not exists('sub2')
189
312
assert exists('sub1/sub2')
191
runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
314
runbzr(['commit', '-m', 'rename nested subdirectories'])
193
316
chdir('sub1/sub2')
194
317
self.assertEquals(backtick('bzr root')[:-1],
195
318
os.path.join(self.test_dir, 'branch1'))
196
runcmd('bzr move ../hello.txt .')
319
runbzr('move ../hello.txt .')
197
320
assert exists('./hello.txt')
198
321
assert backtick('bzr relpath hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
199
322
assert backtick('bzr relpath ../../sub1/sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
200
runcmd(['bzr', 'commit', '-m', 'move to parent directory'])
323
runbzr(['commit', '-m', 'move to parent directory'])
202
325
assert backtick('bzr relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
204
runcmd('bzr move sub2/hello.txt .')
327
runbzr('move sub2/hello.txt .')
205
328
assert exists('hello.txt')
207
330
f = file('hello.txt', 'wt')
212
335
f.write('this is my new commit\n')
215
runcmd('bzr commit -F msg.tmp')
338
runbzr('commit -F msg.tmp')
217
340
assert backtick('bzr revno') == '5\n'
218
runcmd('bzr export -r 5 export-5.tmp')
219
runcmd('bzr export export.tmp')
341
runbzr('export -r 5 export-5.tmp')
342
runbzr('export export.tmp')
346
runbzr('log -v --forward')
347
runbzr('log -m', retcode=1)
348
log_out = backtick('bzr log -m commit')
349
assert "this is my new commit" in log_out
350
assert "rename nested" not in log_out
351
assert 'revision-id' not in log_out
352
assert 'revision-id' in backtick('bzr log --show-ids -m commit')
226
355
progress("file with spaces in name")
227
356
mkdir('sub directory')
228
357
file('sub directory/file with spaces ', 'wt').write('see how this works\n')
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')
348
class RevertCommand(InTempDir):
360
runbzr('commit -m add-spaces')
364
runbzr('log --forward')
373
class RevertCommand(ExternalBase):
349
374
def runTest(self):
350
self.runcmd('bzr init')
352
377
file('hello', 'wt').write('foo')
353
self.runcmd('bzr add hello')
354
self.runcmd('bzr commit -m setup hello')
378
self.runbzr('add hello')
379
self.runbzr('commit -m setup hello')
381
file('goodbye', 'wt').write('baz')
382
self.runbzr('add goodbye')
383
self.runbzr('commit -m setup goodbye')
356
385
file('hello', 'wt').write('bar')
357
self.runcmd('bzr revert hello')
386
file('goodbye', 'wt').write('qux')
387
self.runbzr('revert hello')
358
388
self.check_file_contents('hello', 'foo')
364
# lists all tests from this module in the best order to run them. we
365
# do it this way rather than just discovering them all because it
366
# allows us to test more basic functions first where failures will be
367
# easiest to understand.
370
from unittest import TestSuite
372
s.addTests([TestVersion(),
389
self.check_file_contents('goodbye', 'qux')
390
self.runbzr('revert')
391
self.check_file_contents('goodbye', 'baz')