~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/blackbox.py

  • Committer: Martin Pool
  • Date: 2005-06-22 09:08:43 UTC
  • Revision ID: mbp@sourcefrog.net-20050622090843-78fe9c62da9ed167
- add john's changeset plugin

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
17
 
18
 
# Mr. Smoketoomuch: I'm sorry?
19
 
# Mr. Bounder: You'd better cut down a little then.
20
 
# Mr. Smoketoomuch: Oh, I see! Smoke too much so I'd better cut down a little
21
 
#                   then!
22
18
 
23
19
"""Black-box tests for bzr.
24
20
 
25
21
These check that it behaves properly when it's invoked through the regular
26
 
command-line interface. This doesn't actually run a new interpreter but 
27
 
rather starts again from the run_bzr function.
 
22
command-line interface.
 
23
 
 
24
This always reinvokes bzr through a new Python interpreter, which is a
 
25
bit inefficient but arguably tests in a way more representative of how
 
26
it's normally invoked.
28
27
"""
29
28
 
30
 
 
31
 
# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
32
 
# Note: Please don't add new tests here, it's too big and bulky.  Instead add
33
 
# them into small suites in bzrlib.tests.blackbox.test_FOO for the particular
34
 
# UI command/aspect that is being tested.
35
 
 
36
 
 
37
 
from cStringIO import StringIO
38
 
import os
39
 
import re
40
 
import sys
41
 
 
42
 
import bzrlib
43
 
from bzrlib.branch import Branch
44
 
import bzrlib.bzrdir as bzrdir
45
 
from bzrlib.errors import BzrCommandError
46
 
from bzrlib.osutils import (
47
 
    has_symlinks,
48
 
    pathjoin,
49
 
    rmtree,
50
 
    terminal_width,
51
 
    )
52
 
from bzrlib.tests.HTTPTestUtil import TestCaseWithWebserver
53
 
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
54
 
from bzrlib.tests.blackbox import ExternalBase
55
 
from bzrlib.workingtree import WorkingTree
56
 
 
57
 
 
58
 
class TestCommands(ExternalBase):
59
 
 
60
 
    def test_whoami(self):
61
 
        # this should always identify something, if only "john@localhost"
62
 
        self.runbzr("whoami")
63
 
        self.runbzr("whoami --email")
64
 
 
65
 
        self.assertEquals(self.runbzr("whoami --email",
66
 
                                      backtick=True).count('@'), 1)
67
 
        
68
 
    def test_whoami_branch(self):
69
 
        """branch specific user identity works."""
70
 
        self.runbzr('init')
71
 
        b = bzrlib.branch.Branch.open('.')
72
 
        b.control_files.put_utf8('email', 'Branch Identity <branch@identi.ty>')
73
 
        bzr_email = os.environ.get('BZREMAIL')
74
 
        if bzr_email is not None:
75
 
            del os.environ['BZREMAIL']
76
 
        whoami = self.runbzr("whoami",backtick=True)
77
 
        whoami_email = self.runbzr("whoami --email",backtick=True)
78
 
        self.assertTrue(whoami.startswith('Branch Identity <branch@identi.ty>'))
79
 
        self.assertTrue(whoami_email.startswith('branch@identi.ty'))
80
 
        # Verify that the environment variable overrides the value 
81
 
        # in the file
82
 
        os.environ['BZREMAIL'] = 'Different ID <other@environ.ment>'
83
 
        whoami = self.runbzr("whoami",backtick=True)
84
 
        whoami_email = self.runbzr("whoami --email",backtick=True)
85
 
        self.assertTrue(whoami.startswith('Different ID <other@environ.ment>'))
86
 
        self.assertTrue(whoami_email.startswith('other@environ.ment'))
87
 
        if bzr_email is not None:
88
 
            os.environ['BZREMAIL'] = bzr_email
89
 
 
90
 
    def test_nick_command(self):
91
 
        """bzr nick for viewing, setting nicknames"""
92
 
        os.mkdir('me.dev')
93
 
        os.chdir('me.dev')
94
 
        self.runbzr('init')
95
 
        nick = self.runbzr("nick",backtick=True)
96
 
        self.assertEqual(nick, 'me.dev\n')
97
 
        nick = self.runbzr("nick moo")
98
 
        nick = self.runbzr("nick",backtick=True)
99
 
        self.assertEqual(nick, 'moo\n')
100
 
 
101
 
    def test_invalid_commands(self):
102
 
        self.runbzr("pants", retcode=3)
103
 
        self.runbzr("--pants off", retcode=3)
104
 
        self.runbzr("diff --message foo", retcode=3)
105
 
 
106
 
    def test_ignore_patterns(self):
107
 
        self.runbzr('init')
108
 
        self.assertEquals(self.capture('unknowns'), '')
109
 
 
110
 
        file('foo.tmp', 'wt').write('tmp files are ignored')
111
 
        self.assertEquals(self.capture('unknowns'), '')
112
 
 
113
 
        file('foo.c', 'wt').write('int main() {}')
114
 
        self.assertEquals(self.capture('unknowns'), 'foo.c\n')
115
 
 
116
 
        self.runbzr(['add', 'foo.c'])
117
 
        self.assertEquals(self.capture('unknowns'), '')
118
 
 
119
 
        # 'ignore' works when creating the .bzignore file
120
 
        file('foo.blah', 'wt').write('blah')
121
 
        self.assertEquals(self.capture('unknowns'), 'foo.blah\n')
122
 
        self.runbzr('ignore *.blah')
123
 
        self.assertEquals(self.capture('unknowns'), '')
124
 
        self.assertEquals(file('.bzrignore', 'rU').read(), '*.blah\n')
125
 
 
126
 
        # 'ignore' works when then .bzrignore file already exists
127
 
        file('garh', 'wt').write('garh')
128
 
        self.assertEquals(self.capture('unknowns'), 'garh\n')
129
 
        self.runbzr('ignore garh')
130
 
        self.assertEquals(self.capture('unknowns'), '')
131
 
        self.assertEquals(file('.bzrignore', 'rU').read(), '*.blah\ngarh\n')
132
 
 
133
 
    def test_mv_modes(self):
134
 
        """Test two modes of operation for mv"""
135
 
        self.runbzr('init')
136
 
        self.build_tree(['a', 'c', 'subdir/'])
137
 
        self.run_bzr_captured(['add', self.test_dir])
