~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/blackbox.py

todo

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
 
27
27
from cStringIO import StringIO
28
28
import os
29
 
import re
30
29
import shutil
31
30
import sys
 
31
import os
32
32
 
33
33
from bzrlib.branch import Branch
34
34
from bzrlib.clone import copy_branch
111
111
        self.runbzr(['add', 'foo.c'])
112
112
        self.runbzr(["commit", "-m", ""] , retcode=1) 
113
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
114
    def test_ignore_patterns(self):
136
115
        from bzrlib.branch import Branch
137
116
        
194
173
        self.runbzr('commit -m f')
195
174
        os.unlink('symlink')
196
175
        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
176
        
204
177
        file('hello', 'wt').write('xyz')
205
178
        self.runbzr('commit -m xyz hello')
288
261
        self.example_branch()
289
262
        file('hello', 'wt').write('hello world!')
290
263
        self.runbzr('commit -m fixing hello')
291
 
        output = self.runbzr('diff -r 2..3', backtick=1, retcode=1)
 
264
        output = self.runbzr('diff -r 2..3', backtick=1)
292
265
        self.assert_('\n+hello world!' in output)
293
 
        output = self.runbzr('diff -r last:3..last:1', backtick=1, retcode=1)
 
266
        output = self.runbzr('diff -r last:3..last:1', backtick=1)
294
267
        self.assert_('\n+baz' in output)
295
268
 
296
269
    def test_diff_branches(self):
303
276
        branch2 = Branch.open('branch2')
304
277
        branch2.commit('update file')
305
278
        # should open branch1 and diff against branch2, 
306
 
        output = self.run_bzr_captured(['diff', '-r', 'branch:branch2', 
307
 
                                        'branch1'],
308
 
                                       retcode=1)
 
279
        output = self.run_bzr_captured(['diff', '-r', 'branch:branch2', 'branch1'])
