~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_commit.py

  • Committer: Tarmac
  • Author(s): Vincent Ladeuil
  • Date: 2017-01-30 14:42:05 UTC
  • mfrom: (6620.1.1 trunk)
  • Revision ID: tarmac-20170130144205-r8fh2xpmiuxyozpv
Merge  2.7 into trunk including fix for bug #1657238 [r=vila]

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2011 Canonical Ltd
 
1
# Copyright (C) 2006-2012, 2016 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
29
29
    osutils,
30
30
    ignores,
31
31
    msgeditor,
32
 
    tests,
33
32
    )
34
 
from bzrlib.bzrdir import BzrDir
 
33
from bzrlib.controldir import ControlDir
35
34
from bzrlib.tests import (
36
 
    probe_bad_non_ascii,
37
35
    test_foreign,
38
 
    TestSkipped,
39
 
    UnicodeFilenameFeature,
 
36
    features,
40
37
    )
41
38
from bzrlib.tests import TestCaseWithTransport
 
39
from bzrlib.tests.matchers import ContainsNoVfsCalls
42
40
 
43
41
 
44
42
class TestCommit(TestCaseWithTransport):
119
117
    def prepare_simple_history(self):
120
118
        """Prepare and return a working tree with one commit of one file"""
121
119
        # Commit with modified file should say so
122
 
        wt = BzrDir.create_standalone_workingtree('.')
 
120
        wt = ControlDir.create_standalone_workingtree('.')
123
121
        self.build_tree(['hello.txt', 'extra.txt'])
124
122
        wt.add(['hello.txt'])
125
123
        wt.commit(message='added')
138
136
    def test_unicode_commit_message_is_filename(self):
139
137
        """Unicode commit message same as a filename (Bug #563646).
140
138
        """
141
 
        self.requireFeature(UnicodeFilenameFeature)
 
139
        self.requireFeature(features.UnicodeFilenameFeature)
142
140
        file_name = u'\N{euro sign}'
143
141
        self.run_bzr(['init'])
144
 
        open(file_name, 'w').write('hello world')
 
142
        with open(file_name, 'w') as f: f.write('hello world')
145
143
        self.run_bzr(['add'])
146
144
        out, err = self.run_bzr(['commit', '-m', file_name])
147
145
        reflags = re.MULTILINE|re.DOTALL|re.UNICODE
159
157
        try:
160
158
            osutils.get_terminal_encoding = lambda trace=None: 'ascii'
161
159
            file_name = u'foo\u1234'
162
 
            open(file_name, 'w').write('hello world')
 
160
            with open(file_name, 'w') as f: f.write('hello world')
163
161
            self.run_bzr(['add'])
164
162
            out, err = self.run_bzr(['commit', '-m', file_name])
165
163
            reflags = re.MULTILINE|re.DOTALL|re.UNICODE
170
168
        finally:
171
169
            osutils.get_terminal_encoding = default_get_terminal_enc
172
170
 
 
171
    def test_non_ascii_file_unversioned_utf8(self):
 
172
        self.requireFeature(features.UnicodeFilenameFeature)
 
173
        tree = self.make_branch_and_tree(".")
 
174
        self.build_tree(["f"])
 
175
        tree.add(["f"])
 
176
        out, err = self.run_bzr(["commit", "-m", "Wrong filename", u"\xa7"],
 
177
            encoding="utf-8", retcode=3)
 
178
        self.assertContainsRe(err, "(?m)not versioned: \"\xc2\xa7\"$")
 
179
 
 
180
    def test_non_ascii_file_unversioned_iso_8859_5(self):
 
181
        self.requireFeature(features.UnicodeFilenameFeature)
 
182
        tree = self.make_branch_and_tree(".")
 
183
        self.build_tree(["f"])
 
184
        tree.add(["f"])
 
185
        out, err = self.run_bzr(["commit", "-m", "Wrong filename", u"\xa7"],
 
186
            encoding="iso-8859-5", retcode=3)
 
187
        self.expectFailure("Error messages are always written as UTF-8",
 
188
            self.assertNotContainsString, err, "\xc2\xa7")
 
189
        self.assertContainsRe(err, "(?m)not versioned: \"\xfd\"$")
 
190
 