138
 
        self.run_bzr_captured(['mv', 'a', 'b'])
139
 
        self.run_bzr_captured(['mv', 'b', 'subdir'])
140
 
        self.run_bzr_captured(['mv', 'subdir/b', 'a'])
141
 
        self.run_bzr_captured(['mv', 'a', 'c', 'subdir'])
142
 
        self.run_bzr_captured(['mv', 'subdir/a', 'subdir/newa'])
143
 
 
144
 
    def test_main_version(self):
145
 
        """Check output from version command and master option is reasonable"""
 
29
# this code was previously in testbzr
 
30
 
 
31
from unittest import TestCase
 
32
from bzrlib.selftest import TestBase, InTempDir
 
33
 
 
34
class TestVersion(TestBase):
 
35
    def runTest(self):
146
36
        # output is intentionally passed through to stdout so that we
147
37
        # can see the version being tested
148
 
        output = self.runbzr('version', backtick=1)
149
 
        self.log('bzr version output:')
150
 
        self.log(output)
151
 
        self.assert_(output.startswith('bzr (bazaar-ng) '))
152
 
        self.assertNotEqual(output.index('Canonical'), -1)
153
 
        # make sure --version is consistent
154
 
        tmp_output = self.runbzr('--version', backtick=1)
155
 
        self.log('bzr --version output:')
156
 
        self.log(tmp_output)
157
 
        self.assertEquals(output, tmp_output)
158
 
 
159
 
    def example_branch(test):
160
 
        test.runbzr('init')
161
 
        file('hello', 'wt').write('foo')
162
 
        test.runbzr('add hello')
163
 
        test.runbzr('commit -m setup hello')
164
 
        file('goodbye', 'wt').write('baz')
165
 
        test.runbzr('add goodbye')
166
 
        test.runbzr('commit -m setup goodbye')
167
 
 
168
 
    def test_export(self):
169
 
        os.mkdir('branch')
170
 
        os.chdir('branch')
171
 
        self.example_branch()
172
 
        self.runbzr('export ../latest')
173
 
        self.assertEqual(file('../latest/goodbye', 'rt').read(), 'baz')
174
 
        self.runbzr('export ../first -r 1')
175
 
        self.assert_(not os.path.exists('../first/goodbye'))
176
 
        self.assertEqual(file('../first/hello', 'rt').read(), 'foo')
177
 
        self.runbzr('export ../first.gz -r 1')
178
 
        self.assertEqual(file('../first.gz/hello', 'rt').read(), 'foo')
179
 
        self.runbzr('export ../first.bz2 -r 1')
180
 
        self.assertEqual(file('../first.bz2/hello', 'rt').read(), 'foo')
181
 
 
182
 
        from tarfile import TarFile
183
 
        self.runbzr('export ../first.tar -r 1')
184
 
        self.assert_(os.path.isfile('../first.tar'))
185
 
        tf = TarFile('../first.tar')
186
 
        self.assert_('first/hello' in tf.getnames(), tf.getnames())
187
 
        self.assertEqual(tf.extractfile('first/hello').read(), 'foo')
188
 
        self.runbzr('export ../first.tar.gz -r 1')
189
 
        self.assert_(os.path.isfile('../first.tar.gz'))
190
 
        self.runbzr('export ../first.tbz2 -r 1')
191
 
        self.assert_(os.path.isfile('../first.tbz2'))
192
 
        self.runbzr('export ../first.tar.bz2 -r 1')
193
 
        self.assert_(os.path.isfile('../first.tar.bz2'))
194
 
        self.runbzr('export ../first.tar.tbz2 -r 1')
195
 
        self.assert_(os.path.isfile('../first.tar.tbz2'))
196
 
 
197
 
        from bz2 import BZ2File
198
 
        tf = TarFile('../first.tar.tbz2', 
199
 
                     fileobj=BZ2File('../first.tar.tbz2', 'r'))
200
 
        self.assert_('first.tar/hello' in tf.getnames(), tf.getnames())
201
 
        self.assertEqual(tf.extractfile('first.tar/hello').read(), 'foo')
202
 
        self.runbzr('export ../first2.tar -r 1 --root pizza')
203
 
        tf = TarFile('../first2.tar')
204
 
        self.assert_('pizza/hello' in tf.getnames(), tf.getnames())
205
 
 
206
 
        from zipfile import ZipFile
207
 
        self.runbzr('export ../first.zip -r 1')
208
 
        self.failUnlessExists('../first.zip')
209
 
        zf = ZipFile('../first.zip')
210
 
        self.assert_('first/hello' in zf.namelist(), zf.namelist())
211
 
        self.assertEqual(zf.read('first/hello'), 'foo')
212
 
 
213
 
        self.runbzr('export ../first2.zip -r 1 --root pizza')
214
 
        zf = ZipFile('../first2.zip')
215
 
        self.assert_('pizza/hello' in zf.namelist(), zf.namelist())
216
 
        
217
 
        self.runbzr('export ../first-zip --format=zip -r 1')
218
 
        zf = ZipFile('../first-zip')
219
 
        self.assert_('first-zip/hello' in zf.namelist(), zf.namelist())
220
 
 
221
 
    def test_inventory(self):
222
 
        bzr = self.runbzr
223
 
        def output_equals(value, *args):
224
 
            out = self.runbzr(['inventory'] + list(args), backtick=True)
225
 
            self.assertEquals(out, value)
226
 
 
227
 
        bzr('init')
228
 
        open('a', 'wb').write('hello\n')
229
 
        os.mkdir('b')
230
 
 
231
 
        bzr('add a b')
232
 
        bzr('commit -m add')
233
 
 
234
 
        output_equals('a\n', '--kind', 'file')
235
 
        output_equals('b\n', '--kind', 'directory')        
236
 
 
237
 
    def test_ls(self):
238
 
        """Test the abilities of 'bzr ls'"""
239
 
        bzr = self.runbzr
240
 
        def bzrout(*args, **kwargs):
241
 
            kwargs['backtick'] = True
242
 
            return self.runbzr(*args, **kwargs)
243
 
 
244
 
        def ls_equals(value, *args):
245
 
            out = self.runbzr(['ls'] + list(args), backtick=True)
246
 
            self.assertEquals(out, value)
247
 
 
248
 
        bzr('init')
249
 
        open('a', 'wb').write('hello\n')
250
 
 
251
 
        # Can't supply both
