/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: Canonical.com Patch Queue Manager
  • Date: 2009-07-31 16:22:11 UTC
  • mfrom: (4578.1.4 1.18-sigbreak)
  • Revision ID: pqm@pqm.ubuntu.com-20090731162211-zvddnooijve9nbmu
(jam) Support SIGBREAK on Windows dropping you into the debugger.

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'})
334
273
        self.build_tree_contents([
335
274
            ('branch/foo.c', 'int main() {}'),
336
275
            ('branch/bar.c', 'int main() {}')])
337
 
        inner_tree.add(['foo.c', 'bar.c'])
 
276
        inner_tree.add('foo.c')
 
277
        inner_tree.add('bar.c')
338
278
        # can't commit files in different trees; sane error
339
279
        self.run_bzr('commit -m newstuff branch/foo.c .', retcode=3)
340
 
        # can commit to branch - records foo.c only
341
280
        self.run_bzr('commit -m newstuff branch/foo.c')
342
 
        # can commit to branch - records bar.c
343
281
        self.run_bzr('commit -m newstuff branch')
344
 
        # No changes left
345
 
        self.run_bzr_error(["No changes to commit"], 'commit -m newstuff branch')
 
282
        self.run_bzr('commit -m newstuff branch', retcode=3)
346
283
 
347
284
    def test_out_of_date_tree_commit(self):
348
285
        # check we get an error code and a clear message committing with an out
378
315
        trunk = self.make_branch_and_tree('trunk')
379
316
 
380
317
        u1 = trunk.branch.create_checkout('u1')
381
 
        self.build_tree_contents([('u1/hosts', 'initial contents\n')])
 
318
        self.build_tree_contents([('u1/hosts', 'initial contents')])
382
319
        u1.add('hosts')
383
320
        self.run_bzr('commit -m add-hosts u1')
384
321
 
385
322
        u2 = trunk.branch.create_checkout('u2')
386
 
        self.build_tree_contents([('u2/hosts', 'altered in u2\n')])
 
323
        self.build_tree_contents([('u2/hosts', 'altered in u2')])
387
324
        self.run_bzr('commit -m checkin-from-u2 u2')
388
325
 
389
326
        # make an offline commits
390
 
        self.build_tree_contents([('u1/hosts', 'first offline change in u1\n')])
 
327
        self.build_tree_contents([('u1/hosts', 'first offline change in u1')])
391
328
        self.run_bzr('commit -m checkin-offline --local u1')
392
329
 
393
330
        # now try to pull in online work from u2, and then commit our offline
394
331
        # work as a merge
395
332
        # retcode 1 as we expect a text conflict
396
333
        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
334
        self.run_bzr('resolved u1/hosts')
407
335
        # add a text change here to represent resolving the merge conflicts in
408
336
        # favour of a new version of the file not identical to either the u1
660
588
        properties = last_rev.properties
661
589
        self.assertEqual('John Doe\nJane Rey', properties['authors'])
662
590
 
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
591
    def test_partial_commit_with_renames_in_tree(self):
684
592
        # this test illustrates bug #140419
685
593
        t = self.make_branch_and_tree('.')
710
618
        self.assertContainsRe(err,
711
619
            r'^bzr: ERROR: Cannot lock.*readonly transport')
712
620
 
713
 
    def setup_editor(self):
 
621
    def test_commit_hook_template(self):
714
622
        # Test that commit template hooks work
 
623
        def restoreDefaults():
 
624
            msgeditor.hooks['commit_message_template'] = []
 
625
            osutils.set_or_unset_env('BZR_EDITOR', default_editor)
715
626
        if sys.platform == "win32":
716
627
            f = file('fed.bat', 'w')
717
628
            f.write('@rem dummy fed')
718
629
            f.close()
719
 
            osutils.set_or_unset_env('BZR_EDITOR', "fed.bat")
 
630
            default_editor = osutils.set_or_unset_env('BZR_EDITOR', "fed.bat")
720
631
        else:
721
632
            f = file('fed.sh', 'wb')
722
633
            f.write('#!/bin/sh\n')
723
634
            f.close()
724
635
            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()
 
636
            default_editor = osutils.set_or_unset_env('BZR_EDITOR', "./fed.sh")
 
637
        self.addCleanup(restoreDefaults)
729
638
        msgeditor.hooks.install_named_hook("commit_message_template",
730
639
                lambda commit_obj, msg: "save me some typing\n", None)
731
640
        tree = self.make_branch_and_tree('tree')
732
641
        self.build_tree(['tree/hello.txt'])
733
642
        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")
 
643
        out, err = self.run_bzr("commit tree/hello.txt")
739
644
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
740
645
        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')