309
280
        self.assertEquals(("=== modified file 'file'\n"
310
281
                           "--- file\n"
311
282
                           "+++ file\n"
321
292
        self.example_branch()
322
293
        os.chdir('..')
323
294
        self.runbzr('branch a b')
324
 
        self.assertFileEqual('b\n', 'b/.bzr/branch-name')
325
295
        self.runbzr('branch a c -r 1')
326
296
        os.chdir('b')
327
297
        self.runbzr('commit -m foo --unchanged')
350
320
        # We can't merge when there are in-tree changes
351
321
        self.runbzr('merge ../b', retcode=1)
352
322
        self.runbzr(['commit', '-m', "Like an epidemic of u's"])
353
 
        self.runbzr('merge ../b -r last:1..last:1 --merge-type blooof',
354
 
                    retcode=1)
355
 
        self.runbzr('merge ../b -r last:1..last:1 --merge-type merge3')
356
 
        self.runbzr('revert --no-backup')
357
 
        self.runbzr('merge ../b -r last:1..last:1 --merge-type weave')
358
 
        self.runbzr('revert --no-backup')
359
 
        self.runbzr('merge ../b -r last:1..last:1 --reprocess')
360
 
        self.runbzr('revert --no-backup')
361
 
        self.runbzr('merge ../b -r last:1')
 
323
        self.runbzr('merge ../b')
362
324
        self.check_file_contents('goodbye', 'quux')
363
325
        # Merging a branch pulls its revision into the tree
364
326
        a = Branch.open('.')
365
327
        b = Branch.open('../b')
366
328
        a.get_revision_xml(b.last_revision())
367
329
        self.log('pending merges: %s', a.pending_merges())
368
 
        assert a.pending_merges() == [b.last_revision()], "Assertion %s %s" \
369
 
            % (a.pending_merges(), b.last_patch())
370
 
        self.runbzr('commit -m merged')
371
 
        self.runbzr('merge ../b -r last:1')
372
 
        self.assertEqual(Branch.open('.').pending_merges(), [])
373
 
 
 
330
        #        assert a.pending_merges() == [b.last_revision()], "Assertion %s %s" \
 
331
        #        % (a.pending_merges(), b.last_patch())
374
332
 
375
333
    def test_merge_with_missing_file(self):
376
334
        """Merge handles missing file conflicts"""
398
356
        print >> file('b.txt', 'ab'), "something"
399
357
        print >> file('sub/c.txt', 'ab'), "something"
400
358
        self.runbzr(('commit', '-m', 'Modified a.txt'))
401
 
        self.runbzr('merge ../a/', retcode=1)
 
359
        self.runbzr('merge ../a/')
402
360
        assert os.path.exists('sub/a.txt.THIS')
403
361
        assert os.path.exists('sub/a.txt.BASE')
404
362
        os.chdir('../a')
405
 
        self.runbzr('merge ../b/', retcode=1)
 
363
        self.runbzr('merge ../b/')
406
364
        assert os.path.exists('sub/a.txt.OTHER')
407
365
        assert os.path.exists('sub/a.txt.BASE')
408
366
 
436
394
        self.runbzr('commit -m blah2 --unchanged')
437
395
        os.chdir('../b')
438
396
        self.runbzr('commit -m blah3 --unchanged')
439
 
        # no overwrite
440
397
        self.runbzr('pull ../a', retcode=1)
441
 
        os.chdir('..')
442
 
        self.runbzr('branch b overwriteme')
443
 
        os.chdir('overwriteme')
444
 
        self.runbzr('pull --overwrite ../a')
445
 
        overwritten = Branch.open('.')
446
 
        self.assertEqual(overwritten.revision_history(),
447
 
                         a.revision_history())
 
398
        print "DECIDE IF PULL CAN CONVERGE, blackbox.py"
 
399
        return
448
400
        os.chdir('../a')
449
401
        self.runbzr('merge ../b')
450
402
        self.runbzr('commit -m blah4 --unchanged')
462
414
        self.runbzr('pull ../b')
463
415
        self.runbzr('pull ../b')
464
416
 
465
 
    def test_ls(self):
466
 
        """Test the abilities of 'bzr ls'"""
467
 
        bzr = self.runbzr
468
 
        def bzrout(*args, **kwargs):
469
 
            kwargs['backtick'] = True
470
 
            return self.runbzr(*args, **kwargs)
471
 
 
472
 
        def ls_equals(value, *args):
473
 
            out = self.runbzr(['ls'] + list(args), backtick=True)
474
 
            self.assertEquals(out, value)
475
 
 
476
 
        bzr('init')
477
 
        open('a', 'wb').write('hello\n')
478
 
 
479
 
        # Can't supply both
480
 
        bzr('ls --verbose --null', retcode=1)
481
 
 
482
 
        ls_equals('a\n')
483
 
        ls_equals('?        a\n', '--verbose')
484
 
        ls_equals('a\n', '--unknown')
485
 
        ls_equals('', '--ignored')
486
 
        ls_equals('', '--versioned')
487
 
        ls_equals('a\n', '--unknown', '--ignored', '--versioned')
488
 
        ls_equals('', '--ignored', '--versioned')
489
 
        ls_equals('a\0', '--null')
490
 
 
491
 
        bzr('add a')
492
 
        ls_equals('V        a\n', '--verbose')
493
 
        bzr('commit -m add')
494
 
        
495
 
        os.mkdir('subdir')
496
 
        ls_equals('V        a\n'
497
 
                  '?        subdir/\n'
498
 
                  , '--verbose')
499
 
        open('subdir/b', 'wb').write('b\n')
500
 
        bzr('add')
501
 
        ls_equals('V        a\n'
502
 
                  'V        subdir/\n'
503
 
                  'V        subdir/b\n'
504
 
                  , '--verbose')
505
 
        bzr('commit -m subdir')
506
 
 
507
 
        ls_equals('a\n'
508
 
                  'subdir\n'
509
 
                  , '--non-recursive')
510
 
 
511
 
        ls_equals('V        a\n'
512
 
                  'V        subdir/\n'
513
 
                  , '--verbose', '--non-recursive')
514
 
 
515
 
        # Check what happens in a sub-directory
516
 
        os.chdir('subdir')
517
 
        ls_equals('b\n')
518
 
        ls_equals('b\0'
519
 
                  , '--null')
520
 
        ls_equals('a\n'
521
 
                  'subdir\n'
522
 
                  'subdir/b\n'
523
 
                  , '--from-root')
524
 
        ls_equals('a\0'
525
 
                  'subdir\0'
526
 
                  'subdir/b\0'
527
 
                  , '--from-root', '--null')
528
 
        ls_equals('a\n'
529
 
                  'subdir\n'
530
 
                  , '--from-root', '--non-recursive')
531
 
 
532
 
        os.chdir('..')
533
 
 
534
 
        # Check what happens when we supply a specific revision
535
 
        ls_equals('a\n', '--revision', '1')
536
 
        ls_equals('V        a\n'
537
 
                  , '--verbose', '--revision', '1')
538
 
 
539
 
        os.chdir('subdir')
540
 
        ls_equals('', '--revision', '1')
541
 
 
542
 
        # Now try to do ignored files.
543
 
        os.chdir('..')
544
 
        open('blah.py', 'wb').write('unknown\n')
545
 
        open('blah.pyo', 'wb').write('ignored\n')
546
 
        ls_equals('a\n'
547
 
                  'blah.py\n'
548
 
                  'blah.pyo\n'
549
 
                  'subdir\n'
550
 
                  'subdir/b\n')
551
 
        ls_equals('V        a\n'
552
 
                  '?        blah.py\n'
553
 
                  'I        blah.pyo\n'
554
 
                  'V        subdir/\n'
555
 
                  'V        subdir/b\n'
556
 
                  , '--verbose')
557
 
        ls_equals('blah.pyo\n'
558
 
                  , '--ignored')
559
 
        ls_equals('blah.py\n'
560
 
                  , '--unknown')
561
 
        ls_equals('a\n'
562
 
                  'subdir\n'
563
 
                  'subdir/b\n'
564
 
                  , '--versioned')
565
 
 
566
 
 
567
417
    def test_locations(self):
568
418
        """Using and remembering different locations"""
569
419
        os.mkdir('a')
604
454
                           'added top.txt',],
605
455
                          results)