173
191
    def test_warn_about_forgotten_commit_message(self):
174
192
        """Test that the lack of -m parameter is caught"""
175
193
        wt = self.make_branch_and_tree('.')
207
225
    def test_verbose_commit_with_unknown(self):
208
226
        """Unknown files should not be listed by default in verbose output"""
209
227
        # Is that really the best policy?
210
 
        wt = BzrDir.create_standalone_workingtree('.')
 
228
        wt = ControlDir.create_standalone_workingtree('.')
211
229
        self.build_tree(['hello.txt', 'extra.txt'])
212
230
        wt.add(['hello.txt'])
213
231
        out,err = self.run_bzr('commit -m added')
310
328
        finally:
311
329
            other_tree.unlock()
312
330
        this_tree.merge_from_branch(other_tree.branch)
313
 
        os.chdir('this')
314
 
        out,err = self.run_bzr('commit -m added')
 
331
        out, err = self.run_bzr('commit -m added', working_dir='this')
315
332
        self.assertEqual('', out)
316
333
        self.assertEqual(set([
317
 
            'Committing to: %s/' % osutils.getcwd(),
 
334
            'Committing to: %s/' % osutils.pathjoin(osutils.getcwd(), 'this'),
318
335
            'modified filetomodify',
319
336
            'added newdir',
320
337
            'added newfile',
332
349
        tree = self.make_branch_and_tree('.')
333
350
        self.build_tree_contents([('foo.c', 'int main() {}')])
334
351
        tree.add('foo.c')
335
 
        self.run_bzr('commit -m ""', retcode=3)
 
352
        self.run_bzr('commit -m ""')
336
353
 
337
354
    def test_other_branch_commit(self):
338
355
        # this branch is to ensure consistent behaviour, whether we're run
454
471
        t.add(['file-a', 'dir-a', 'dir-a/file-b'])
455
472
        t.commit('Create')
456
473
        t.remove(['file-a', 'dir-a/file-b'])
457
 
        os.chdir('dir-a')
458
 
        result = self.run_bzr('commit . -m removed-file-b')[1]
 
474
        result = self.run_bzr('commit . -m removed-file-b',
 
475
                              working_dir='dir-a')[1]
459
476
        self.assertNotContainsRe(result, 'file-a')
460
 
        result = self.run_bzr('status')[0]
 
477
        result = self.run_bzr('status', working_dir='dir-a')[0]
461
478
        self.assertContainsRe(result, 'removed:\n  file-a')
462
479
 
463
480
    def test_strict_commit(self):
467
484
        self.build_tree(['tree/a'])
468
485
        tree.add('a')
469
486
        # A simple change should just work
470
 
        self.run_bzr('commit --strict -m adding-a',
471
 
                     working_dir='tree')
 
487
        self.run_bzr('commit --strict -m adding-a', working_dir='tree')
472
488
 
473
489
    def test_strict_commit_no_changes(self):
474
490
        """commit --strict gives "no changes" if there is nothing to commit"""
599
615
            'commit -m add-b --fixes=xxx:123',
600
616
            working_dir='tree')
601
617
 
 
618
    def test_fixes_bug_with_default_tracker(self):
 
619
        """commit --fixes=234 uses the default bug tracker."""
 
620
        tree = self.make_branch_and_tree('tree')
 
621
        self.build_tree(['tree/hello.txt'])
 
622
        tree.add('hello.txt')
 
623
        self.run_bzr_error(
 
624
            ["bzr: ERROR: No tracker specified for bug 123. Use the form "
 
625
            "'tracker:id' or specify a default bug tracker using the "
 
626
            "`bugtracker` option.\n"
 
627
            "See \"bzr help bugs\" for more information on this feature. "
 
628
            "Commit refused."],
 
629
            'commit -m add-b --fixes=123',
 
630
            working_dir='tree')
 
631
        tree.branch.get_config_stack().set("bugtracker", "lp")
 
632
        self.run_bzr('commit -m hello --fixes=234 tree/hello.txt')
 
633
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
 
634
        self.assertEqual('https://launchpad.net/bugs/234 fixed',
 
635
                         last_rev.properties['bugs'])
 
636
 
602
637
    def test_fixes_invalid_bug_number(self):
603
638
        tree = self.make_branch_and_tree('tree')
604
639
        self.build_tree(['tree/hello.txt'])
616
651
        self.build_tree(['tree/hello.txt'])
617
652
        tree.add('hello.txt')
618
653
        self.run_bzr_error(
619
 
            [r"Invalid bug orange. Must be in the form of 'tracker:id'\. "
620
 
             r"See \"bzr help bugs\" for more information on this feature.\n"
621
 
             r"Commit refused\."],
622
 
            'commit -m add-b --fixes=orange',
 
654
            [r"Invalid bug orange:apples:bananas. Must be in the form of "
 
655
             r"'tracker:id'\. See \"bzr help bugs\" for more information on "
 
656
             r"this feature.\nCommit refused\."],
 
657
            'commit -m add-b --fixes=orange:apples:bananas',
623
658
            working_dir='tree')
624
659
 
625
660
    def test_no_author(self):
688
723
        self.assertStartsWith(
689
724
            err, "bzr: ERROR: Could not parse --commit-time:")
690
725
 
 
726
    def test_commit_time_missing_tz(self):
 
727
        tree = self.make_branch_and_tree('tree')
 
728
        self.build_tree(['tree/hello.txt'])
 
729
        tree.add('hello.txt')
 
730
        out, err = self.run_bzr("commit -m hello "
 
731
            "--commit-time='2009-10-10 08:00:00' tree/hello.txt", retcode=3)
 
732
        self.assertStartsWith(
 
733
            err, "bzr: ERROR: Could not parse --commit-time:")
 
734
        # Test that it is actually checking and does not simply crash with
 
735
        # some other exception
 
736
        self.assertContainsString(err, "missing a timezone offset")
 
737
 
691
738
    def test_partial_commit_with_renames_in_tree(self):
692
739
        # this test illustrates bug #140419
693
740
        t = self.make_branch_and_tree('.')
702
749
        self.build_tree_contents([('test', 'changes in test')])
703
750
        # partial commit
704
751
        out, err = self.run_bzr('commit test -m "partial commit"')
705
 
        self.assertEquals('', out)
 
752
        self.assertEqual('', out)
706
753
        self.assertContainsRe(err, r'modified test\nCommitted revision 2.')
707
754
 
708
755
    def test_commit_readonly_checkout(self):
710
757
        # "UnlockableTransport error trying to commit in checkout of readonly
711
758
        # branch"
712
759
        self.make_branch('master')
713
 
        master = BzrDir.open_from_transport(
 
760
        master = ControlDir.open_from_transport(
714
761
            self.get_readonly_transport('master')).open_branch()
715
762
        master.create_checkout('checkout')
716
763
        out, err = self.run_bzr(['commit', '--unchanged', '-mfoo', 'checkout'],
741
788
        tree.add('hello.txt')
742
789
        return tree
743
790
 
 
791
    def test_edit_empty_message(self):
 
792
        tree = self.make_branch_and_tree('tree')
 
793
        self.setup_editor()
 
794
        self.build_tree(['tree/hello.txt'])
 
795
        tree.add('hello.txt')
 
796
        out, err = self.run_bzr("commit tree/hello.txt", retcode=3,
 
797
            stdin="y\n")
 
798
        self.assertContainsRe(err,
 
799
            "bzr: ERROR: Empty commit message specified")
 
800
 
744
801
    def test_commit_hook_template_accepted(self):
745
802
        tree = self.setup_commit_with_template()
746
803
        out, err = self.run_bzr("commit tree/hello.txt", stdin="y\n")
750
807
    def test_commit_hook_template_rejected(self):
751
808
        tree = self.setup_commit_with_template()
752
809
        expected = tree.last_revision()
753
 
        out, err = self.run_bzr_error(["empty commit message"],
 
810
        out, err = self.run_bzr_error(["Empty commit message specified."
 
811
                  " Please specify a commit message with either"
 
812
                  " --message or --file or leave a blank message"
 
813
                  " with --message \"\"."],
754
814
            "commit tree/hello.txt", stdin="n\n")
755
815
        self.assertEqual(expected, tree.last_revision())
756
816
 
768
828
        """Ensure commit error if username is not set.
769
829
        """
770
830
        self.run_bzr(['init', 'foo'])
771
 
        os.chdir('foo')
772
 
        open('foo.txt', 'w').write('hello')
773
 
        self.run_bzr(['add'])
 
831
        with open('foo/foo.txt', 'w') as f:
 
832
            f.write('hello')
 
833
        self.run_bzr(['add'], working_dir='foo')
774
834
        self.overrideEnv('EMAIL', None)
775
835
        self.overrideEnv('BZR_EMAIL', None)
776
836
        # Also, make sure that it's not inferred from mailname.
777
837
        self.overrideAttr(config, '_auto_user_id',
778
838
            lambda: (None, None))
779
 
        out, err = self.run_bzr(['commit', '-m', 'initial'], 3)
780
 
        self.assertContainsRe(err, 'Unable to determine your name')
 
839
        self.run_bzr_error(
 
840
            ['Unable to determine your name'],
 
841
            ['commit', '-m', 'initial'], working_dir='foo')
781
842
 
782
843
    def test_commit_recursive_checkout(self):
783
844
        """Ensure that a commit to a recursive checkout fails cleanly.
784
845
        """
785
846
        self.run_bzr(['init', 'test_branch'])
786
847
        self.run_bzr(['checkout', 'test_branch', 'test_checkout'])
787
 
        os.chdir('test_checkout')
788
 
        self.run_bzr(['bind', '.']) # bind to self
789
 
        open('foo.txt', 'w').write('hello')
790
 
        self.run_bzr(['add'])
791
 
        out, err = self.run_bzr(['commit', '-m', 'addedfoo'], 3)
792
 
        self.assertEqual(out, '')
793
 
        self.assertContainsRe(err,
794
 
            'Branch.*test_checkout.*appears to be bound to itself')
 
848
        self.run_bzr(['bind', '.'], working_dir='test_checkout') # bind to self
 
849
        with open('test_checkout/foo.txt', 'w') as f:
 
850
            f.write('hello')
 
851
        self.run_bzr(['add'], working_dir='test_checkout')
 
852
        out, err = self.run_bzr_error(
 
853
            ['Branch.*test_checkout.*appears to be bound to itself'],
 
854
            ['commit', '-m', 'addedfoo'], working_dir='test_checkout')
 
855
 
 
856
    def test_mv_dirs_non_ascii(self):
 
857
        """Move directory with non-ascii name and containing files.
 
858
 
 
859
        Regression test for bug 185211.
 
860
        """
 
861
        tree = self.make_branch_and_tree('.')
 
862
        self.build_tree([u'abc\xa7/', u'abc\xa7/foo'])
 
863
 
 
864
        tree.add([u'abc\xa7/', u'abc\xa7/foo'])
 
865
        tree.commit('checkin')
 
866
 
 
867
        tree.rename_one(u'abc\xa7','abc')
 
868
 
 
869
        self.run_bzr('ci -m "non-ascii mv"')
 
870
 
 
871
 
 
872
class TestSmartServerCommit(TestCaseWithTransport):
 
873
 
 
874
    def test_commit_to_lightweight(self):
 
875
        self.setup_smart_server_with_call_log()
 
876
        t = self.make_branch_and_tree('from')
 
877
        for count in range(9):
 
878
            t.commit(message='commit %d' % count)
 
879
        out, err = self.run_bzr(['checkout', '--lightweight', self.get_url('from'),
 
880
            'target'])
 
881
        self.reset_smart_call_log()
 
882
        self.build_tree(['target/afile'])
 
883
        self.run_bzr(['add', 'target/afile'])
 
884
        out, err = self.run_bzr(['commit', '-m', 'do something', 'target'])
 
885
        # This figure represent the amount of work to perform this use case. It
 
886
        # is entirely ok to reduce this number if a test fails due to rpc_count
 
887
        # being too low. If rpc_count increases, more network roundtrips have
 
888
        # become necessary for this use case. Please do not adjust this number
 
889
        # upwards without agreement from bzr's network support maintainers.
 
890
        self.assertLength(211, self.hpss_calls)
 
891
        self.assertLength(2, self.hpss_connections)
 
892
        self.expectFailure("commit still uses VFS calls",
 
893
            self.assertThat, self.hpss_calls, ContainsNoVfsCalls)