252
 
        bzr('ls --verbose --null', retcode=3)
253
 
 
254
 
        ls_equals('a\n')
255
 
        ls_equals('?        a\n', '--verbose')
256
 
        ls_equals('a\n', '--unknown')
257
 
        ls_equals('', '--ignored')
258
 
        ls_equals('', '--versioned')
259
 
        ls_equals('a\n', '--unknown', '--ignored', '--versioned')
260
 
        ls_equals('', '--ignored', '--versioned')
261
 
        ls_equals('a\0', '--null')
262
 
 
263
 
        bzr('add a')
264
 
        ls_equals('V        a\n', '--verbose')
265
 
        bzr('commit -m add')
266
 
        
267
 
        os.mkdir('subdir')
268
 
        ls_equals('V        a\n'
269
 
                  '?        subdir/\n'
270
 
                  , '--verbose')
271
 
        open('subdir/b', 'wb').write('b\n')
272
 
        bzr('add')
273
 
        ls_equals('V        a\n'
274
 
                  'V        subdir/\n'
275
 
                  'V        subdir/b\n'
276
 
                  , '--verbose')
277
 
        bzr('commit -m subdir')
278
 
 
279
 
        ls_equals('a\n'
280
 
                  'subdir\n'
281
 
                  , '--non-recursive')
282
 
 
283
 
        ls_equals('V        a\n'
284
 
                  'V        subdir/\n'
285
 
                  , '--verbose', '--non-recursive')
286
 
 
287
 
        # Check what happens in a sub-directory
288
 
        os.chdir('subdir')
289
 
        ls_equals('b\n')
290
 
        ls_equals('b\0'
291
 
                  , '--null')
292
 
        ls_equals('a\n'
293
 
                  'subdir\n'
294
 
                  'subdir/b\n'
295
 
                  , '--from-root')
296
 
        ls_equals('a\0'
297
 
                  'subdir\0'
298
 
                  'subdir/b\0'
299
 
                  , '--from-root', '--null')
300
 
        ls_equals('a\n'
301
 
                  'subdir\n'
302
 
                  , '--from-root', '--non-recursive')
303
 
 
304
 
        os.chdir('..')
305
 
 
306
 
        # Check what happens when we supply a specific revision
307
 
        ls_equals('a\n', '--revision', '1')
308
 
        ls_equals('V        a\n'
309
 
                  , '--verbose', '--revision', '1')
310
 
 
311
 
        os.chdir('subdir')
312
 
        ls_equals('', '--revision', '1')
313
 
 
314
 
        # Now try to do ignored files.
315
 
        os.chdir('..')
316
 
        open('blah.py', 'wb').write('unknown\n')
317
 
        open('blah.pyo', 'wb').write('ignored\n')
318
 
        ls_equals('a\n'
319
 
                  'blah.py\n'
320
 
                  'blah.pyo\n'
321
 
                  'subdir\n'
322
 
                  'subdir/b\n')
323
 
        ls_equals('V        a\n'
324
 
                  '?        blah.py\n'
325
 
                  'I        blah.pyo\n'
326
 
                  'V        subdir/\n'
327
 
                  'V        subdir/b\n'
328
 
                  , '--verbose')
329
 
        ls_equals('blah.pyo\n'
330
 
                  , '--ignored')
331
 
        ls_equals('blah.py\n'
332
 
                  , '--unknown')
333
 
        ls_equals('a\n'
334
 
                  'subdir\n'
335
 
                  'subdir/b\n'
336
 
                  , '--versioned')
337
 
 
338
 
    def test_cat(self):
339
 
        self.runbzr('init')
340
 
        file("myfile", "wb").write("My contents\n")
341
 
        self.runbzr('add')
342
 
        self.runbzr('commit -m myfile')
343
 
        self.run_bzr_captured('cat -r 1 myfile'.split(' '))
344
 
 
345
 
    def test_pull_verbose(self):
346
 
        """Pull changes from one branch to another and watch the output."""
347
 
 
348
 
        os.mkdir('a')
349
 
        os.chdir('a')
350
 
 
351
 
        bzr = self.runbzr
352
 
        self.example_branch()
353
 
 
354
 
        os.chdir('..')
355
 
        bzr('branch a b')
356
 
        os.chdir('b')
357
 
        open('b', 'wb').write('else\n')
358
 
        bzr('add b')
359
 
        bzr(['commit', '-m', 'added b'])
360
 
 
361
 
        os.chdir('../a')
362
 
        out = bzr('pull --verbose ../b', backtick=True)
363
 
        self.failIfEqual(out.find('Added Revisions:'), -1)
364
 
        self.failIfEqual(out.find('message:\n  added b'), -1)
365
 
        self.failIfEqual(out.find('added b'), -1)
366
 
 
367
 
        # Check that --overwrite --verbose prints out the removed entries
368
 
        bzr('commit -m foo --unchanged')
369
 
        os.chdir('../b')
370
 
        bzr('commit -m baz --unchanged')
371
 
        bzr('pull ../a', retcode=3)
372
 
        out = bzr('pull --overwrite --verbose ../a', backtick=1)
373
 
 
374
 
        remove_loc = out.find('Removed Revisions:')
375
 
        self.failIfEqual(remove_loc, -1)
376
 
        added_loc = out.find('Added Revisions:')
377
 
        self.failIfEqual(added_loc, -1)
378
 
 
379
 
        removed_message = out.find('message:\n  baz')
380
 
        self.failIfEqual(removed_message, -1)
381
 
        self.failUnless(remove_loc < removed_message < added_loc)
382
 
 
383
 
        added_message = out.find('message:\n  foo')
384
 
        self.failIfEqual(added_message, -1)
385
 
        self.failUnless(added_loc < added_message)
386
 
        
387
 
    def test_locations(self):
388
 
        """Using and remembering different locations"""
389
 
        os.mkdir('a')
390
 
        os.chdir('a')
391
 
        self.runbzr('init')
392
 
        self.runbzr('commit -m unchanged --unchanged')
393
 
        self.runbzr('pull', retcode=3)
394
 
        self.runbzr('merge', retcode=3)
395
 
        self.runbzr('branch . ../b')
396
 
        os.chdir('../b')
397
 
        self.runbzr('pull')
398
 
        self.runbzr('branch . ../c')
399
 
        self.runbzr('pull ../c')
400
 
        self.runbzr('merge')