606
456
 
607
 
    def test_add_quiet_is(self):
608
 
        """add -q does not print the names of added files."""
609
 
        b = Branch.initialize('.')
610
 
        self.build_tree(['top.txt', 'dir/', 'dir/sub.txt'])
611
 
        out = self.run_bzr_captured(['add', '-q'], retcode = 0)[0]
612
 
        # the ordering is not defined at the moment
613
 
        results = sorted(out.rstrip('\n').split('\n'))
614
 
        self.assertEquals([''], results)
615
 
 
616
457
    def test_unknown_command(self):
617
458
        """Handling of unknown command."""
618
459
        out, err = self.run_bzr_captured(['fluffy-badger'],
641
482
        file('question', 'wb').write("What do you get when you multiply six"
642
483
                                   "times nine?")
643
484
        self.runbzr('commit -m this')
644
 
        self.runbzr('merge ../other --show-base', retcode=1)
645
 
        conflict_text = file('hello').read()
646
 
        assert '<<<<<<<' in conflict_text
647
 
        assert '>>>>>>>' in conflict_text
648
 
        assert '=======' in conflict_text
649
 
        assert '|||||||' in conflict_text
650
 
        assert 'hi world' in conflict_text
651
 
        self.runbzr('revert')
652
 
        self.runbzr('resolve --all')
653
 
        self.runbzr('merge ../other', retcode=1)
654
 
        conflict_text = file('hello').read()
655
 
        assert '|||||||' not in conflict_text
656
 
        assert 'hi world' not in conflict_text
 
485
        self.runbzr('merge ../other')
657
486
        result = self.runbzr('conflicts', backtick=1)
658
487
        self.assertEquals(result, "hello\nquestion\n")
659
488
        result = self.runbzr('status', backtick=1)
667
496
        self.runbzr('commit -m conflicts')
668
497
        self.assertEquals(result, "")
669
498
 
670
 
    def test_resign(self):
671
 
        """Test re signing of data."""
672
 
        import bzrlib.gpg
673
 
        oldstrategy = bzrlib.gpg.GPGStrategy
674
 
        branch = Branch.initialize('.')
675
 
        branch.commit("base", allow_pointless=True, rev_id='A')
676
 
        try:
677
 
            # monkey patch gpg signing mechanism
678
 
            from bzrlib.testament import Testament
679
 
            bzrlib.gpg.GPGStrategy = bzrlib.gpg.LoopbackGPGStrategy
680
 
            self.runbzr('re-sign -r revid:A')
681
 
            self.assertEqual(Testament.from_revision(branch,'A').as_short_text(),
682
 
                             branch.revision_store.get('A', 'sig').read())
683
 
        finally:
684
 
            bzrlib.gpg.GPGStrategy = oldstrategy
685
 
            
686
 
    def test_resign_range(self):
687
 
        import bzrlib.gpg
688
 
        oldstrategy = bzrlib.gpg.GPGStrategy
689
 
        branch = Branch.initialize('.')
690
 
        branch.commit("base", allow_pointless=True, rev_id='A')
691
 
        branch.commit("base", allow_pointless=True, rev_id='B')
692
 
        branch.commit("base", allow_pointless=True, rev_id='C')
693
 
        try:
694
 
            # monkey patch gpg signing mechanism
695
 
            from bzrlib.testament import Testament
696
 
            bzrlib.gpg.GPGStrategy = bzrlib.gpg.LoopbackGPGStrategy
697
 
            self.runbzr('re-sign -r 1..')
698
 
            self.assertEqual(Testament.from_revision(branch,'A').as_short_text(),
699
 
                             branch.revision_store.get('A', 'sig').read())
700
 
            self.assertEqual(Testament.from_revision(branch,'B').as_short_text(),
701
 
                             branch.revision_store.get('B', 'sig').read())
702
 
            self.assertEqual(Testament.from_revision(branch,'C').as_short_text(),
703
 
                             branch.revision_store.get('C', 'sig').read())
704
 
        finally:
705
 
            bzrlib.gpg.GPGStrategy = oldstrategy
706
 
 
707
 
    def test_push(self):
708
 
        # create a source branch
709
 
        os.mkdir('my-branch')
710
 
        os.chdir('my-branch')
711
 
        self.example_branch()
712
 
 
713
 
        # with no push target, fail
714
 
        self.runbzr('push', retcode=1)
715
 
        # with an explicit target work
716
 
        self.runbzr('push ../output-branch')
717
 
        # with an implicit target work
718
 
        self.runbzr('push')
719
 
        # nothing missing
720
 
        self.runbzr('missing ../output-branch')
721
 
        # advance this branch
722
 
        self.runbzr('commit --unchanged -m unchanged')
723
 
 
724
 
        os.chdir('../output-branch')
725
 
        # should be a diff as we have not pushed the tree
726
 
        self.runbzr('diff', retcode=1)
727
 
        self.runbzr('revert')
728
 
        # but not now.
729
 
        self.runbzr('diff')
730
 
        # diverge the branches
731
 
        self.runbzr('commit --unchanged -m unchanged')
732
 
        os.chdir('../my-branch')
733
 
        # cannot push now
734
 
        self.runbzr('push', retcode=1)
735
 
        # and there are difference
736
 
        self.runbzr('missing ../output-branch', retcode=1)
737
 
        # but we can force a push
738
 
        self.runbzr('push --overwrite')
739
 
        # nothing missing
740
 
        self.runbzr('missing ../output-branch')
741
 
 
742
 
 
743
499
def listdir_sorted(dir):
744
500
    L = os.listdir(dir)
745
501
    L.sort()
843
599
        runbzr("add sub1")
844
600
        runbzr("rename sub1 sub2")
845
601
        runbzr("move hello.txt sub2")
846
 
        self.assertEqual(capture("relpath sub2/hello.txt"),
847
 
                         os.path.join("sub2", "hello.txt\n"))
 
602
        assert capture("relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
848
603
 
849
604
        assert exists("sub2")
850
605
        assert exists("sub2/hello.txt")
884
639
        f.close()
885
640
 
886
641
        f = file('msg.tmp', 'wt')
887
 
        f.write('this is my new commit\nand it has multiple lines, for fun')
 
642
        f.write('this is my new commit\n')
888
643
        f.close()
889
644
 
890
645
        runbzr('commit -F msg.tmp')
898
653
        runbzr('log -v --forward')
899
654
        runbzr('log -m', retcode=1)
900
655
        log_out = capture('log -m commit')
901
 
        assert "this is my new commit\n  and" in log_out
 
656
        assert "this is my new commit" in log_out
902
657
        assert "rename nested" not in log_out
903
658
        assert 'revision-id' not in log_out
904
659
        assert 'revision-id' in capture('log --show-ids -m commit')
905
660
 
906
 
        log_out = capture('log --line')
907
 
        for line in log_out.splitlines():
908
 
            assert len(line) <= 79, len(line)
909
 
        assert "this is my new commit and" in log_out
910
 
 
911
661
 
912
662
        progress("file with spaces in name")
913
663
        mkdir('sub directory')
914
664
        file('sub directory/file with spaces ', 'wt').write('see how this works\n')
915
665
        runbzr('add .')
916
 
        runbzr('diff', retcode=1)
 
666
        runbzr('diff')
917
667
        runbzr('commit -m add-spaces')
918
668
        runbzr('check')
919
669
 
950
700
            assert os.readlink("./link2") == "NOWHERE2"
951
701
            assert os.readlink("d2/link1") == "NOWHERE1"
952
702
            runbzr('add d2/link3')
953
 
            runbzr('diff', retcode=1)
 
703
            runbzr('diff')
954
704
            runbzr(['commit', '-m', '3: rename of dir, move symlinks, add link3'])
955
705
    
956
706
            os.unlink("link2")
957
707
            os.symlink("TARGET 2", "link2")
958
708
            os.unlink("d2/link1")
959
709
            os.symlink("TARGET 1", "d2/link1")
960
 
            runbzr('diff', retcode=1)
 
710
            runbzr('diff')
961
711
            assert self.capture("relpath d2/link1") == "d2/link1\n"
962
712
            runbzr(['commit', '-m', '4: retarget of two links'])
963
713
    
1035
785
        self.run_bzr('branch', url, 'to')
1036
786
        branch = Branch.open('to')
1037
787
        self.assertEqual(1, len(branch.revision_history()))
1038
 
 
1039
 
    def test_log(self):
1040
 
        self.build_tree(['branch/', 'branch/file'])
1041
 
        branch = Branch.initialize('branch')
1042
 
        branch.add(['file'])
1043
 
        branch.commit('add file', rev_id='A')
1044
 
        url = self.get_remote_url('branch/file')
1045
 
        output = self.capture('log %s' % url)
1046
 
        self.assertEqual(7, len(output.split('\n')))
1047
 
        
1048
 
 
1049
 
 
1050