~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-05-07 00:59:42 UTC
  • mfrom: (4340.1.1 bzr.dev)
  • Revision ID: pqm@pqm.ubuntu.com-20090507005942-wnvvomd3130f1vph
(Jelmer) Mention --force in the error message when unable to access
        in the master branch in 'bzr switch'.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007 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
18
18
"""Tests for the commit CLI of bzr."""
19
19
 
20
20
import os
21
 
import re
22
21
import sys
23
22
 
24
23
from bzrlib import (
25
 
    bzrdir,
26
24
    osutils,
27
25
    ignores,
28
26
    msgeditor,
29
27
    osutils,
30
 
    tests,
31
28
    )
32
29
from bzrlib.bzrdir import BzrDir
33
30
from bzrlib.tests import (
34
31
    probe_bad_non_ascii,
35
32
    TestSkipped,
36
33
    )
37
 
from bzrlib.tests import TestCaseWithTransport
38
 
 
39
 
 
40
 
class TestCommit(TestCaseWithTransport):
 
34
from bzrlib.tests.blackbox import ExternalBase
 
35
 
 
36
 
 
37
class TestCommit(ExternalBase):
41
38
 
42
39
    def test_05_empty_commit(self):
43
40
        """Commit of tree with no versioned files should fail"""
46
43
        self.build_tree(['hello.txt'])
47
44
        out,err = self.run_bzr('commit -m empty', retcode=3)
48
45
        self.assertEqual('', out)
49
 
        self.assertContainsRe(err, 'bzr: ERROR: No changes to commit\.'
50
 
                                  ' Use --unchanged to commit anyhow.\n')
 
46
        self.assertContainsRe(err, 'bzr: ERROR: no changes to commit\.'
 
47
                                  ' use --unchanged to commit anyhow\n')
51
48
 
52
49
    def test_commit_success(self):
53
50
        """Successful commit should not leave behind a bzr-commit-* file"""
109
106
                              'modified hello\.txt\n'
110
107
                              'Committed revision 2\.\n$')
111
108
 
112
 
    def test_unicode_commit_message_is_filename(self):
113
 
        """Unicode commit message same as a filename (Bug #563646).
114
 
        """
115
 
        file_name = u'\N{euro sign}'
116
 
        self.run_bzr(['init'])
117
 
        open(file_name, 'w').write('hello world')
118
 
        self.run_bzr(['add'])
119
 
        out, err = self.run_bzr(['commit', '-m', file_name])
120
 
        reflags = re.MULTILINE|re.DOTALL|re.UNICODE
121
 
        te = osutils.get_terminal_encoding()
122
 
        self.assertContainsRe(err.decode(te),
123
 
            u'The commit message is a file name:',
124
 
            flags=reflags)
125
 
 
126
 
        # Run same test with a filename that causes encode
127
 
        # error for the terminal encoding. We do this
128
 
        # by forcing terminal encoding of ascii for
129
 
        # osutils.get_terminal_encoding which is used
130
 
        # by ui.text.show_warning
131
 
        default_get_terminal_enc = osutils.get_terminal_encoding
132
 
        try:
133
 
            osutils.get_terminal_encoding = lambda trace=None: 'ascii'
134
 
            file_name = u'foo\u1234'
135
 
            open(file_name, 'w').write('hello world')
136
 
            self.run_bzr(['add'])
137
 
            out, err = self.run_bzr(['commit', '-m', file_name])
138
 
            reflags = re.MULTILINE|re.DOTALL|re.UNICODE
139
 
            te = osutils.get_terminal_encoding()
140
 
            self.assertContainsRe(err.decode(te, 'replace'),
141
 
                u'The commit message is a file name:',
142
 
                flags=reflags)
143
 
        finally:
144
 
            osutils.get_terminal_encoding = default_get_terminal_enc
145
 
 
146
 
    def test_warn_about_forgotten_commit_message(self):
147
 
        """Test that the lack of -m parameter is caught"""
148
 
        wt = self.make_branch_and_tree('.')
149
 
        self.build_tree(['one', 'two'])
150
 
        wt.add(['two'])
151
 
        out, err = self.run_bzr('commit -m one two')
152
 
        self.assertContainsRe(err, "The commit message is a file name")
153
 
 
154
109
    def test_verbose_commit_renamed(self):
155
110
        # Verbose commit of renamed file should say so
156
111
        wt = self.prepare_simple_history()
215
170
        self.assertEqual(err, 'Committing to: %s\n'
216
171
                         'Committed revision 2.\n' % expected)
217
172
 
218
 
    def test_commit_sanitizes_CR_in_message(self):
219
 
        # See bug #433779, basically Emacs likes to pass '\r\n' style line
220
 
        # endings to 'bzr commit -m ""' which breaks because we don't allow
221
 
        # '\r' in commit messages. (Mostly because of issues where XML style
222
 
        # formats arbitrarily strip it out of the data while parsing.)
223
 
        # To make life easier for users, we just always translate '\r\n' =>
224
 
        # '\n'. And '\r' => '\n'.
225
 
        a_tree = self.make_branch_and_tree('a')
