~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/blackbox.py

  • Committer: Martin Pool
  • Date: 2005-07-07 10:22:02 UTC
  • Revision ID: mbp@sourcefrog.net-20050707102201-2d2a13a25098b101
- rearrange and clear up merged weave

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
"""Black-box tests for bzr.
20
20
 
21
21
These check that it behaves properly when it's invoked through the regular
22
 
command-line interface. This doesn't actually run a new interpreter but 
23
 
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.
24
27
"""
25
28
 
26
 
 
27
 
from cStringIO import StringIO
28
 
import os
29
 
import re
30
 
import shutil
31
 
import sys
32
 
 
33
 
from bzrlib.branch import Branch
34
 
from bzrlib.clone import copy_branch
35
 
from bzrlib.errors import BzrCommandError
36
 
from bzrlib.osutils import has_symlinks
37
 
from bzrlib.selftest import TestCaseInTempDir, BzrTestBase
38
 
from bzrlib.selftest.HTTPTestUtil import TestCaseWithWebserver
39
 
 
40
 
 
41
 
class ExternalBase(TestCaseInTempDir):
42
 
 
43
 
    def runbzr(self, args, retcode=0, backtick=False):
44
 
        if isinstance(args, basestring):
45
 
            args = args.split()
46
 
 
47
 
        if backtick:
48
 
            return self.run_bzr_captured(args, retcode=retcode)[0]
49
 
        else:
50
 
            return self.run_bzr_captured(args, retcode=retcode)
51
 
 
52
 
 
53
 
class TestCommands(ExternalBase):
54
 
 
55
 
    def test_help_commands(self):
56
 
        self.runbzr('--help')
57
 
        self.runbzr('help')
58
 
        self.runbzr('help commands')
59
 
        self.runbzr('help help')
60
 
        self.runbzr('commit -h')
61
 
 
62
 
    def test_init_branch(self):
63
 
        self.runbzr(['init'])
64
 
 
65
 
    def test_whoami(self):
66
 
        # this should always identify something, if only "john@localhost"
67
 
        self.runbzr("whoami")
68
 
        self.runbzr("whoami --email")
69
 
 
70
 
        self.assertEquals(self.runbzr("whoami --email",
71
 
                                      backtick=True).count('@'), 1)
72
 
        
73
 
    def test_whoami_branch(self):
74
 
        """branch specific user identity works."""
75
 
        self.runbzr('init')
76
 
        f = file('.bzr/email', 'wt')
77
 
        f.write('Branch Identity <branch@identi.ty>')
78
 
        f.close()
79
 
        bzr_email = os.environ.get('BZREMAIL')
80
 
        if bzr_email is not None:
81
 
            del os.environ['BZREMAIL']
82
 
        whoami = self.runbzr("whoami",backtick=True)
83
 
        whoami_email = self.runbzr("whoami --email",backtick=True)
84
 
        self.assertTrue(whoami.startswith('Branch Identity <branch@identi.ty>'))
85
 
        self.assertTrue(whoami_email.startswith('branch@identi.ty'))
86
 
        # Verify that the environment variable overrides the value 
87
 
        # in the file
88
 
        os.environ['BZREMAIL'] = 'Different ID <other@environ.ment>'
89
 
        whoami = self.runbzr("whoami",backtick=True)
90
 
        whoami_email = self.runbzr("whoami --email",backtick=True)
91
 
        self.assertTrue(whoami.startswith('Different ID <other@environ.ment>'))
92
 
        self.assertTrue(whoami_email.startswith('other@environ.ment'))
93
 
        if bzr_email is not None:
94
 
            os.environ['BZREMAIL'] = bzr_email
95
 
 
96
 
    def test_invalid_commands(self):
97
 
        self.runbzr("pants", retcode=1)
98
 
        self.runbzr("--pants off", retcode=1)
99
 
        self.runbzr("diff --message foo", retcode=1)
100
 
 
101
 
    def test_empty_commit(self):
102
 
        self.runbzr("init")
103
 
        self.build_tree(['hello.txt'])
104
 
        self.runbzr("commit -m empty", retcode=1)
105
 
        self.runbzr("add hello.txt")
106
 
        self.runbzr("commit -m added")
107
 
 
108
 
    def test_empty_commit_message(self):
109
 
        self.runbzr("init")
110
 
        file('foo.c', 'wt').write('int main() {}')
111
 
        self.runbzr(['add', 'foo.c'])
112
 
        self.runbzr(["commit", "-m", ""] , retcode=1) 
113
 
 
114
 
    def test_other_branch_commit(self):
115
 
        # this branch is to ensure consistent behaviour, whether we're run
116
 
        # inside a branch, or not.
117
 
        os.mkdir('empty_branch')
118
 
        os.chdir('empty_branch')
119
 
        self.runbzr('init')
120
 
        os.mkdir('branch')
121
 
        os.chdir('branch')
122
 
        self.runbzr('init')
123
 
        file('foo.c', 'wt').write('int main() {}')
124
 
        file('bar.c', 'wt').write('int main() {}')
125
 
        os.chdir('..')
126
 
        self.runbzr(['add', 'branch/foo.c'])
127
 
        self.runbzr(['add', 'branch'])
128
 
        # can't commit files in different trees; sane error
129
 
        self.runbzr('commit -m newstuff branch/foo.c .', retcode=1)
130
 
        self.runbzr('commit -m newstuff branch/foo.c')
131
 
        self.runbzr('commit -m newstuff branch')
132
 
        self.runbzr('commit -m newstuff branch', retcode=1)
133
 
 
134
 
 
135
 
    def test_ignore_patterns(self):
136
 
        from bzrlib.branch import Branch
137
 
        
138
 
        b = Branch.initialize('.')
139
 
        self.assertEquals(list(b.unknowns()), [])
140
 
 
141
 
        file('foo.tmp', 'wt').write('tmp files are ignored')
142
 
        self.assertEquals(list(b.unknowns()), [])
143
 
        assert self.capture('unknowns') == ''
144
 
 
145
 
        file('foo.c', 'wt').write('int main() {}')
146
 
        self.assertEquals(list(b.unknowns()), ['foo.c'])
147
 
        assert self.capture('unknowns') == 'foo.c\n'
148
 
 
149
 
        self.runbzr(['add', 'foo.c'])
