/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: Vincent Ladeuil
  • Date: 2009-07-10 12:40:36 UTC
  • mfrom: (4523.1.5 per-tests)
  • mto: This revision was merged to the branch mainline in revision 4526.
  • Revision ID: v.ladeuil+lp@free.fr-20090710124036-enqp2kri098c24ub
Finish the *_implementation to per_* test renaming

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')
334
269
        self.build_tree_contents([
335
270
            ('branch/foo.c', 'int main() {}'),
336
271
            ('branch/bar.c', 'int main() {}')])
337
 
        inner_tree.add(['foo.c', 'bar.c'])
 
272
        inner_tree.add('foo.c')
 
273
        inner_tree.add('bar.c')
338
274
        # can't commit files in different trees; sane error
339
275
        self.run_bzr('commit -m newstuff branch/foo.c .', retcode=3)
340
 
        # can commit to branch - records foo.c only
341
276
        self.run_bzr('commit -m newstuff branch/foo.c')
342
 
        # can commit to branch - records bar.c
343
277
        self.run_bzr('commit -m newstuff branch')
344
 
        # No changes left
345
 
        self.run_bzr_error(["No changes to commit"], 'commit -m newstuff branch')
 
278
        self.run_bzr('commit -m newstuff branch', retcode=3)
346
279
 
347
280
    def test_out_of_date_tree_commit(self):
348
281
        # check we get an error code and a clear message committing with an out
378
311
        trunk = self.make_branch_and_tree('trunk')
379
312
 
380
313
        u1 = trunk.branch.create_checkout('u1')
381
 
        self.build_tree_contents([('u1/hosts', 'initial contents\n')])
 
314
        self.build_tree_contents([('u1/hosts', 'initial contents')])
382
315
        u1.add('hosts')
383
316
        self.run_bzr('commit -m add-hosts u1')
384
317
 
385
318
        u2 = trunk.branch.create_checkout('u2')
386
 
        self.build_tree_contents([('u2/hosts', 'altered in u2\n')])
 
319
        self.build_tree_contents([('u2/hosts', 'altered in u2')])
387
320
        self.run_bzr('commit -m checkin-from-u2 u2')
388
321
 
389
322
        # make an offline commits
390
 
        self.build_tree_contents([('u1/hosts', 'first offline change in u1\n')])
 
323
        self.build_tree_contents([('u1/hosts', 'first offline change in u1')])
391
324
        self.run_bzr('commit -m checkin-offline --local u1')
392
325
 
393
326
        # now try to pull in online work from u2, and then commit our offline
394
327
        # work as a merge
395
328
        # retcode 1 as we expect a text conflict
396
329
        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
330
        self.run_bzr('resolved u1/hosts')
407
331
        # add a text change here to represent resolving the merge conflicts in
408
332
        # favour of a new version of the file not identical to either the u1
660
584
        properties = last_rev.properties
661
585
        self.assertEqual('John Doe\nJane Rey', properties['authors'])
662
586
 
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
587
    def test_partial_commit_with_renames_in_tree(self):
684
588
        # this test illustrates bug #140419
685
589
        t = self.make_branch_and_tree('.')
698
602
        self.assertContainsRe(err, r'modified test\nCommitted revision 2.')
699
603
 
700
604
    def test_commit_readonly_checkout(self):
701
 
        # https://bugs.launchpad.net/bzr/+bug/129701
 
605
        # https://bugs.edge.launchpad.net/bzr/+bug/129701
702
606
        # "UnlockableTransport error trying to commit in checkout of readonly
703
607
        # branch"
704
608
        self.make_branch('master')
710
614
        self.assertContainsRe(err,
711
615
            r'^bzr: ERROR: Cannot lock.*readonly transport')
712
616
 
713
 
    def setup_editor(self):
 
617
    def test_commit_hook_template(self):
714
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)
715
622
        if sys.platform == "win32":
716
623
            f = file('fed.bat', 'w')
717
624
            f.write('@rem dummy fed')
718
625
            f.close()
719
 
            osutils.set_or_unset_env('BZR_EDITOR', "fed.bat")
 
626
            default_editor = osutils.set_or_unset_env('BZR_EDITOR', "fed.bat")
720
627
        else:
721
628
            f = file('fed.sh', 'wb')
722
629
            f.write('#!/bin/sh\n')
723
630
            f.close()
724
631
            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()
 
632
            default_editor = osutils.set_or_unset_env('BZR_EDITOR', "./fed.sh")
 
633
        self.addCleanup(restoreDefaults)
729
634
        msgeditor.hooks.install_named_hook("commit_message_template",
730
635
                lambda commit_obj, msg: "save me some typing\n", None)
731
636
        tree = self.make_branch_and_tree('tree')
732
637
        self.build_tree(['tree/hello.txt'])
733
638
        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")
 
639
        out, err = self.run_bzr("commit tree/hello.txt")
739
640
        last_rev = tree.branch.repository.get_revision(tree.last_revision())
740
641
        self.assertEqual('save me some typing\n', last_rev.message)
741
642
 
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())
 
643
    def test_commit_and_mv_dance_a(self):
 
644
        # see https://bugs.launchpad.net/bzr/+bug/395556
 
645
        tree = self.make_branch_and_tree(".")
 
646
        self.build_tree(["a"])
 
647
        tree.add("a")
 
648
        self.check_output("a => b\n", ["mv", "a", "b"])
 
649
        self.check_output("", ["commit", "-q", "-m", "Actually no, b"])
 
650
        self.check_output("b => a\n", ["mv", "b", "a"])
 
651
        self.check_output("", ["commit", "-q", "-m", "No, really, a"])
748
652
 
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')
 
653
    def test_commit_and_mv_dance_b(self):
 
654
        # see https://bugs.launchpad.net/bzr/+bug/395556
 
655
        tree = self.make_branch_and_tree(".")
 
656
        self.build_tree(["b"])
 
657
        tree.add("b")
 
658
        self.check_output("b => a\n", ["mv", "b", "a"])
 
659
        self.check_output("", ["commit", "-q", "-m", "Actually no, a"])
 
660
        self.check_output("a => b\n", ["mv", "a", "b"])
 
661
        self.expectFailure("bug 395556: gives DuplicateFileId "
 
662
            "committing renames",
 
663
            self.check_output, "", ["commit", "-q", "-m", "No, really, b"])