401
 
        os.chdir('../a')
402
 
        self.runbzr('pull ../b')
403
 
        self.runbzr('pull')
404
 
        self.runbzr('pull ../c')
405
 
        self.runbzr('branch ../c ../d')
406
 
        rmtree('../c')
407
 
        self.runbzr('pull')
408
 
        os.chdir('../b')
409
 
        self.runbzr('pull')
410
 
        os.chdir('../d')
411
 
        self.runbzr('pull', retcode=3)
412
 
        self.runbzr('pull ../a --remember')
413
 
        self.runbzr('pull')
414
 
        
415
 
    def test_unknown_command(self):
416
 
        """Handling of unknown command."""
417
 
        out, err = self.run_bzr_captured(['fluffy-badger'],
418
 
                                         retcode=3)
419
 
        self.assertEquals(out, '')
420
 
        err.index('unknown command')
421
 
 
422
 
    def create_conflicts(self):
423
 
        """Create a conflicted tree"""
424
 
        os.mkdir('base')
425
 
        os.chdir('base')
426
 
        file('hello', 'wb').write("hi world")
427
 
        file('answer', 'wb').write("42")
428
 
        self.runbzr('init')
429
 
        self.runbzr('add')
430
 
        self.runbzr('commit -m base')
431
 
        self.runbzr('branch . ../other')
432
 
        self.runbzr('branch . ../this')
433
 
        os.chdir('../other')
434
 
        file('hello', 'wb').write("Hello.")
435
 
        file('answer', 'wb').write("Is anyone there?")
436
 
        self.runbzr('commit -m other')
437
 
        os.chdir('../this')
438
 
        file('hello', 'wb').write("Hello, world")
439
 
        self.runbzr('mv answer question')
440
 
        file('question', 'wb').write("What do you get when you multiply six"
441
 
                                   "times nine?")
442
 
        self.runbzr('commit -m this')
443
 
 
444
 
    def test_status(self):
445
 
        os.mkdir('branch1')
446
 
        os.chdir('branch1')
447
 
        self.runbzr('init')
448
 
        self.runbzr('commit --unchanged --message f')
449
 
        self.runbzr('branch . ../branch2')
450
 
        self.runbzr('branch . ../branch3')
451
 
        self.runbzr('commit --unchanged --message peter')
452
 
        os.chdir('../branch2')
453
 
        self.runbzr('merge ../branch1')
454
 
        self.runbzr('commit --unchanged --message pumpkin')
455
 
        os.chdir('../branch3')
456
 
        self.runbzr('merge ../branch2')
457
 
        message = self.capture('status')
458
 
 
459
 
 
460
 
    def test_conflicts(self):
461
 
        """Handling of merge conflicts"""
462
 
        self.create_conflicts()
463
 
        self.runbzr('merge ../other --show-base', retcode=1)
464
 
        conflict_text = file('hello').read()
465
 
        self.assert_('<<<<<<<' in conflict_text)
466
 
        self.assert_('>>>>>>>' in conflict_text)
467
 
        self.assert_('=======' in conflict_text)
468
 
        self.assert_('|||||||' in conflict_text)
469
 
        self.assert_('hi world' in conflict_text)
470
 
        self.runbzr('revert')
471
 
        self.runbzr('resolve --all')
472
 
        self.runbzr('merge ../other', retcode=1)
473
 
        conflict_text = file('hello').read()
474
 
        self.assert_('|||||||' not in conflict_text)
475
 
        self.assert_('hi world' not in conflict_text)
476
 
        result = self.runbzr('conflicts', backtick=1)
477
 
        self.assertEquals(result, "Text conflict in hello\nText conflict in"
478
 
                                  " question\n")
479
 
        result = self.runbzr('status', backtick=1)
480
 
        self.assert_("conflicts:\n  Text conflict in hello\n"
481
 
                     "  Text conflict in question\n" in result, result)
482
 
        self.runbzr('resolve hello')
483
 
        result = self.runbzr('conflicts', backtick=1)
484
 
        self.assertEquals(result, "Text conflict in question\n")
485
 
        self.runbzr('commit -m conflicts', retcode=3)
486
 
        self.runbzr('resolve --all')
487
 
        result = self.runbzr('conflicts', backtick=1)
488
 
        self.runbzr('commit -m conflicts')
489
 
        self.assertEquals(result, "")
490
 
 
491
 
    def test_push(self):
492
 
        # create a source branch
493
 
        os.mkdir('my-branch')
494
 
        os.chdir('my-branch')
495
 
        self.example_branch()
496
 
 
497
 
        # with no push target, fail
498
 
        self.runbzr('push', retcode=3)
499
 
        # with an explicit target work
500
 
        self.runbzr('push ../output-branch')
501
 
        # with an implicit target work
502
 
        self.runbzr('push')
503
 
        # nothing missing
504
 
        self.runbzr('missing ../output-branch')
505
 
        # advance this branch
506
 
        self.runbzr('commit --unchanged -m unchanged')
507
 
 
508
 
        os.chdir('../output-branch')
509
 
        # There is no longer a difference as long as we have
510
 
        # access to the working tree
511
 
        self.runbzr('diff')
512
 
 
513
 
        # But we should be missing a revision
514
 
        self.runbzr('missing ../my-branch', retcode=1)
515
 
 
516
 
        # diverge the branches
517
 
        self.runbzr('commit --unchanged -m unchanged')
518
 
        os.chdir('../my-branch')
519
 
        # cannot push now
520
 
        self.runbzr('push', retcode=3)
521
 
        # and there are difference
522
 
        self.runbzr('missing ../output-branch', retcode=1)
523
 
        self.runbzr('missing --verbose ../output-branch', retcode=1)
524
 
        # but we can force a push
525
 
        self.runbzr('push --overwrite')
526
 
        # nothing missing
527
 
        self.runbzr('missing ../output-branch')
528
 
        
529
 
        # pushing to a new dir with no parent should fail
530
 
        self.runbzr('push ../missing/new-branch', retcode=3)
531
 
        # unless we provide --create-prefix
532
 
        self.runbzr('push --create-prefix ../missing/new-branch')
533
 
        # nothing missing
534
 
        self.runbzr('missing ../missing/new-branch')
535
 
 
536
 
    def test_external_command(self):
537
 
        """Test that external commands can be run by setting the path
538
 
        """
539
 
        # We don't at present run bzr in a subprocess for blackbox tests, and so 