150
 
        assert self.capture('unknowns') == ''
151
 
 
152
 
        # 'ignore' works when creating the .bzignore file
153
 
        file('foo.blah', 'wt').write('blah')
154
 
        self.assertEquals(list(b.unknowns()), ['foo.blah'])
155
 
        self.runbzr('ignore *.blah')
156
 
        self.assertEquals(list(b.unknowns()), [])
157
 
        assert file('.bzrignore', 'rU').read() == '*.blah\n'
158
 
 
159
 
        # 'ignore' works when then .bzrignore file already exists
160
 
        file('garh', 'wt').write('garh')
161
 
        self.assertEquals(list(b.unknowns()), ['garh'])
162
 
        assert self.capture('unknowns') == 'garh\n'
163
 
        self.runbzr('ignore garh')
164
 
        self.assertEquals(list(b.unknowns()), [])
165
 
        assert file('.bzrignore', 'rU').read() == '*.blah\ngarh\n'
166
 
 
167
 
    def test_revert(self):
168
 
        self.runbzr('init')
169
 
 
170
 
        file('hello', 'wt').write('foo')
171
 
        self.runbzr('add hello')
172
 
        self.runbzr('commit -m setup hello')
173
 
 
174
 
        file('goodbye', 'wt').write('baz')
175
 
        self.runbzr('add goodbye')
176
 
        self.runbzr('commit -m setup goodbye')
177
 
 
178
 
        file('hello', 'wt').write('bar')
179
 
        file('goodbye', 'wt').write('qux')
180
 
        self.runbzr('revert hello')
181
 
        self.check_file_contents('hello', 'foo')
182
 
        self.check_file_contents('goodbye', 'qux')
183
 
        self.runbzr('revert')
184
 
        self.check_file_contents('goodbye', 'baz')
185
 
 
186
 
        os.mkdir('revertdir')
187
 
        self.runbzr('add revertdir')
188
 
        self.runbzr('commit -m f')
189
 
        os.rmdir('revertdir')
190
 
        self.runbzr('revert')
191
 
 
192
 
        os.symlink('/unlikely/to/exist', 'symlink')
193
 
        self.runbzr('add symlink')
194
 
        self.runbzr('commit -m f')
195
 
        os.unlink('symlink')
196
 
        self.runbzr('revert')
197
 
        self.failUnlessExists('symlink')
198
 
        os.unlink('symlink')
199
 
        os.symlink('a-different-path', 'symlink')
200
 
        self.runbzr('revert')
201
 
        self.assertEqual('/unlikely/to/exist',
202
 
                         os.readlink('symlink'))
203
 
        
204
 
        file('hello', 'wt').write('xyz')
205
 
        self.runbzr('commit -m xyz hello')
206
 
        self.runbzr('revert -r 1 hello')
207
 
        self.check_file_contents('hello', 'foo')
208
 
        self.runbzr('revert hello')
209
 
        self.check_file_contents('hello', 'xyz')
210
 
        os.chdir('revertdir')
211
 
        self.runbzr('revert')
212
 
        os.chdir('..')
213
 
 
214
 
 
215
 
    def test_mv_modes(self):
216
 
        """Test two modes of operation for mv"""
217
 
        from bzrlib.branch import Branch
218
 
        b = Branch.initialize('.')
219
 
        self.build_tree(['a', 'c', 'subdir/'])
220
 
        self.run_bzr_captured(['add', self.test_dir])
221
 
        self.run_bzr_captured(['mv', 'a', 'b'])
222
 
        self.run_bzr_captured(['mv', 'b', 'subdir'])
223
 
        self.run_bzr_captured(['mv', 'subdir/b', 'a'])
224
 
        self.run_bzr_captured(['mv', 'a', 'c', 'subdir'])
225
 
        self.run_bzr_captured(['mv', 'subdir/a', 'subdir/newa'])
226
 
 
227
 
    def test_main_version(self):
