/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

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

  • Committer: Robert Collins
  • Date: 2009-09-28 03:36:45 UTC
  • mto: This revision was merged to the branch mainline in revision 4717.
  • Revision ID: robertc@robertcollins.net-20090928033645-aztpo1itop56o61h
Up the count slightly to allow for PQM slowness.

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, 2009 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 (
26
25
    ignores,
27
26
    msgeditor,
28
27
    osutils,
29
 
    tests,
30
28
    )
31
29
from bzrlib.bzrdir import BzrDir
32
30
from bzrlib.tests import (
108
106
                              'modified hello\.txt\n'
109
107
                              'Committed revision 2\.\n$')
110
108
 
111
 
    def test_unicode_commit_message_is_filename(self):
112
 
        """Unicode commit message same as a filename (Bug #563646).
113
 
        """
114
 
        file_name = u'\N{euro sign}'
115
 
        self.run_bzr(['init'])
116
 
        open(file_name, 'w').write('hello world')
117
 
        self.run_bzr(['add'])
118
 
        out, err = self.run_bzr(['commit', '-m', file_name])
119
 
        reflags = re.MULTILINE|re.DOTALL|re.UNICODE
120
 
        te = osutils.get_terminal_encoding()
121
 
        self.assertContainsRe(err.decode(te),
122
 
            u'The commit message is a file name:',
123
 
            flags=reflags)
124
 
 
125
 
        # Run same test with a filename that causes encode
126
 
        # error for the terminal encoding. We do this
127
 
        # by forcing terminal encoding of ascii for
128
 
        # osutils.get_terminal_encoding which is used
129
 
        # by ui.text.show_warning
130
 
        default_get_terminal_enc = osutils.get_terminal_encoding
131
 
        try:
132
 
            osutils.get_terminal_encoding = lambda: 'ascii'
133
 
            file_name = u'foo\u1234'
134
 
            open(file_name, 'w').write('hello world')
135
 
            self.run_bzr(['add'])
136
 
            out, err = self.run_bzr(['commit', '-m', file_name])
137
 
            reflags = re.MULTILINE|re.DOTALL|re.UNICODE
138
 
            te = osutils.get_terminal_encoding()
139
 
            self.assertContainsRe(err.decode(te, 'replace'),
140
 
                u'The commit message is a file name:',
141
 
                flags=reflags)
142
 
        finally:
143
 
            osutils.get_terminal_encoding = default_get_terminal_enc
144
 
 
145
 
    def test_warn_about_forgotten_commit_message(self):
146
 
        """Test that the lack of -m parameter is caught"""
147
 
        wt = self.make_branch_and_tree('.')
148
 
        self.build_tree(['one', 'two'])
149
 
        wt.add(['two'])
150
 
        out, err = self.run_bzr('commit -m one two')
151
 
        self.assertContainsRe(err, "The commit message is a file name")
152
 
 
153
109
    def test_verbose_commit_renamed(self):
154
110
        # Verbose commit of renamed file should say so
155
111
        wt = self.prepare_simple_history()
214
170
        self.assertEqual(err, 'Committing to: %s\n'
215
171
                         'Committed revision 2.\n' % expected)
216
172
 
217
 
    def test_commit_sanitizes_CR_in_message(self):
218
 
        # See bug #433779, basically Emacs likes to pass '\r\n' style line
219
 
        # endings to 'bzr commit -m ""' which breaks because we don't allow
220
 
        # '\r' in commit messages. (Mostly because of issues where XML style
221
 
        # formats arbitrarily strip it out of the data while parsing.)
222
 
        # To make life easier for users, we just always translate '\r\n' =>
223
 
        # '\n'. And '\r' => '\n'.
224
 
        a_tree = self.make_branch_and_tree('a')
225
 
        self.build_tree(['a/b'])
226
 
        a_tree.add('b')
227
 
        self.run_bzr(['commit',
228
 
                      '-m', 'a string\r\n\r\nwith mixed\r\rendings\n'],
229
 
                     working_dir='a')