540
 
        # don't really capture stdout, only the internal python stream.
541
 
        # Therefore we don't use a subcommand that produces any output or does
542
 
        # anything -- we just check that it can be run successfully.  
543
 
        cmd_name = 'test-command'
544
 
        if sys.platform == 'win32':
545
 
            cmd_name += '.bat'
546
 
        oldpath = os.environ.get('BZRPATH', None)
547
 
        bzr = self.capture
548
 
        try:
549
 
            if os.environ.has_key('BZRPATH'):
550
 
                del os.environ['BZRPATH']
551
 
 
552
 
            f = file(cmd_name, 'wb')
553
 
            if sys.platform == 'win32':
554
 
                f.write('@echo off\n')
555
 
            else:
556
 
                f.write('#!/bin/sh\n')
557
 
            # f.write('echo Hello from test-command')
558
 
            f.close()
559
 
            os.chmod(cmd_name, 0755)
560
 
 
561
 
            # It should not find the command in the local 
562
 
            # directory by default, since it is not in my path
563
 
            bzr(cmd_name, retcode=3)
564
 
 
565
 
            # Now put it into my path
566
 
            os.environ['BZRPATH'] = '.'
567
 
 
568
 
            bzr(cmd_name)
569
 
 
570
 
            # Make sure empty path elements are ignored
571
 
            os.environ['BZRPATH'] = os.pathsep
572
 
 
573
 
            bzr(cmd_name, retcode=3)
574
 
 
575
 
        finally:
576
 
            if oldpath:
577
 
                os.environ['BZRPATH'] = oldpath
578
 
 
579
 
 
580
 
def listdir_sorted(dir):
581
 
    L = os.listdir(dir)
582
 
    L.sort()
583
 
    return L
584
 
 
585
 
 
586
 
class OldTests(ExternalBase):
587
 
    """old tests moved from ./testbzr."""
588
 
 
589
 
    def test_bzr(self):
 
38
        self.runcmd(['bzr', 'version'])
 
39
 
 
40
 
 
41
 
 
42
class HelpCommands(TestBase):
 
43
    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')
 
49
 
 
50
 
 
51
class InitBranch(InTempDir):
 
52
    def runTest(self):
 
53
        import os
 
54
        self.runcmd(['bzr', 'init'])
 
55
 
 
56
 
 
57
 
 
58
class UserIdentity(InTempDir):
 
59
    def runTest(self):
 
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('@'),
 
64
                          1)
 
65
 
 
66
 
 
67
class InvalidCommands(InTempDir):
 
68
    def runTest(self):
 
69
        self.runcmd("bzr pants", retcode=1)
 
70
        self.runcmd("bzr --pants off", retcode=1)
 
71
        self.runcmd("bzr diff --message foo", retcode=1)
 
72
 
 
73
 
 
74
 
 
75
class OldTests(InTempDir):
 
76
    # old tests moved from ./testbzr
 
77
    def runTest(self):
590
78
        from os import chdir, mkdir
591
79
        from os.path import exists
 
80
        import os
592
81
 
593
 
        runbzr = self.runbzr
594
 
        capture = self.capture
 
82
        runcmd = self.runcmd
 
83
        backtick = self.backtick
595
84
        progress = self.log
596
85
 
597
86
        progress("basic branch creation")
598
 
        mkdir('branch1')
 
87
        runcmd(['mkdir', 'branch1'])
599
88
        chdir('branch1')
600
 
        runbzr('init')
 
89
        runcmd('bzr init')
601
90
 
602
 
        self.assertEquals(capture('root').rstrip(),
603
 
                          pathjoin(self.test_dir, 'branch1'))
 
91
        self.assertEquals(backtick('bzr root').rstrip(),
 
92
                          os.path.join(self.test_dir, 'branch1'))
604
93
 
605
94
        progress("status of new file")
606
95
 
608
97
        f.write('hello world!\n')
609
98
        f.close()
610
99
 
611
 
        self.assertEquals(capture('unknowns'), 'test.txt\n')
612
 
 
613
 
        out = capture("status")
614
 
        self.assertEquals(out, 'unknown:\n  test.txt\n')
 
100
        out = backtick("bzr unknowns")
 
101
        assert out == 'test.txt\n'
 
102
 
 
103
        out = backtick("bzr status")
 
104
        assert out == 'unknown:\n  test.txt\n'
 
105
 
 
106
        out = backtick("bzr status --all")
 
107
        assert out == "unknown:\n  test.txt\n"
 
108
 
 
109
        out = backtick("bzr status test.txt --all")
 
110
        assert out == "unknown:\n  test.txt\n"
615
111
 
616
112
        f = file('test2.txt', 'wt')
617
113
        f.write('goodbye cruel world...\n')
618
114
        f.close()
619
115
 
620
 
        out = capture("status test.txt")
621
 
        self.assertEquals(out, "unknown:\n  test.txt\n")
 
116
        out = backtick("bzr status test.txt")
 
117
        assert out == "unknown:\n  test.txt\n"
622
118
 
623
 
        out = capture("status")
624
 
        self.assertEquals(out, ("unknown:\n" "  test.txt\n" "  test2.txt\n"))
 
119
        out = backtick("bzr status")
 
120
        assert out == ("unknown:\n"
 
121
                       "  test.txt\n"
 
122
                       "  test2.txt\n")
625
123
 
626
124
        os.unlink('test2.txt')
627
125
 
628
126
        progress("command aliases")
629
 
        out = capture("st")
630
 
        self.assertEquals(out, ("unknown:\n" "  test.txt\n"))
 
127
        out = backtick("bzr st --all")
 
128
        assert out == ("unknown:\n"
 
129
                       "  test.txt\n")
631
130
 
632
 
        out = capture("stat")
633
 
        self.assertEquals(out, ("unknown:\n" "  test.txt\n"))
 
131
        out = backtick("bzr stat")
 
132
        assert out == ("unknown:\n"
 
133
                       "  test.txt\n")
634
134
 
635
135
        progress("command help")
636
 
        runbzr("help st")
637
 
        runbzr("help")
638
 
        runbzr("help commands")
639
 
        runbzr("help slartibartfast", 3)
 
136
        runcmd("bzr help st")
 
137
        runcmd("bzr help")
 
138
        runcmd("bzr help commands")
 
139
        runcmd("bzr help slartibartfast", 1)
640
140
 