226
 
        self.build_tree(['a/b'])
227
 
        a_tree.add('b')
228
 
        self.run_bzr(['commit',
229
 
                      '-m', 'a string\r\n\r\nwith mixed\r\rendings\n'],
230
 
                     working_dir='a')
231
 
        rev_id = a_tree.branch.last_revision()
232
 
        rev = a_tree.branch.repository.get_revision(rev_id)
233
 
        self.assertEqualDiff('a string\n\nwith mixed\n\nendings\n',
234
 
                             rev.message)
235
 
 
236
173
    def test_commit_merge_reports_all_modified_files(self):
237
174
        # the commit command should show all the files that are shown by
238
175
        # bzr diff or bzr status when committing, even when they were not
308
245
        self.run_bzr('commit -m ""', retcode=3)
309
246
 
310
247
    def test_unsupported_encoding_commit_message(self):
311
 
        if sys.platform == 'win32':
312
 
            raise tests.TestNotApplicable('Win32 parses arguments directly'
313
 
                ' as Unicode, so we can\'t pass invalid non-ascii')
314
248
        tree = self.make_branch_and_tree('.')
315
249
        self.build_tree_contents([('foo.c', 'int main() {}')])
316
250
        tree.add('foo.c')
335
269
        self.build_tree_contents([
336
270
            ('branch/foo.c', 'int main() {}'),
337
271
            ('branch/bar.c', 'int main() {}')])
338
 
        inner_tree.add(['foo.c', 'bar.c'])
 
272
        inner_tree.add('foo.c')
 
273
        inner_tree.add('bar.c')
339
274
        # can't commit files in different trees; sane error
340
275
        self.run_bzr('commit -m newstuff branch/foo.c .', retcode=3)
341
 
        # can commit to branch - records foo.c only
342
276
        self.run_bzr('commit -m newstuff branch/foo.c')
343
 
        # can commit to branch - records bar.c
344
277
        self.run_bzr('commit -m newstuff branch')
345
 
        # No changes left
346
 
        self.run_bzr_error(["No changes to commit"], 'commit -m newstuff branch')
 
278
        self.run_bzr('commit -m newstuff branch', retcode=3)
347
279
 
348
280
    def test_out_of_date_tree_commit(self):
349
281
        # check we get an error code and a clear message committing with an out
379
311
        trunk = self.make_branch_and_tree('trunk')
380
312
 
381
313
        u1 = trunk.branch.create_checkout('u1')
382
 
        self.build_tree_contents([('u1/hosts', 'initial contents\n')])
 
314
        self.build_tree_contents([('u1/hosts', 'initial contents')])
383
315
        u1.add('hosts')
384
316
        self.run_bzr('commit -m add-hosts u1')
385
317
 
386
318
        u2 = trunk.branch.create_checkout('u2')
387
 
        self.build_tree_contents([('u2/hosts', 'altered in u2\n')])
 
319
        self.build_tree_contents([('u2/hosts', 'altered in u2')])
388
320
        self.run_bzr('commit -m checkin-from-u2 u2')
389
321
 
390
322
        # make an offline commits
391
 
        self.build_tree_contents([('u1/hosts', 'first offline change in u1\n')])
 
323
        self.build_tree_contents([('u1/hosts', 'first offline change in u1')])
392
324
        self.run_bzr('commit -m checkin-offline --local u1')
393
325
 
394
326
        # now try to pull in online work from u2, and then commit our offline
395
327
        # work as a merge
396
328
        # retcode 1 as we expect a text conflict
397
329
        self.run_bzr('update u1', retcode=1)
398
 
        self.assertFileEqual('''\
399
 
<<<<<<< TREE
400
 
first offline change in u1
401
 
=======
402
 
altered in u2
403
 
>>>>>>> MERGE-SOURCE
404
 
''',
405
 
                             'u1/hosts')
406
 
 
407
330
        self.run_bzr('resolved u1/hosts')
408
331
        # add a text change here to represent resolving the merge conflicts in
409
332
        # favour of a new version of the file not identical to either the u1
472
395
 
473
396
        # With no changes, it should just be 'no changes'
474
397
        # Make sure that commit is failing because there is nothing to do