230
 
        rev_id = a_tree.branch.last_revision()
231
 
        rev = a_tree.branch.repository.get_revision(rev_id)
232
 
        self.assertEqualDiff('a string\n\nwith mixed\n\nendings\n',
233
 
                             rev.message)
234
 
 
235
173
    def test_commit_merge_reports_all_modified_files(self):
236
174
        # the commit command should show all the files that are shown by
237
175
        # bzr diff or bzr status when committing, even when they were not
307
245
        self.run_bzr('commit -m ""', retcode=3)
308
246
 
309
247
    def test_unsupported_encoding_commit_message(self):
310
 
        if sys.platform == 'win32':
311
 
            raise tests.TestNotApplicable('Win32 parses arguments directly'
312
 
                ' as Unicode, so we can\'t pass invalid non-ascii')
313
248
        tree = self.make_branch_and_tree('.')
314
249
        self.build_tree_contents([('foo.c', 'int main() {}')])
315
250
        tree.add('foo.c')
320
255
        if char is None:
321
256
            raise TestSkipped('Cannot find suitable non-ascii character'
322
257
                'for user_encoding (%s)' % osutils.get_user_encoding())
 
258
        # TODO: jam 2009-07-23 This test seems to fail on Windows now. My best
 
259
        #       guess is that the change to use Unicode command lines means
 
260
        #       that we no longer pay any attention to LANG=C when decoding the
 
261
        #       commandline arguments.
323
262
        out,err = self.run_bzr_subprocess('commit -m "%s"' % char,
324
263
                                          retcode=1,
325
264
                                          env_changes={'LANG': 'C'})
378
317
        trunk = self.make_branch_and_tree('trunk')
379
318
 
380
319
        u1 = trunk.branch.create_checkout('u1')
381
 
        self.build_tree_contents([('u1/hosts', 'initial contents\n')])
 
320
        self.build_tree_contents([('u1/hosts', 'initial contents')])
382
321
        u1.add('hosts')
383
322
        self.run_bzr('commit -m add-hosts u1')
384
323
 
385
324
        u2 = trunk.branch.create_checkout('u2')
386
 
        self.build_tree_contents([('u2/hosts', 'altered in u2\n')])
 
325
        self.build_tree_contents([('u2/hosts', 'altered in u2')])
387
326
        self.run_bzr('commit -m checkin-from-u2 u2')
388
327
 
389
328
        # make an offline commits
390
 
        self.build_tree_contents([('u1/hosts', 'first offline change in u1\n')])
 
329
        self.build_tree_contents([('u1/hosts', 'first offline change in u1')])
391
330
        self.run_bzr('commit -m checkin-offline --local u1')
392
331
 
393
332
        # now try to pull in online work from u2, and then commit our offline
394
333
        # work as a merge
395
334
        # retcode 1 as we expect a text conflict
396
335
        self.run_bzr('update u1', retcode=1)
397
 
        self.assertFileEqual('''\
398
 
<<<<<<< TREE
399
 
first offline change in u1
400
 
=======
401
 
altered in u2
402
 
>>>>>>> MERGE-SOURCE
403
 
''',
404
 
                             'u1/hosts')
405
 
 
406
336
        self.run_bzr('resolved u1/hosts')
407
337
        # add a text change here to represent resolving the merge conflicts in
408
338
        # favour of a new version of the file not identical to either the u1
660
590
        properties = last_rev.properties
661
591
        self.assertEqual('John Doe\nJane Rey', properties['authors'])
662
592
 
663
 
    def test_commit_time(self):
664
 
        tree = self.make_branch_and_tree('tree')
665
 
        self.build_tree(['tree/hello.txt'])
666
 
        tree.add('hello.txt')
667
 
        out, err = self.run_bzr("commit -m hello "
668
 
            "--commit-time='2009-10-10 08:00:00 +0100' tree/hello.txt")