641
 
        out = capture("help ci")
 
141
        out = backtick("bzr help ci")
642
142
        out.index('aliases: ')
643
143
 
644
144
        progress("can't rename unversioned file")
645
 
        runbzr("rename test.txt new-test.txt", 3)
 
145
        runcmd("bzr rename test.txt new-test.txt", 1)
646
146
 
647
147
        progress("adding a file")
648
148
 
649
 
        runbzr("add test.txt")
650
 
        self.assertEquals(capture("unknowns"), '')
 
149
        runcmd("bzr add test.txt")
 
150
        assert backtick("bzr unknowns") == ''
 
151
        assert backtick("bzr status --all") == ("added:\n"
 
152
                                                "  test.txt\n")
651
153
 
652
154
        progress("rename newly-added file")
653
 
        runbzr("rename test.txt hello.txt")
654
 
        self.assert_(os.path.exists("hello.txt"))
655
 
        self.assert_(not os.path.exists("test.txt"))
 
155
        runcmd("bzr rename test.txt hello.txt")
 
156
        assert os.path.exists("hello.txt")
 
157
        assert not os.path.exists("test.txt")
656
158
 
657
 
        self.assertEquals(capture("revno"), '0\n')
 
159
        assert backtick("bzr revno") == '0\n'
658
160
 
659
161
        progress("add first revision")
660
 
        runbzr(['commit', '-m', 'add first revision'])
 
162
        runcmd(["bzr", "commit", "-m", 'add first revision'])
661
163
 
662
164
        progress("more complex renames")
663
165
        os.mkdir("sub1")
664
 
        runbzr("rename hello.txt sub1", 3)
665
 
        runbzr("rename hello.txt sub1/hello.txt", 3)
666
 
        runbzr("move hello.txt sub1", 3)
667
 
 
668
 
        runbzr("add sub1")
669
 
        runbzr("rename sub1 sub2")
670
 
        runbzr("move hello.txt sub2")
671
 
        self.assertEqual(capture("relpath sub2/hello.txt"),
672
 
                         pathjoin("sub2", "hello.txt\n"))
673
 
 
674
 
        self.assert_(exists("sub2"))
675
 
        self.assert_(exists("sub2/hello.txt"))
676
 
        self.assert_(not exists("sub1"))
677
 
        self.assert_(not exists("hello.txt"))
678
 
 
679
 
        runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
 
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)
 
169
 
 
170
        runcmd("bzr add sub1")
 
171
        runcmd("bzr rename sub1 sub2")
 
172
        runcmd("bzr move hello.txt sub2")
 