475
 
        self.run_bzr_error(['No changes to commit'],
 
398
        self.run_bzr_error(['no changes to commit'],
476
399
                           'commit --strict -m no-changes',
477
400
                           working_dir='tree')
478
401
 
661
584
        properties = last_rev.properties
662
585
        self.assertEqual('John Doe\nJane Rey', properties['authors'])
663
586
 
664
 
    def test_commit_time(self):
665
 
        tree = self.make_branch_and_tree('tree')
666
 
        self.build_tree(['tree/hello.txt'])
667
 
        tree.add('hello.txt')
668
 
        out, err = self.run_bzr("commit -m hello "
669
 
            "--commit-time='2009-10-10 08:00:00 +0100' tree/hello.txt")
670
 
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
671
 
        self.assertEqual(
672
 
            'Sat 2009-10-10 08:00:00 +0100',
673
 
            osutils.format_date(last_rev.timestamp, last_rev.timezone))
674
 
        
675
 
    def test_commit_time_bad_time(self):
676
 
        tree = self.make_branch_and_tree('tree')
677
 
        self.build_tree(['tree/hello.txt'])
678
 
        tree.add('hello.txt')
679
 
        out, err = self.run_bzr("commit -m hello "
680
 
            "--commit-time='NOT A TIME' tree/hello.txt", retcode=3)
681
 
        self.assertStartsWith(
682
 
            err, "bzr: ERROR: Could not parse --commit-time:")
683
 
 
684
587
    def test_partial_commit_with_renames_in_tree(self):
685
588
        # this test illustrates bug #140419
686
589
        t = self.make_branch_and_tree('.')
699
602
        self.assertContainsRe(err, r'modified test\nCommitted revision 2.')
700
603
 
701
604
    def test_commit_readonly_checkout(self):
702
 
        # https://bugs.launchpad.net/bzr/+bug/129701
 
605
        # https://bugs.edge.launchpad.net/bzr/+bug/129701
703
606
        # "UnlockableTransport error trying to commit in checkout of readonly
704
607
        # branch"
705
608
        self.make_branch('master')
711
614
        self.assertContainsRe(err,
712
615
            r'^bzr: ERROR: Cannot lock.*readonly transport')
713
616
 
714
 
    def setup_editor(self):
 
617
    def test_commit_hook_template(self):
715
618
        # Test that commit template hooks work
 
619
        def restoreDefaults():
 
620
            msgeditor.hooks['commit_message_template'] = []
 
621
            osutils.set_or_unset_env('BZR_EDITOR', default_editor)
716
622
        if sys.platform == "win32":
717
623
            f = file('fed.bat', 'w')
718
624
            f.write('@rem dummy fed')
719
625
            f.close()
720
 
            osutils.set_or_unset_env('BZR_EDITOR', "fed.bat")
 
626
            default_editor = osutils.set_or_unset_env('BZR_EDITOR', "fed.bat")
721
627
        else:
722
628
            f = file('fed.sh', 'wb')
723
629
            f.write('#!/bin/sh\n')
724
630
            f.close()
725
631
            os.chmod('fed.sh', 0755)
726
 
            osutils.set_or_unset_env('BZR_EDITOR', "./fed.sh")
727
 
 
728
 
    def setup_commit_with_template(self):
729
 
        self.setup_editor()
 
632
            default_editor = osutils.set_or_unset_env('BZR_EDITOR', "./fed.sh")
 
633
        self.addCleanup(restoreDefaults)
730
634
        msgeditor.hooks.install_named_hook("commit_message_template",
731
635
                lambda commit_obj, msg: "save me some typing\n", None)
732
636
        tree = self.make_branch_and_tree('tree')
733
637
        self.build_tree(['tree/hello.txt'])
734
638
        tree.add('hello.txt')
735
 
        return tree
736
 
 
737
 
    def test_commit_hook_template_accepted(self):
738
 
        tree = self.setup_commit_with_template()
739
 
        out, err = self.run_bzr("commit tree/hello.txt", stdin="y\n")
 
639
        out, err = self.run_bzr("commit tree/hello.txt")
740
640
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
741
641
        self.assertEqual('save me some typing\n', last_rev.message)
742
 
 
743
 
    def test_commit_hook_template_rejected(self):
744
 
        tree = self.setup_commit_with_template()
745
 
        expected = tree.last_revision()
746
 
        out, err = self.run_bzr_error(["empty commit message"],
747
 
            "commit tree/hello.txt", stdin="n\n")
748
 
        self.assertEqual(expected, tree.last_revision())
749
 
 
750
 
    def test_commit_without_username(self):
751
 
        """Ensure commit error if username is not set.
752
 
        """
753
 
        self.run_bzr(['init', 'foo'])
754
 
        os.chdir('foo')
755
 
        open('foo.txt', 'w').write('hello')
756
 
        self.run_bzr(['add'])
757
 
        osutils.set_or_unset_env('EMAIL', None)
758
 
        osutils.set_or_unset_env('BZR_EMAIL', None)
759
 
        out, err = self.run_bzr(['commit', '-m', 'initial'], 3)
760
 
        self.assertContainsRe(err, 'Unable to determine your name')
761
 
 
762
 
    def test_commit_recursive_checkout(self):
763
 
        """Ensure that a commit to a recursive checkout fails cleanly.
764
 
        """
765
 
        self.run_bzr(['init', 'test_branch'])
766
 
        self.run_bzr(['checkout', 'test_branch', 'test_checkout'])
767
 
        os.chdir('test_checkout')
768
 
        self.run_bzr(['bind', '.']) # bind to self
769
 
        open('foo.txt', 'w').write('hello')
770
 
        self.run_bzr(['add'])
771
 
        out, err = self.run_bzr(['commit', '-m', 'addedfoo'], 3)
772
 
        self.assertEqual(out, '')
773
 
        self.assertContainsRe(err,
774
 
            'Branch.*test_checkout.*appears to be bound to itself')
775