228
 
        """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):
229
36
        # output is intentionally passed through to stdout so that we
230
37
        # can see the version being tested
231
 
        output = self.runbzr('version', backtick=1)
232
 
        self.log('bzr version output:')
233
 
        self.log(output)
234
 
        self.assert_(output.startswith('bzr (bazaar-ng) '))
235
 
        self.assertNotEqual(output.index('Canonical'), -1)
236
 
        # make sure --version is consistent
237
 
        tmp_output = self.runbzr('--version', backtick=1)
238
 
        self.log('bzr --version output:')
239
 
        self.log(tmp_output)
240
 
        self.assertEquals(output, tmp_output)
241
 
 
242
 
    def example_branch(test):
243
 
        test.runbzr('init')
244
 
        file('hello', 'wt').write('foo')
245
 
        test.runbzr('add hello')
246
 
        test.runbzr('commit -m setup hello')
247
 
        file('goodbye', 'wt').write('baz')
248
 
        test.runbzr('add goodbye')
249
 
        test.runbzr('commit -m setup goodbye')
250
 
 
251
 
    def test_export(self):
252
 
        os.mkdir('branch')
253
 
        os.chdir('branch')
254
 
        self.example_branch()
255
 
        self.runbzr('export ../latest')
256
 
        self.assertEqual(file('../latest/goodbye', 'rt').read(), 'baz')
257
 
        self.runbzr('export ../first -r 1')
258
 
        assert not os.path.exists('../first/goodbye')
259
 
        self.assertEqual(file('../first/hello', 'rt').read(), 'foo')
260
 
        self.runbzr('export ../first.gz -r 1')
261
 
        self.assertEqual(file('../first.gz/hello', 'rt').read(), 'foo')
262
 
        self.runbzr('export ../first.bz2 -r 1')
263
 
        self.assertEqual(file('../first.bz2/hello', 'rt').read(), 'foo')
264
 
        self.runbzr('export ../first.tar -r 1')
265
 
        assert os.path.isfile('../first.tar')
266
 
        from tarfile import TarFile
267
 
        tf = TarFile('../first.tar')
268
 
        assert 'first/hello' in tf.getnames(), tf.getnames()
269
 
        self.assertEqual(tf.extractfile('first/hello').read(), 'foo')
270
 
        self.runbzr('export ../first.tar.gz -r 1')
271
 
        assert os.path.isfile('../first.tar.gz')
272
 
        self.runbzr('export ../first.tbz2 -r 1')
273
 
        assert os.path.isfile('../first.tbz2')
274
 
        self.runbzr('export ../first.tar.bz2 -r 1')
275
 
        assert os.path.isfile('../first.tar.bz2')
276
 
        self.runbzr('export ../first.tar.tbz2 -r 1')
277
 
        assert os.path.isfile('../first.tar.tbz2')
278
 
        from bz2 import BZ2File
279
 
        tf = TarFile('../first.tar.tbz2', 
280
 
                     fileobj=BZ2File('../first.tar.tbz2', 'r'))
281
 
        assert 'first.tar/hello' in tf.getnames(), tf.getnames()
282
 
        self.assertEqual(tf.extractfile('first.tar/hello').read(), 'foo')
283
 
        self.runbzr('export ../first2.tar -r 1 --root pizza')
284
 
        tf = TarFile('../first2.tar')
285
 
        assert 'pizza/hello' in tf.getnames(), tf.getnames()
286
 
 
287
 
    def test_diff(self):
288
 
        self.example_branch()
289
 
        file('hello', 'wt').write('hello world!')
290
 
        self.runbzr('commit -m fixing hello')
291
 
        output = self.runbzr('diff -r 2..3', backtick=1)
292
 
        self.assert_('\n+hello world!' in output)
293
 
        output = self.runbzr('diff -r last:3..last:1', backtick=1)
294
 
        self.assert_('\n+baz' in output)
295
 
 
296
 
    def test_diff_branches(self):
297
 
        self.build_tree(['branch1/', 'branch1/file', 'branch2/'])
298
 
        branch = Branch.initialize('branch1')
299
 
        branch.add(['file'])
300
 
        branch.commit('add file')
301
 
        copy_branch(branch, 'branch2')
302
 
        print >> open('branch2/file', 'w'), 'new content'
303
 
        branch2 = Branch.open('branch2')
304
 
        branch2.commit('update file')
305
 
        # should open branch1 and diff against branch2, 
306
 
        output = self.run_bzr_captured(['diff', '-r', 'branch:branch2', 'branch1'])
307
 
        self.assertEquals(("=== modified file 'file'\n"
308
 
                           "--- file\n"
309
 
                           "+++ file\n"
310
 
                           "@@ -1,1 +1,1 @@\n"
311
 
                           "-new content\n"
312
 
                           "+contents of branch1/file\n"
313
 
                           "\n", ''), output)
314
 
 
315
 
    def test_branch(self):
316
 
        """Branch from one branch to another."""
317
 
        os.mkdir('a')
318
 
        os.chdir('a')
319
 
        self.example_branch()
320
 
        os.chdir('..')
321
 
        self.runbzr('branch a b')
322
 
        self.assertFileEqual('b\n', 'b/.bzr/branch-name')
323
 
        self.runbzr('branch a c -r 1')
324
 
        os.chdir('b')
325
 
        self.runbzr('commit -m foo --unchanged')
326
 
        os.chdir('..')
327
 
        # naughty - abstraction violations RBC 20050928  
328
 
        print "test_branch used to delete the stores, how is this meant to work ?"
329
 
        #shutil.rmtree('a/.bzr/revision-store')
330
 
        #shutil.rmtree('a/.bzr/inventory-store', ignore_errors=True)
331
 
        #shutil.rmtree('a/.bzr/text-store', ignore_errors=True)
332
 
        self.runbzr('branch a d --basis b')
333
 
 
334
 
    def test_merge(self):
335
 
        from bzrlib.branch import Branch
336
 
        
337
 
        os.mkdir('a')
338
 
        os.chdir('a')
339
 
        self.example_branch()
340
 
        os.chdir('..')
341
 
        self.runbzr('branch a b')
342
 
        os.chdir('b')
343
 
        file('goodbye', 'wt').write('quux')
344
 
        self.runbzr(['commit',  '-m',  "more u's are always good"])
345
 
 
346
 
        os.chdir('../a')
347
 
        file('hello', 'wt').write('quuux')
348
 
        # We can't merge when there are in-tree changes
349
 
        self.runbzr('merge ../b', retcode=1)
350
 
        self.runbzr(['commit', '-m', "Like an epidemic of u's"])
351
 
        self.runbzr('merge ../b -r last:1..last:1 --merge-type blooof',
352
 
                    retcode=1)
353
 
        self.runbzr('merge ../b -r last:1..last:1 --merge-type merge3')
354
 
        self.runbzr('revert --no-backup')
355
 
        self.runbzr('merge ../b -r last:1..last:1 --merge-type weave')
356
 
        self.runbzr('revert --no-backup')
357
 
        self.runbzr('merge ../b -r last:1..last:1 --reprocess')
358
 
        self.runbzr('revert --no-backup')
359
 
        self.runbzr('merge ../b -r last:1')
360
 
        self.check_file_contents('goodbye', 'quux')
361
 
        # Merging a branch pulls its revision into the tree
362
 
        a = Branch.open('.')
363
 
        b = Branch.open('../b')
364
 
        a.get_revision_xml(b.last_revision())
365
 
        self.log('pending merges: %s', a.pending_merges())
366
 
        assert a.pending_merges() == [b.last_revision()], "Assertion %s %s" \
367
 
            % (a.pending_merges(), b.last_patch())
368
 
        self.runbzr('commit -m merged')
369
 
        self.runbzr('merge ../b -r last:1')
370
 
        self.assertEqual(Branch.open('.').pending_merges(), [])
371
 
 
372
 
 
373
 
    def test_merge_with_missing_file(self):
374
 
        """Merge handles missing file conflicts"""
375
 
        os.mkdir('a')
376
 
        os.chdir('a')
377
 
        os.mkdir('sub')
378
 
        print >> file('sub/a.txt', 'wb'), "hello"
379
 
        print >> file('b.txt', 'wb'), "hello"
380
 
        print >> file('sub/c.txt', 'wb'), "hello"
381
 
        self.runbzr('init')
382
 
        self.runbzr('add')
383
 
        self.runbzr(('commit', '-m', 'added a'))
384
 
        self.runbzr('branch . ../b')
385
 
        print >> file('sub/a.txt', 'ab'), "there"
386
 
        print >> file('b.txt', 'ab'), "there"
387
 
        print >> file('sub/c.txt', 'ab'), "there"
388
 
        self.runbzr(('commit', '-m', 'Added there'))
389
 
        os.unlink('sub/a.txt')
390
 
        os.unlink('sub/c.txt')
391
 
        os.rmdir('sub')
392
 
        os.unlink('b.txt')
393
 
        self.runbzr(('commit', '-m', 'Removed a.txt'))
394
 
        os.chdir('../b')
395
 
        print >> file('sub/a.txt', 'ab'), "something"
396
 
        print >> file('b.txt', 'ab'), "something"
397
 
        print >> file('sub/c.txt', 'ab'), "something"
398
 
        self.runbzr(('commit', '-m', 'Modified a.txt'))
399
 
        self.runbzr('merge ../a/', retcode=1)
400
 
        assert os.path.exists('sub/a.txt.THIS')
401
 
        assert os.path.exists('sub/a.txt.BASE')
402
 
        os.chdir('../a')
403
 
        self.runbzr('merge ../b/', retcode=1)
404
 
        assert os.path.exists('sub/a.txt.OTHER')
405
 
        assert os.path.exists('sub/a.txt.BASE')
406
 
 
407
 
    def test_pull(self):
408
 
        """Pull changes from one branch to another."""
409
 
        os.mkdir('a')
410
 
        os.chdir('a')
411
 
 
412
 
        self.example_branch()
413
 
        self.runbzr('pull', retcode=1)
414
 
        self.runbzr('missing', retcode=1)
415
 
        self.runbzr('missing .')
416
 
        self.runbzr('missing')
417
 
        self.runbzr('pull')
418
 
        self.runbzr('pull /', retcode=1)
419
 
        self.runbzr('pull')
420
 
 
421
 
        os.chdir('..')
422
 
        self.runbzr('branch a b')
423
 
        os.chdir('b')
424
 
        self.runbzr('pull')
425
 
        os.mkdir('subdir')
426
 
        self.runbzr('add subdir')
427
 
        self.runbzr('commit -m blah --unchanged')
428
 
        os.chdir('../a')
429
 
        a = Branch.open('.')
430
 
        b = Branch.open('../b')
431
 
        assert a.revision_history() == b.revision_history()[:-1]
432
 
        self.runbzr('pull ../b')
433
 
        assert a.revision_history() == b.revision_history()
434
 
        self.runbzr('commit -m blah2 --unchanged')
435
 
        os.chdir('../b')
436
 
        self.runbzr('commit -m blah3 --unchanged')
437
 
        # no overwrite
438
 
        self.runbzr('pull ../a', retcode=1)
439
 
        os.chdir('..')
440
 
        self.runbzr('branch b overwriteme')
441
 
        os.chdir('overwriteme')
442
 
        self.runbzr('pull --overwrite ../a')
443
 
        overwritten = Branch.open('.')
444
 
        self.assertEqual(overwritten.revision_history(),
445
 
                         a.revision_history())
446
 
        os.chdir('../a')
447
 
        self.runbzr('merge ../b')
448
 
        self.runbzr('commit -m blah4 --unchanged')
449
 
        os.chdir('../b/subdir')
450
 
        self.runbzr('pull ../../a')
451
 
        assert a.revision_history()[-1] == b.revision_history()[-1]
452
 
        self.runbzr('commit -m blah5 --unchanged')
453
 
        self.runbzr('commit -m blah6 --unchanged')
454
 
        os.chdir('..')
455
 
        self.runbzr('pull ../a')
456
 
        os.chdir('../a')
457
 
        self.runbzr('commit -m blah7 --unchanged')
458
 
        self.runbzr('merge ../b')
459
 
        self.runbzr('commit -m blah8 --unchanged')
460
 
        self.runbzr('pull ../b')
461
 
        self.runbzr('pull ../b')
462
 
 
463
 
    def test_ls(self):
464
 
        """Test the abilities of 'bzr ls'"""
465
 
        bzr = self.runbzr
466
 
        def bzrout(*args, **kwargs):
467
 
            kwargs['backtick'] = True
468
 
            return self.runbzr(*args, **kwargs)
469
 
 
470
 
        def ls_equals(value, *args):
471
 
            out = self.runbzr(['ls'] + list(args), backtick=True)
472
 
            self.assertEquals(out, value)
473
 
 
474
 
        bzr('init')
475
 
        open('a', 'wb').write('hello\n')
476
 
 
477
 
        # Can't supply both
478
 
        bzr('ls --verbose --null', retcode=1)
479
 
 
480
 
        ls_equals('a\n')
481
 
        ls_equals('?        a\n', '--verbose')
482
 
        ls_equals('a\n', '--unknown')
483
 
        ls_equals('', '--ignored')
484
 
        ls_equals('', '--versioned')
485
 
        ls_equals('a\n', '--unknown', '--ignored', '--versioned')
486
 
        ls_equals('', '--ignored', '--versioned')
487
 
        ls_equals('a\0', '--null')
488
 
 
489
 
        bzr('add a')
490
 
        ls_equals('V        a\n', '--verbose')
491
 
        bzr('commit -m add')
492
 
        
493
 
        os.mkdir('subdir')
494
 
        ls_equals('V        a\n'
495
 
                  '?        subdir/\n'
496
 
                  , '--verbose')
497
 
        open('subdir/b', 'wb').write('b\n')
498
 
        bzr('add')
499
 
        ls_equals('V        a\n'
500
 
                  'V        subdir/\n'
501
 
                  'V        subdir/b\n'
502
 
                  , '--verbose')
503
 
        bzr('commit -m subdir')
504
 
 
505
 
        ls_equals('a\n'
506
 
                  'subdir\n'
507
 
                  , '--non-recursive')
508
 
 
509
 
        ls_equals('V        a\n'
510
 
                  'V        subdir/\n'
511
 
                  , '--verbose', '--non-recursive')
512
 
 
513
 
        # Check what happens in a sub-directory
514
 
        os.chdir('subdir')
515
 
        ls_equals('b\n')
516
 
        ls_equals('b\0'
517
 
                  , '--null')
518
 
        ls_equals('a\n'
519
 
                  'subdir\n'
520
 
                  'subdir/b\n'
521
 
                  , '--from-root')
522
 
        ls_equals('a\0'
523
 
                  'subdir\0'
524
 
                  'subdir/b\0'
525
 
                  , '--from-root', '--null')
526
 
        ls_equals('a\n'
527
 
                  'subdir\n'
528
 
                  , '--from-root', '--non-recursive')
529
 
 
530
 
        os.chdir('..')
531
 
 
532
 
        # Check what happens when we supply a specific revision
533
 
        ls_equals('a\n', '--revision', '1')
534
 
        ls_equals('V        a\n'
535
 
                  , '--verbose', '--revision', '1')
536
 
 
537
 
        os.chdir('subdir')
538
 
        ls_equals('', '--revision', '1')
539
 
 
540
 
        # Now try to do ignored files.
541
 
        os.chdir('..')
542
 
        open('blah.py', 'wb').write('unknown\n')
543
 
        open('blah.pyo', 'wb').write('ignored\n')
544
 
        ls_equals('a\n'
545
 
                  'blah.py\n'
546
 
                  'blah.pyo\n'
547
 
                  'subdir\n'
548
 
                  'subdir/b\n')
549
 
        ls_equals('V        a\n'
550
 
                  '?        blah.py\n'
551
 
                  'I        blah.pyo\n'
552
 
                  'V        subdir/\n'
553
 
                  'V        subdir/b\n'
554
 
                  , '--verbose')
555
 
        ls_equals('blah.pyo\n'
556
 
                  , '--ignored')
557
 
        ls_equals('blah.py\n'
558
 
                  , '--unknown')
559
 
        ls_equals('a\n'
560
 
                  'subdir\n'
561
 
                  'subdir/b\n'
562
 
                  , '--versioned')
563
 
 
564
 
 
565
 
    def test_locations(self):
566
 
        """Using and remembering different locations"""
567
 
        os.mkdir('a')
568
 
        os.chdir('a')
569
 
        self.runbzr('init')
570
 
        self.runbzr('commit -m unchanged --unchanged')
571
 
        self.runbzr('pull', retcode=1)
572
 
        self.runbzr('merge', retcode=1)
573
 
        self.runbzr('branch . ../b')
574
 
        os.chdir('../b')
575
 
        self.runbzr('pull')
576
 
        self.runbzr('branch . ../c')
577
 
        self.runbzr('pull ../c')
578
 
        self.runbzr('merge')
579
 
        os.chdir('../a')
580
 
        self.runbzr('pull ../b')
581
 
        self.runbzr('pull')
582
 
        self.runbzr('pull ../c')
583
 
        self.runbzr('branch ../c ../d')
584
 
        shutil.rmtree('../c')
585
 
        self.runbzr('pull')
586
 
        os.chdir('../b')
587
 
        self.runbzr('pull')
588
 
        os.chdir('../d')
589
 
        self.runbzr('pull', retcode=1)
590
 
        self.runbzr('pull ../a --remember')
591
 
        self.runbzr('pull')
592
 
        
593
 
    def test_add_reports(self):
594
 
        """add command prints the names of added files."""
595
 
        b = Branch.initialize('.')
596
 
        self.build_tree(['top.txt', 'dir/', 'dir/sub.txt'])
597
 
        out = self.run_bzr_captured(['add'], retcode = 0)[0]
598
 
        # the ordering is not defined at the moment
599
 
        results = sorted(out.rstrip('\n').split('\n'))
600
 
        self.assertEquals(['added dir',
601
 
                           'added dir'+os.sep+'sub.txt',
602
 
                           'added top.txt',],
603
 
                          results)
604
 
 
605
 
    def test_add_quiet_is(self):
606
 
        """add -q does not print the names of added files."""
607
 
        b = Branch.initialize('.')
608
 
        self.build_tree(['top.txt', 'dir/', 'dir/sub.txt'])
609
 
        out = self.run_bzr_captured(['add', '-q'], retcode = 0)[0]
610
 
        # the ordering is not defined at the moment
611
 
        results = sorted(out.rstrip('\n').split('\n'))
612
 
        self.assertEquals([''], results)
613
 
 
614
 
    def test_unknown_command(self):
615
 
        """Handling of unknown command."""
616
 
        out, err = self.run_bzr_captured(['fluffy-badger'],
617
 
                                         retcode=1)
618
 
        self.assertEquals(out, '')
619
 
        err.index('unknown command')
620
 
 
621
 
    def test_conflicts(self):
622
 
        """Handling of merge conflicts"""
623
 
        os.mkdir('base')
624
 
        os.chdir('base')
625
 
        file('hello', 'wb').write("hi world")
626
 
        file('answer', 'wb').write("42")
627
 
        self.runbzr('init')
628
 
        self.runbzr('add')
629
 
        self.runbzr('commit -m base')
630
 
        self.runbzr('branch . ../other')
631
 
        self.runbzr('branch . ../this')
632
 
        os.chdir('../other')
633
 
        file('hello', 'wb').write("Hello.")
634
 
        file('answer', 'wb').write("Is anyone there?")
635
 
        self.runbzr('commit -m other')
636
 
        os.chdir('../this')
637
 
        file('hello', 'wb').write("Hello, world")
638
 
        self.runbzr('mv answer question')
639
 
        file('question', 'wb').write("What do you get when you multiply six"
640
 
                                   "times nine?")
641
 
        self.runbzr('commit -m this')
642
 
        self.runbzr('merge ../other --show-base', retcode=1)
643
 
        conflict_text = file('hello').read()
644
 
        assert '<<<<<<<' in conflict_text
645
 
        assert '>>>>>>>' in conflict_text
646
 
        assert '=======' in conflict_text
647
 
        assert '|||||||' in conflict_text
648
 
        assert 'hi world' in conflict_text
649
 
        self.runbzr('revert')
650
 
        self.runbzr('resolve --all')
651
 
        self.runbzr('merge ../other', retcode=1)
652
 
        conflict_text = file('hello').read()
653
 
        assert '|||||||' not in conflict_text
654
 
        assert 'hi world' not in conflict_text
655
 
        result = self.runbzr('conflicts', backtick=1)
656
 
        self.assertEquals(result, "hello\nquestion\n")
657
 
        result = self.runbzr('status', backtick=1)
658
 
        assert "conflicts:\n  hello\n  question\n" in result, result
659
 
        self.runbzr('resolve hello')
660
 
        result = self.runbzr('conflicts', backtick=1)
661
 
        self.assertEquals(result, "question\n")
662
 
        self.runbzr('commit -m conflicts', retcode=1)
663
 
        self.runbzr('resolve --all')
664
 
        result = self.runbzr('conflicts', backtick=1)
665
 
        self.runbzr('commit -m conflicts')
666
 
        self.assertEquals(result, "")
667
 
 
668
 
    def test_resign(self):
669
 
        """Test re signing of data."""
670
 
        import bzrlib.gpg
671
 
        oldstrategy = bzrlib.gpg.GPGStrategy
672
 
        branch = Branch.initialize('.')
673
 
        branch.commit("base", allow_pointless=True, rev_id='A')
674
 
        try:
675
 
            # monkey patch gpg signing mechanism
676
 
            from bzrlib.testament import Testament
677
 
            bzrlib.gpg.GPGStrategy = bzrlib.gpg.LoopbackGPGStrategy
678
 
            self.runbzr('re-sign -r revid:A')
679
 
            self.assertEqual(Testament.from_revision(branch,'A').as_short_text(),
680
 
                             branch.revision_store.get('A', 'sig').read())
681
 
        finally:
682
 
            bzrlib.gpg.GPGStrategy = oldstrategy
683
 
            
684
 
    def test_resign_range(self):
685
 
        import bzrlib.gpg
686
 
        oldstrategy = bzrlib.gpg.GPGStrategy
687
 
        branch = Branch.initialize('.')
688
 
        branch.commit("base", allow_pointless=True, rev_id='A')
689
 
        branch.commit("base", allow_pointless=True, rev_id='B')
690
 
        branch.commit("base", allow_pointless=True, rev_id='C')
691
 
        try:
692
 
            # monkey patch gpg signing mechanism
693
 
            from bzrlib.testament import Testament
694
 
            bzrlib.gpg.GPGStrategy = bzrlib.gpg.LoopbackGPGStrategy
695
 
            self.runbzr('re-sign -r 1..')
696
 
            self.assertEqual(Testament.from_revision(branch,'A').as_short_text(),
697
 
                             branch.revision_store.get('A', 'sig').read())
698
 
            self.assertEqual(Testament.from_revision(branch,'B').as_short_text(),
699
 
                             branch.revision_store.get('B', 'sig').read())
700
 
            self.assertEqual(Testament.from_revision(branch,'C').as_short_text(),
701
 
                             branch.revision_store.get('C', 'sig').read())
702
 
        finally:
703
 
            bzrlib.gpg.GPGStrategy = oldstrategy
704
 
 
705
 
 
706
 
def listdir_sorted(dir):
707
 
    L = os.listdir(dir)
708
 
    L.sort()
709
 
    return L
710
 
 
711
 
 
712
 
class OldTests(ExternalBase):
713
 
    """old tests moved from ./testbzr."""
714
 
 
715
 
    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):
716
78
        from os import chdir, mkdir
717
79
        from os.path import exists
 
80
        import os
718
81
 
719
 
        runbzr = self.runbzr
720
 
        capture = self.capture
 
82
        runcmd = self.runcmd
 
83
        backtick = self.backtick
721
84
        progress = self.log
722
85
 
723
86
        progress("basic branch creation")
724
 
        mkdir('branch1')
 
87
        runcmd(['mkdir', 'branch1'])
725
88
        chdir('branch1')
726
 
        runbzr('init')
 
89
        runcmd('bzr init')
727
90
 
728
 
        self.assertEquals(capture('root').rstrip(),
 
91
        self.assertEquals(backtick('bzr root').rstrip(),
729
92
                          os.path.join(self.test_dir, 'branch1'))
730
93
 
731
94
        progress("status of new file")
734
97
        f.write('hello world!\n')
735
98
        f.close()
736
99
 
737
 
        self.assertEquals(capture('unknowns'), 'test.txt\n')
 
100
        out = backtick("bzr unknowns")
 
101
        self.assertEquals(out, 'test.txt\n')
738
102
 
739
 
        out = capture("status")
 
103
        out = backtick("bzr status")
740
104
        assert out == 'unknown:\n  test.txt\n'
741
105
 
742
 
        out = capture("status --all")
 
106
        out = backtick("bzr status --all")
743
107
        assert out == "unknown:\n  test.txt\n"
744
108
 
745
 
        out = capture("status test.txt --all")
 
109
        out = backtick("bzr status test.txt --all")
746
110
        assert out == "unknown:\n  test.txt\n"
747
111
 
748
112
        f = file('test2.txt', 'wt')
749
113
        f.write('goodbye cruel world...\n')
750
114
        f.close()
751
115
 
752
 
        out = capture("status test.txt")
 
116
        out = backtick("bzr status test.txt")
753
117
        assert out == "unknown:\n  test.txt\n"
754
118
 
755
 
        out = capture("status")
 
119
        out = backtick("bzr status")
756
120
        assert out == ("unknown:\n"
757
121
                       "  test.txt\n"
758
122
                       "  test2.txt\n")
760
124
        os.unlink('test2.txt')
761
125
 
762
126
        progress("command aliases")
763
 
        out = capture("st --all")
 
127
        out = backtick("bzr st --all")
764
128
        assert out == ("unknown:\n"
765
129
                       "  test.txt\n")
766
130
 
767
 
        out = capture("stat")
 
131
        out = backtick("bzr stat")
768
132
        assert out == ("unknown:\n"
769
133
                       "  test.txt\n")
770
134
 
771
135
        progress("command help")
772
 
        runbzr("help st")
773
 
        runbzr("help")
774
 
        runbzr("help commands")
775
 
        runbzr("help slartibartfast", 1)
 
136
        runcmd("bzr help st")
 
137
        runcmd("bzr help")
 
138
        runcmd("bzr help commands")
 
139
        runcmd("bzr help slartibartfast", 1)
776
140
 
777
 
        out = capture("help ci")
 
141
        out = backtick("bzr help ci")
778
142
        out.index('aliases: ')
779
143
 
780
144
        progress("can't rename unversioned file")
781
 
        runbzr("rename test.txt new-test.txt", 1)
 
145
        runcmd("bzr rename test.txt new-test.txt", 1)
782
146
 
783
147
        progress("adding a file")
784
148
 
785
 
        runbzr("add test.txt")
786
 
        assert capture("unknowns") == ''
787
 
        assert capture("status --all") == ("added:\n"
 
149
        runcmd("bzr add test.txt")
 
150
        assert backtick("bzr unknowns") == ''
 
151
        assert backtick("bzr status --all") == ("added:\n"
788
152
                                                "  test.txt\n")
789
153
 
790
154
        progress("rename newly-added file")
791
 
        runbzr("rename test.txt hello.txt")
 
155
        runcmd("bzr rename test.txt hello.txt")
792
156
        assert os.path.exists("hello.txt")
793
157
        assert not os.path.exists("test.txt")
794
158
 
795
 
        assert capture("revno") == '0\n'
 
159
        assert backtick("bzr revno") == '0\n'
796
160
 
797
161
        progress("add first revision")
798
 
        runbzr(['commit', '-m', 'add first revision'])
 
162
        runcmd(["bzr", "commit", "-m", 'add first revision'])
799
163
 
800
164
        progress("more complex renames")
801
165
        os.mkdir("sub1")
802
 
        runbzr("rename hello.txt sub1", 1)
803
 
        runbzr("rename hello.txt sub1/hello.txt", 1)
804
 
        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)
805
169
 
806
 
        runbzr("add sub1")
807
 
        runbzr("rename sub1 sub2")
808
 
        runbzr("move hello.txt sub2")
809
 
        self.assertEqual(capture("relpath sub2/hello.txt"),
810
 
                         os.path.join("sub2", "hello.txt\n"))
 
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")
811
174
 
812
175
        assert exists("sub2")
813
176
        assert exists("sub2/hello.txt")
814
177
        assert not exists("sub1")
815
178
        assert not exists("hello.txt")
816
179
 
817
 
        runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
 
180
        runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
818
181
 
819
182
        mkdir("sub1")
820
 
        runbzr('add sub1')
821
 
        runbzr('move sub2/hello.txt sub1')
 
183
        runcmd('bzr add sub1')
 
184
        runcmd('bzr move sub2/hello.txt sub1')
822
185
        assert not exists('sub2/hello.txt')
823
186
        assert exists('sub1/hello.txt')
824
 
        runbzr('move sub2 sub1')
 
187
        runcmd('bzr move sub2 sub1')
825
188
        assert not exists('sub2')
826
189
        assert exists('sub1/sub2')
827
190
 
828
 
        runbzr(['commit', '-m', 'rename nested subdirectories'])
 
191
        runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
829
192
 
830
193
        chdir('sub1/sub2')
831
 
        self.assertEquals(capture('root')[:-1],
 
194
        self.assertEquals(backtick('bzr root')[:-1],
832
195
                          os.path.join(self.test_dir, 'branch1'))
833
 
        runbzr('move ../hello.txt .')
 
196
        runcmd('bzr move ../hello.txt .')
834
197
        assert exists('./hello.txt')
835
 
        self.assertEquals(capture('relpath hello.txt'),
836
 
                          os.path.join('sub1', 'sub2', 'hello.txt') + '\n')
837
 
        assert capture('relpath ../../sub1/sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
838
 
        runbzr(['commit', '-m', 'move to parent directory'])
 
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'])
839
201
        chdir('..')
840
 
        assert capture('relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
 
202
        assert backtick('bzr relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
841
203
 
842
 
        runbzr('move sub2/hello.txt .')
 
204
        runcmd('bzr move sub2/hello.txt .')
843
205
        assert exists('hello.txt')
844
206
 
845
207
        f = file('hello.txt', 'wt')
847
209
        f.close()
848
210
 
849
211
        f = file('msg.tmp', 'wt')
850
 
        f.write('this is my new commit\nand it has multiple lines, for fun')
 
212
        f.write('this is my new commit\n')
851
213
        f.close()
852
214
 
853
 
        runbzr('commit -F msg.tmp')
854
 
 
855
 
        assert capture('revno') == '5\n'
856
 
        runbzr('export -r 5 export-5.tmp')
857
 
        runbzr('export export.tmp')
858
 
 
859
 
        runbzr('log')
860
 
        runbzr('log -v')
861
 
        runbzr('log -v --forward')
862
 
        runbzr('log -m', retcode=1)
863
 
        log_out = capture('log -m commit')
864
 
        assert "this is my new commit\n  and" in log_out
865
 
        assert "rename nested" not in log_out
866
 
        assert 'revision-id' not in log_out
867
 
        assert 'revision-id' in capture('log --show-ids -m commit')
868
 
 
869
 
        log_out = capture('log --line')
870
 
        for line in log_out.splitlines():
871
 
            assert len(line) <= 79, len(line)
872
 
        assert "this is my new commit and" 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
 
873
224
 
874
225
 
875
226
        progress("file with spaces in name")
876
227
        mkdir('sub directory')
877
228
        file('sub directory/file with spaces ', 'wt').write('see how this works\n')
878
 
        runbzr('add .')
879
 
        runbzr('diff')
880
 
        runbzr('commit -m add-spaces')
881
 
        runbzr('check')
882
 
 
883
 
        runbzr('log')
884
 
        runbzr('log --forward')
885
 
 
886
 
        runbzr('info')
887
 
 
888
 
        if has_symlinks():
889
 
            progress("symlinks")
890
 
            mkdir('symlinks')
891
 
            chdir('symlinks')
892
 
            runbzr('init')
893
 
            os.symlink("NOWHERE1", "link1")
894
 
            runbzr('add link1')
895
 
            assert self.capture('unknowns') == ''
896
 
            runbzr(['commit', '-m', '1: added symlink link1'])
897
 
    
898
 
            mkdir('d1')
899
 
            runbzr('add d1')
900
 
            assert self.capture('unknowns') == ''
901
 
            os.symlink("NOWHERE2", "d1/link2")
902
 
            assert self.capture('unknowns') == 'd1/link2\n'
903
 
            # is d1/link2 found when adding d1
904
 
            runbzr('add d1')
905
 
            assert self.capture('unknowns') == ''
906
 
            os.symlink("NOWHERE3", "d1/link3")
907
 
            assert self.capture('unknowns') == 'd1/link3\n'
908
 
            runbzr(['commit', '-m', '2: added dir, symlink'])
909
 
    
910
 
            runbzr('rename d1 d2')
911
 
            runbzr('move d2/link2 .')
912
 
            runbzr('move link1 d2')
913
 
            assert os.readlink("./link2") == "NOWHERE2"
914
 
            assert os.readlink("d2/link1") == "NOWHERE1"
915
 
            runbzr('add d2/link3')
916
 
            runbzr('diff')
917
 
            runbzr(['commit', '-m', '3: rename of dir, move symlinks, add link3'])
918
 
    
919
 
            os.unlink("link2")
920
 
            os.symlink("TARGET 2", "link2")
921
 
            os.unlink("d2/link1")
922
 
            os.symlink("TARGET 1", "d2/link1")
923
 
            runbzr('diff')
924
 
            assert self.capture("relpath d2/link1") == "d2/link1\n"
925
 
            runbzr(['commit', '-m', '4: retarget of two links'])
926
 
    
927
 
            runbzr('remove d2/link1')
928
 
            assert self.capture('unknowns') == 'd2/link1\n'
929
 
            runbzr(['commit', '-m', '5: remove d2/link1'])
930
 
            # try with the rm alias
931
 
            runbzr('add d2/link1')
932
 
            runbzr(['commit', '-m', '6: add d2/link1'])
933
 
            runbzr('rm d2/link1')
934
 
            assert self.capture('unknowns') == 'd2/link1\n'
935
 
            runbzr(['commit', '-m', '7: remove d2/link1'])
936
 
    
937
 
            os.mkdir("d1")
938
 
            runbzr('add d1')
939
 
            runbzr('rename d2/link3 d1/link3new')
940
 
            assert self.capture('unknowns') == 'd2/link1\n'
941
 
            runbzr(['commit', '-m', '8: remove d2/link1, move/rename link3'])
942
 
            
943
 
            runbzr(['check'])
944
 
            
945
 
            runbzr(['export', '-r', '1', 'exp1.tmp'])
946
 
            chdir("exp1.tmp")
947
 
            assert listdir_sorted(".") == [ "link1" ]
948
 
            assert os.readlink("link1") == "NOWHERE1"
949
 
            chdir("..")
950
 
            
951
 
            runbzr(['export', '-r', '2', 'exp2.tmp'])
952
 
            chdir("exp2.tmp")
953
 
            assert listdir_sorted(".") == [ "d1", "link1" ]
954
 
            chdir("..")
955
 
            
956
 
            runbzr(['export', '-r', '3', 'exp3.tmp'])
957
 
            chdir("exp3.tmp")
958
 
            assert listdir_sorted(".") == [ "d2", "link2" ]
959
 
            assert listdir_sorted("d2") == [ "link1", "link3" ]
960
 
            assert os.readlink("d2/link1") == "NOWHERE1"
961
 
            assert os.readlink("link2")    == "NOWHERE2"
962
 
            chdir("..")
963
 
            
964
 
            runbzr(['export', '-r', '4', 'exp4.tmp'])
965
 
            chdir("exp4.tmp")
966
 
            assert listdir_sorted(".") == [ "d2", "link2" ]
967
 
            assert os.readlink("d2/link1") == "TARGET 1"
968
 
            assert os.readlink("link2")    == "TARGET 2"
969
 
            assert listdir_sorted("d2") == [ "link1", "link3" ]
970
 
            chdir("..")
971
 
            
972
 
            runbzr(['export', '-r', '5', 'exp5.tmp'])
973
 
            chdir("exp5.tmp")
974
 
            assert listdir_sorted(".") == [ "d2", "link2" ]
975
 
            assert os.path.islink("link2")
976
 
            assert listdir_sorted("d2")== [ "link3" ]
977
 
            chdir("..")
978
 
            
979
 
            runbzr(['export', '-r', '8', 'exp6.tmp'])
980
 
            chdir("exp6.tmp")
981
 
            self.assertEqual(listdir_sorted("."), [ "d1", "d2", "link2"])
982
 
            assert listdir_sorted("d1") == [ "link3new" ]
983
 
            assert listdir_sorted("d2") == []
984
 
            assert os.readlink("d1/link3new") == "NOWHERE3"
985
 
            chdir("..")
986
 
        else:
987
 
            progress("skipping symlink tests")
988
 
 
989
 
 
990
 
class HttpTests(TestCaseWithWebserver):
991
 
    """Test bzr ui commands against remote branches."""
992
 
 
993
 
    def test_branch(self):
994
 
        os.mkdir('from')
995
 
        branch = Branch.initialize('from')
996
 
        branch.commit('empty commit for nonsense', allow_pointless=True)
997
 
        url = self.get_remote_url('from')
998
 
        self.run_bzr('branch', url, 'to')
999
 
        branch = Branch.open('to')
1000
 
        self.assertEqual(1, len(branch.revision_history()))
1001
 
 
1002
 
    def test_log(self):
1003
 
        self.build_tree(['branch/', 'branch/file'])
1004
 
        branch = Branch.initialize('branch')
1005
 
        branch.add(['file'])
1006
 
        branch.commit('add file', rev_id='A')
1007
 
        url = self.get_remote_url('branch/file')
1008
 
        output = self.capture('log %s' % url)
1009
 
        self.assertEqual(7, len(output.split('\n')))
1010
 
        
1011
 
 
1012
 
 
1013
 
 
 
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
class RevertCommand(InTempDir):
 
349
    def runTest(self):
 
350
        self.runcmd('bzr init')
 
351
 
 
352
        file('hello', 'wt').write('foo')
 
353
        self.runcmd('bzr add hello')
 
354
        self.runcmd('bzr commit -m setup hello')
 
355
        
 
356
        file('hello', 'wt').write('bar')
 
357
        self.runcmd('bzr revert hello')
 
358
        self.check_file_contents('hello', 'foo')
 
359
 
 
360
    
 
361
        
 
362
 
 
363
 
 
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.
 
368
TEST_CLASSES = [TestVersion,
 
369
                InitBranch,
 
370
                HelpCommands,
 
371
                UserIdentity,
 
372
                InvalidCommands,
 
373
                RevertCommand,
 
374
                OldTests,
 
375
                ]