173
        assert backtick("bzr relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
 
174
 
 
175
        assert exists("sub2")
 
176
        assert exists("sub2/hello.txt")
 
177
        assert not exists("sub1")
 
178
        assert not exists("hello.txt")
 
179
 
 
180
        runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
680
181
 
681
182
        mkdir("sub1")
682
 
        runbzr('add sub1')
683
 
        runbzr('move sub2/hello.txt sub1')
684
 
        self.assert_(not exists('sub2/hello.txt'))
685
 
        self.assert_(exists('sub1/hello.txt'))
686
 
        runbzr('move sub2 sub1')
687
 
        self.assert_(not exists('sub2'))
688
 
        self.assert_(exists('sub1/sub2'))
 
183
        runcmd('bzr add sub1')
 
184
        runcmd('bzr move sub2/hello.txt sub1')
 
185
        assert not exists('sub2/hello.txt')
 
186
        assert exists('sub1/hello.txt')
 
187
        runcmd('bzr move sub2 sub1')
 
188
        assert not exists('sub2')
 
189
        assert exists('sub1/sub2')
689
190
 
690
 
        runbzr(['commit', '-m', 'rename nested subdirectories'])
 
191
        runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
691
192
 
692
193
        chdir('sub1/sub2')
693
 
        self.assertEquals(capture('root')[:-1],
694
 
                          pathjoin(self.test_dir, 'branch1'))
695
 
        runbzr('move ../hello.txt .')
696
 
        self.assert_(exists('./hello.txt'))
697
 
        self.assertEquals(capture('relpath hello.txt'),
698
 
                          pathjoin('sub1', 'sub2', 'hello.txt') + '\n')
699
 
        self.assertEquals(capture('relpath ../../sub1/sub2/hello.txt'), pathjoin('sub1', 'sub2', 'hello.txt\n'))
700
 
        runbzr(['commit', '-m', 'move to parent directory'])
 
194
        self.assertEquals(backtick('bzr root')[:-1],
 
195
                          os.path.join(self.test_dir, 'branch1'))
 
196
        runcmd('bzr move ../hello.txt .')
 
197
        assert exists('./hello.txt')
 
198
        assert backtick('bzr relpath hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
 
199
        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'])
701
201
        chdir('..')
702
 
        self.assertEquals(capture('relpath sub2/hello.txt'), pathjoin('sub1', 'sub2', 'hello.txt\n'))
 
202
        assert backtick('bzr relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
703
203
 
704
 
        runbzr('move sub2/hello.txt .')
705
 
        self.assert_(exists('hello.txt'))
 
204
        runcmd('bzr move sub2/hello.txt .')
 
205
        assert exists('hello.txt')
706
206
 
707
207
        f = file('hello.txt', 'wt')
708
208
        f.write('some nice new content\n')
709
209
        f.close()
710
210
 
711
211
        f = file('msg.tmp', 'wt')
712
 
        f.write('this is my new commit\nand it has multiple lines, for fun')
 
212
        f.write('this is my new commit\n')
713
213
        f.close()
714
214
 
715
 
        runbzr('commit -F msg.tmp')
716
 
 
717
 
        self.assertEquals(capture('revno'), '5\n')
718
 
        runbzr('export -r 5 export-5.tmp')
719
 
        runbzr('export export.tmp')
720
 
 
721
 
        runbzr('log')
722
 
        runbzr('log -v')
723
 
        runbzr('log -v --forward')
724
 
        runbzr('log -m', retcode=3)
725
 
        log_out = capture('log -m commit')
726
 
        self.assert_("this is my new commit\n  and" in log_out)
727
 
        self.assert_("rename nested" not in log_out)
728
 
        self.assert_('revision-id' not in log_out)
729
 
        self.assert_('revision-id' in capture('log --show-ids -m commit'))
730
 
 
731
 
        log_out = capture('log --line')
732
 
        # determine the widest line we want
733
 
        max_width = terminal_width() - 1
734
 
        for line in log_out.splitlines():
735
 
            self.assert_(len(line) <= max_width, len(line))
736
 
        self.assert_("this is my new commit and" not in log_out)
737
 
        self.assert_("this is my new commit" in log_out)
 
215
        runcmd('bzr commit -F msg.tmp')
 
216
 
 
217
        assert backtick('bzr revno') == '5\n'
 
218
        runcmd('bzr export -r 5 export-5.tmp')
 
219
        runcmd('bzr export export.tmp')
 
220
 
 
221
        runcmd('bzr log')
 
222
        runcmd('bzr log -v')
 
223
 
 
224
 
738
225
 
739
226
        progress("file with spaces in name")
740
227
        mkdir('sub directory')
741
228
        file('sub directory/file with spaces ', 'wt').write('see how this works\n')
742
 
        runbzr('add .')
743
 
        runbzr('diff', retcode=1)
744
 
        runbzr('commit -m add-spaces')
745
 
        runbzr('check')
746
 
 
747
 
        runbzr('log')
748
 
        runbzr('log --forward')
749
 
 
750
 
        runbzr('info')
751
 
 
752
 
        if has_symlinks():
753
 
            progress("symlinks")
754
 
            mkdir('symlinks')
755
 
            chdir('symlinks')
756
 
            runbzr('init')
757
 
            os.symlink("NOWHERE1", "link1")
758
 
            runbzr('add link1')
759
 
            self.assertEquals(self.capture('unknowns'), '')
760
 
            runbzr(['commit', '-m', '1: added symlink link1'])
761
 
    
762
 
            mkdir('d1')
763
 
            runbzr('add d1')
764
 
            self.assertEquals(self.capture('unknowns'), '')
765
 
            os.symlink("NOWHERE2", "d1/link2")
766
 
            self.assertEquals(self.capture('unknowns'), 'd1/link2\n')
767
 
            # is d1/link2 found when adding d1
768
 
            runbzr('add d1')
769
 
            self.assertEquals(self.capture('unknowns'), '')
770
 
            os.symlink("NOWHERE3", "d1/link3")
771
 
            self.assertEquals(self.capture('unknowns'), 'd1/link3\n')
772
 
            runbzr(['commit', '-m', '2: added dir, symlink'])
773
 
    
774
 
            runbzr('rename d1 d2')
775
 
            runbzr('move d2/link2 .')
776
 
            runbzr('move link1 d2')
777
 
            self.assertEquals(os.readlink("./link2"), "NOWHERE2")
778
 
            self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
779
 
            runbzr('add d2/link3')
780
 
            runbzr('diff', retcode=1)
781
 
            runbzr(['commit', '-m', '3: rename of dir, move symlinks, add link3'])
782
 
    
783
 
            os.unlink("link2")
784
 
            os.symlink("TARGET 2", "link2")
785
 
            os.unlink("d2/link1")
786
 
            os.symlink("TARGET 1", "d2/link1")
787
 
            runbzr('diff', retcode=1)
788
 
            self.assertEquals(self.capture("relpath d2/link1"), "d2/link1\n")
789
 
            runbzr(['commit', '-m', '4: retarget of two links'])
790
 
    
791
 
            runbzr('remove d2/link1')
792
 
            self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
793
 
            runbzr(['commit', '-m', '5: remove d2/link1'])
794
 
            # try with the rm alias
795
 
            runbzr('add d2/link1')
796
 
            runbzr(['commit', '-m', '6: add d2/link1'])
797
 
            runbzr('rm d2/link1')
798
 
            self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
799
 
            runbzr(['commit', '-m', '7: remove d2/link1'])
800
 
    
801
 
            os.mkdir("d1")
802
 
            runbzr('add d1')
803
 
            runbzr('rename d2/link3 d1/link3new')
804
 
            self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
805
 
            runbzr(['commit', '-m', '8: remove d2/link1, move/rename link3'])
806
 
            
807
 
            runbzr(['check'])
808
 
            
809
 
            runbzr(['export', '-r', '1', 'exp1.tmp'])
810
 
            chdir("exp1.tmp")
811
 
            self.assertEquals(listdir_sorted("."), [ "link1" ])
812
 
            self.assertEquals(os.readlink("link1"), "NOWHERE1")
813
 
            chdir("..")
814
 
            
815
 
            runbzr(['export', '-r', '2', 'exp2.tmp'])
816
 
            chdir("exp2.tmp")
817
 
            self.assertEquals(listdir_sorted("."), [ "d1", "link1" ])
818
 
            chdir("..")
819
 
            
820
 
            runbzr(['export', '-r', '3', 'exp3.tmp'])
821
 
            chdir("exp3.tmp")
822
 
            self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
823
 
            self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
824
 
            self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
825
 
            self.assertEquals(os.readlink("link2")   , "NOWHERE2")
826
 
            chdir("..")
827
 
            
828
 
            runbzr(['export', '-r', '4', 'exp4.tmp'])
829
 
            chdir("exp4.tmp")
830
 
            self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
831
 
            self.assertEquals(os.readlink("d2/link1"), "TARGET 1")
832
 
            self.assertEquals(os.readlink("link2")   , "TARGET 2")
833
 
            self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
834
 
            chdir("..")
835
 
            
836
 
            runbzr(['export', '-r', '5', 'exp5.tmp'])
837
 
            chdir("exp5.tmp")
838
 
            self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
839
 
            self.assert_(os.path.islink("link2"))
840
 
            self.assert_(listdir_sorted("d2")== [ "link3" ])
841
 
            chdir("..")
842
 
            
843
 
            runbzr(['export', '-r', '8', 'exp6.tmp'])
844
 
            chdir("exp6.tmp")
845
 
            self.assertEqual(listdir_sorted("."), [ "d1", "d2", "link2"])
846
 
            self.assertEquals(listdir_sorted("d1"), [ "link3new" ])
847
 
            self.assertEquals(listdir_sorted("d2"), [])
848
 
            self.assertEquals(os.readlink("d1/link3new"), "NOWHERE3")
849
 
            chdir("..")
850
 
        else:
851
 
            progress("skipping symlink tests")
852
 
 
853
 
 
854
 
class RemoteTests(object):
855
 
    """Test bzr ui commands against remote branches."""
856
 
 
857
 
    def test_branch(self):
858
 
        os.mkdir('from')
859
 
        wt = self.make_branch_and_tree('from')
860
 
        branch = wt.branch
861
 
        wt.commit('empty commit for nonsense', allow_pointless=True)
862
 
        url = self.get_readonly_url('from')
863
 
        self.run_bzr('branch', url, 'to')
864
 
        branch = Branch.open('to')
865
 
        self.assertEqual(1, len(branch.revision_history()))
866
 
        # the branch should be set in to to from
867
 
        self.assertEqual(url + '/', branch.get_parent())
868
 
 
869
 
    def test_log(self):
870
 
        self.build_tree(['branch/', 'branch/file'])
871
 
        self.capture('init branch')
872
 
        self.capture('add branch/file')
873
 
        self.capture('commit -m foo branch')
874
 
        url = self.get_readonly_url('branch/file')
875
 
        output = self.capture('log %s' % url)
876
 
        self.assertEqual(8, len(output.split('\n')))
 
229
        runcmd('bzr add .')
 
230
        runcmd('bzr diff')
 
231
        runcmd('bzr commit -m add-spaces')
 
232
        runcmd('bzr check')
 
233
 
 
234
        runcmd('bzr log')
 
235
        runcmd('bzr log --forward')
 
236
 
 
237
        runcmd('bzr info')
 
238
 
 
239
 
 
240
 
 
241
 
 
242
 
 
243
 
 
244
        chdir('..')
 
245
        chdir('..')
 
246
        progress('branch')
 
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')
 
252
 
 
253
        progress("pull")
 
254
        chdir('branch1')
 
255
        runcmd('bzr pull', retcode=1)
 
256
        runcmd('bzr pull ../branch2')
 
257
        chdir('.bzr')
 
258
        runcmd('bzr pull')
 
259
        runcmd('bzr commit -m empty')
 
260
        runcmd('bzr pull')
 
261
        chdir('../../branch2')
 
262
        runcmd('bzr pull')
 
263
        runcmd('bzr commit -m empty')
 
264
        chdir('../branch1')
 
265
        runcmd('bzr commit -m empty')
 
266
        runcmd('bzr pull', retcode=1)
 
267
        chdir ('..')
 
268
 
 
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...
 
274
        #     added a
 
275
        #     * commited r1
 
276
        #     $ bzr remove a
 
277
        #     $ bzr status
 
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')
 
282
        runcmd('bzr init')
 
283
        file('a', 'w').write('foo')
 
284
        runcmd('bzr add a')
 
285
        runcmd(['bzr', 'commit', '-m', 'add a'])
 
286
        runcmd('bzr remove a')
 
287
        runcmd('bzr status')
 
288
 
 
289
        chdir('..')
 
290
 
 
291
        progress('ignore patterns')
 
292
        mkdir('ignorebranch')
 
293
        chdir('ignorebranch')
 
294
        runcmd('bzr init')
 
295
        assert backtick('bzr unknowns') == ''
 
296
 
 
297
        file('foo.tmp', 'wt').write('tmp files are ignored')
 
298
        assert backtick('bzr unknowns') == ''
 
299
 
 
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') == ''
 
304
 
 
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'
 
311
 
 
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'
 
318
 
 
319
        chdir('..')
 
320
 
 
321
 
 
322
 
 
323
 
 
324
        progress("recursive and non-recursive add")
 
325
        mkdir('no-recurse')
 
326
        chdir('no-recurse')
 
327
        runcmd('bzr init')
 
328
        mkdir('foo')
 
329
        fp = os.path.join('foo', 'test.txt')
 
330
        f = file(fp, 'w')
 
331
        f.write('hello!\n')
 
332
        f.close()
 
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')
 
337
 
 
338
        runcmd('bzr file-id ' + fp, 1)      # still not versioned 
 
339
 
 
340
        runcmd('bzr add foo')
 
341
        runcmd('bzr file-id ' + fp)
 
342
        runcmd('bzr commit -m add-sub-file')
 
343
 
 
344
        chdir('..')
 
345
 
 
346
 
 
347
 
 
348
    
877
349
        
878
 
    def test_check(self):
879
 
        self.build_tree(['branch/', 'branch/file'])
880
 
        self.capture('init branch')
881
 
        self.capture('add branch/file')
882
 
        self.capture('commit -m foo branch')
883
 
        url = self.get_readonly_url('branch/')
884
 
        self.run_bzr('check', url)
885
 
    
886
 
    def test_push(self):
887
 
        # create a source branch
888
 
        os.mkdir('my-branch')
889
 
        os.chdir('my-branch')
890
 
        self.run_bzr('init')
891
 
        file('hello', 'wt').write('foo')
892
 
        self.run_bzr('add', 'hello')
893
 
        self.run_bzr('commit', '-m', 'setup')
894
 
 
895
 
        # with an explicit target work
896
 
        self.run_bzr('push', self.get_url('output-branch'))
897
 
 
898
 
    
899
 
class HTTPTests(TestCaseWithWebserver, RemoteTests):
900
 
    """Test various commands against a HTTP server."""
901
 
    
902
 
    
903
 
class SFTPTestsAbsolute(TestCaseWithSFTPServer, RemoteTests):
904
 
    """Test various commands against a SFTP server using abs paths."""
905
 
 
906
 
    
907
 
class SFTPTestsAbsoluteSibling(TestCaseWithSFTPServer, RemoteTests):
908
 
    """Test various commands against a SFTP server using abs paths."""
909
 
 
910
 
    def setUp(self):
911
 
        super(SFTPTestsAbsoluteSibling, self).setUp()
912
 
        self._override_home = '/dev/noone/runs/tests/here'
913
 
 
914
 
    
915
 
class SFTPTestsRelative(TestCaseWithSFTPServer, RemoteTests):
916
 
    """Test various commands against a SFTP server using homedir rel paths."""
917
 
 
918
 
    def setUp(self):
919
 
        super(SFTPTestsRelative, self).setUp()
920
 
        self._get_remote_is_absolute = False
 
350
 
 
351
 
 
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.
 
356
 
 
357
def suite():
 
358
    from unittest import TestSuite
 
359
    s = TestSuite()
 
360
    s.addTests([TestVersion(),
 
361
                InitBranch(),
 
362
                HelpCommands(),
 
363
                UserIdentity(),
 
364
                InvalidCommands(),
 
365
                OldTests()])
 
366
    return s