669
 
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
670
 
        self.assertEqual(
671
 
            'Sat 2009-10-10 08:00:00 +0100',
672
 
            osutils.format_date(last_rev.timestamp, last_rev.timezone))
673
 
        
674
 
    def test_commit_time_bad_time(self):
675
 
        tree = self.make_branch_and_tree('tree')
676
 
        self.build_tree(['tree/hello.txt'])
677
 
        tree.add('hello.txt')
678
 
        out, err = self.run_bzr("commit -m hello "
679
 
            "--commit-time='NOT A TIME' tree/hello.txt", retcode=3)
680
 
        self.assertStartsWith(
681
 
            err, "bzr: ERROR: Could not parse --commit-time:")
682
 
 
683
593
    def test_partial_commit_with_renames_in_tree(self):
684
594
        # this test illustrates bug #140419
685
595
        t = self.make_branch_and_tree('.')
710
620
        self.assertContainsRe(err,
711
621
            r'^bzr: ERROR: Cannot lock.*readonly transport')
712
622
 
713
 
    def setup_editor(self):
 
623
    def test_commit_hook_template(self):
714
624
        # Test that commit template hooks work
 
625
        def restoreDefaults():
 
626
            msgeditor.hooks['commit_message_template'] = []
 
627
            osutils.set_or_unset_env('BZR_EDITOR', default_editor)
715
628
        if sys.platform == "win32":
716
629
            f = file('fed.bat', 'w')
717
630
            f.write('@rem dummy fed')
718
631
            f.close()
719
 
            osutils.set_or_unset_env('BZR_EDITOR', "fed.bat")
 
632
            default_editor = osutils.set_or_unset_env('BZR_EDITOR', "fed.bat")
720
633
        else:
721
634
            f = file('fed.sh', 'wb')
722
635
            f.write('#!/bin/sh\n')
723
636
            f.close()
724
637
            os.chmod('fed.sh', 0755)
725
 
            osutils.set_or_unset_env('BZR_EDITOR', "./fed.sh")
726
 
 
727
 
    def setup_commit_with_template(self):
728
 
        self.setup_editor()
 
638
            default_editor = osutils.set_or_unset_env('BZR_EDITOR', "./fed.sh")
 
639
        self.addCleanup(restoreDefaults)
729
640
        msgeditor.hooks.install_named_hook("commit_message_template",
730
641
                lambda commit_obj, msg: "save me some typing\n", None)
731
642
        tree = self.make_branch_and_tree('tree')
732
643
        self.build_tree(['tree/hello.txt'])
733
644
        tree.add('hello.txt')
734
 
        return tree
735
 
 
736
 
    def test_commit_hook_template_accepted(self):
737
 
        tree = self.setup_commit_with_template()
738
 
        out, err = self.run_bzr("commit tree/hello.txt", stdin="y\n")
 
645
        out, err = self.run_bzr("commit tree/hello.txt")
739
646
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
740
647
        self.assertEqual('save me some typing\n', last_rev.message)
741
 
 
742
 
    def test_commit_hook_template_rejected(self):
743
 
        tree = self.setup_commit_with_template()
744
 
        expected = tree.last_revision()
745
 
        out, err = self.run_bzr_error(["empty commit message"],
746
 
            "commit tree/hello.txt", stdin="n\n")
747
 
        self.assertEqual(expected, tree.last_revision())
748
 
 
749
 
    def test_commit_without_username(self):
750
 
        """Ensure commit error if username is not set.
751
 
        """
752
 
        self.run_bzr(['init', 'foo'])
753
 
        os.chdir('foo')
754
 
        open('foo.txt', 'w').write('hello')
755
 
        self.run_bzr(['add'])
756
 
        osutils.set_or_unset_env('EMAIL', None)
757
 
        osutils.set_or_unset_env('BZR_EMAIL', None)
758
 
        out, err = self.run_bzr(['commit', '-m', 'initial'], 3)
759
 
        self.assertContainsRe(err, 'Unable to determine your name')