/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/test_msgeditor.py

  • Committer: Martin Pool
  • Date: 2007-10-03 08:06:44 UTC
  • mto: This revision was merged to the branch mainline in revision 2901.
  • Revision ID: mbp@sourcefrog.net-20071003080644-oivy0gkg98sex0ed
Avoid internal error tracebacks on failure to lock on readonly transport (#129701).

Add new LockFailed, which doesn't imply that we failed to get it because of
contention.  Raise this if we fail to create the pending or lock directories
because of Transport errors.

UnlockableTransport is not an internal error.

ReadOnlyLockError has a message which didn't match its name or usage; it's now
deprecated and callers are updated to use LockFailed which is more appropriate.

Add zero_ninetytwo deprecation symbol.

Unify assertMatchesRe with TestCase.assertContainsRe.

When the constructor is deprecated, just say that the class is deprecated, not
the __init__ method - this works better with applyDeprecated in tests.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2005 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
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
"""Test commit message editor.
18
18
"""
21
21
import sys
22
22
 
23
23
from bzrlib import (
24
 
    commit,
25
24
    errors,
26
25
    msgeditor,
27
26
    osutils,
28
 
    tests,
29
 
    trace,
30
27
    )
31
28
from bzrlib.branch import Branch
32
29
from bzrlib.config import ensure_config_dir_exists, config_filename
34
31
    make_commit_message_template_encoded,
35
32
    edit_commit_message_encoded
36
33
)
37
 
from bzrlib.tests import (
38
 
    TestCaseInTempDir,
39
 
    TestCaseWithTransport,
40
 
    TestNotApplicable,
41
 
    TestSkipped,
42
 
    multiply_tests,
43
 
    probe_bad_non_ascii,
44
 
    split_suite_by_re,
45
 
    )
46
 
from bzrlib.tests.EncodingAdapter import encoding_scenarios
 
34
from bzrlib.tests import TestCaseWithTransport, TestSkipped
47
35
from bzrlib.trace import mutter
48
36
 
49
 
 
50
 
def load_tests(standard_tests, module, loader):
51
 
    """Parameterize the test for tempfile creation with different encodings."""
52
 
    to_adapt, result = split_suite_by_re(standard_tests,
53
 
        "test__create_temp_file_with_commit_template_in_unicode_dir")
54
 
    return multiply_tests(to_adapt, encoding_scenarios, result)
55
 
 
56
 
 
57
37
class MsgEditorTest(TestCaseWithTransport):
58
38
 
59
39
    def make_uncommitted_tree(self):
68
48
                "filesystem encoding %s" % sys.getfilesystemencoding())
69
49
        working_tree.add(filename)
70
50
        return working_tree
71
 
 
 
51
    
72
52
    def test_commit_template(self):
73
53
        """Test building a commit message template"""
74
54
        working_tree = self.make_uncommitted_tree()
80
60
  hell\u00d8
81
61
""")
82
62
 
83
 
    def make_multiple_pending_tree(self):
84
 
        from bzrlib import config
85
 
        config.GlobalConfig().set_user_option('email',
86
 
                                              'Bilbo Baggins <bb@hobbit.net>')
87
 
        tree = self.make_branch_and_tree('a')
88
 
        tree.commit('Initial checkin.', timestamp=1230912900, timezone=0)
89
 
        tree2 = tree.bzrdir.clone('b').open_workingtree()
90
 
        tree.commit('Minor tweak.', timestamp=1231977840, timezone=0)
91
 
        tree2.commit('Feature X work.', timestamp=1233186240, timezone=0)
92
 
        tree3 = tree2.bzrdir.clone('c').open_workingtree()
93
 
        tree2.commit('Feature X finished.', timestamp=1233187680, timezone=0)
94
 
        tree3.commit('Feature Y, based on initial X work.',
95
 
                     timestamp=1233285960, timezone=0)
96
 
        tree.merge_from_branch(tree2.branch)
97
 
        tree.merge_from_branch(tree3.branch, force=True)
98
 
        return tree
99
 
 
100
 
    def test_commit_template_pending_merges(self):
101
 
        """Test building a commit message template when there are pending
102
 
        merges.  The commit message should show all pending merge revisions,
103
 
        as does 'status -v', not only the merge tips.
104
 
        """
105
 
        working_tree = self.make_multiple_pending_tree()
106
 
        template = msgeditor.make_commit_message_template(working_tree, None)
107
 
        self.assertEqualDiff(template,
108
 
u"""\
109
 
pending merges:
110
 
  Bilbo Baggins 2009-01-29 Feature X finished.
111
 
    Bilbo Baggins 2009-01-28 Feature X work.
112
 
  Bilbo Baggins 2009-01-30 Feature Y, based on initial X work.
113
 
""")
114
 
 
115
63
    def test_commit_template_encoded(self):
116
64
        """Test building a commit message template"""
117
65
        working_tree = self.make_uncommitted_tree()
142
90
  hell\u00d8
143
91
""".encode('utf8') in template)
144
92
 
145
 
    def make_do_nothing_editor(self):
 
93
    def setUp(self):
 
94
        super(MsgEditorTest, self).setUp()
 
95
        self._bzr_editor = os.environ.get('BZR_EDITOR', None)
 
96
 
 
97
    def tearDown(self):
 
98
        if self._bzr_editor is not None:
 
99
            os.environ['BZR_EDITOR'] = self._bzr_editor
 
100
        else:
 
101
            if os.environ.get('BZR_EDITOR', None) is not None:
 
102
                del os.environ['BZR_EDITOR']
 
103
        super(MsgEditorTest, self).tearDown()
 
104
 
 
105
    def test_run_editor(self):
146
106
        if sys.platform == "win32":
147
107
            f = file('fed.bat', 'w')
148
108
            f.write('@rem dummy fed')
149
109
            f.close()
150
 
            return 'fed.bat'
 
110
            os.environ['BZR_EDITOR'] = 'fed.bat'
151
111
        else:
152
112
            f = file('fed.sh', 'wb')
153
113
            f.write('#!/bin/sh\n')
154
114
            f.close()
155
115
            os.chmod('fed.sh', 0755)
156
 
            return './fed.sh'
 
116
            os.environ['BZR_EDITOR'] = './fed.sh'
157
117
 
158
 
    def test_run_editor(self):
159
 
        os.environ['BZR_EDITOR'] = self.make_do_nothing_editor()
160
118
        self.assertEqual(True, msgeditor._run_editor(''),
161
119
                         'Unable to run dummy fake editor')
162
120
 
204
162
        self.assertEqual('test message from fed\n',
205
163
                         msgeditor.edit_commit_message(''))
206
164
 
207
 
        mutter('edit_commit_message with ascii string infotext')
208
 
        self.assertEqual('test message from fed\n',
209
 
                         msgeditor.edit_commit_message('spam'))
210
 
 
211
165
        mutter('edit_commit_message with unicode infotext')
212
166
        self.assertEqual('test message from fed\n',
213
167
                         msgeditor.edit_commit_message(u'\u1234'))
251
205
            f.close()
252
206
 
253
207
            editors = list(msgeditor._get_editor())
254
 
            editors = [editor for (editor, cfg_src) in editors]
255
208
 
256
209
            self.assertEqual(['bzr_editor', 'config_editor', 'visual',
257
210
                              'editor'], editors[:4])
277
230
            else:
278
231
                os.environ['EDITOR'] = editor
279
232
 
280
 
    def test__run_editor_EACCES(self):
281
 
        """If running a configured editor raises EACESS, the user is warned."""
282
 
        os.environ['BZR_EDITOR'] = 'eacces.py'
283
 
        f = file('eacces.py', 'wb')
284
 
        f.write('# Not a real editor')
285
 
        f.close()
286
 
        # Make the fake editor unreadable (and unexecutable)
287
 
        os.chmod('eacces.py', 0)
288
 
        # Set $EDITOR so that _run_editor will terminate before trying real
289
 
        # editors.
290
 
        os.environ['EDITOR'] = self.make_do_nothing_editor()
291
 
        # Call _run_editor, capturing mutter.warning calls.
292
 
        warnings = []
293
 
        def warning(*args):
294
 
            if len(args) > 1:
295
 
                warnings.append(args[0] % args[1:])
296
 
            else:
297
 
                warnings.append(args[0])
298
 
        _warning = trace.warning
299
 
        trace.warning = warning
300
 
        try:
301
 
            msgeditor._run_editor('')
302
 
        finally:
303
 
            trace.warning = _warning
304
 
        self.assertStartsWith(warnings[0], 'Could not start editor "eacces.py"')
305
 
 
306
233
    def test__create_temp_file_with_commit_template(self):
307
234
        # check that commit template written properly
308
235
        # and has platform native line-endings (CRLF on win32)
318
245
                                    'infotext'])
319
246
        self.assertFileEqual(expected, msgfilename)
320
247
 
321
 
    def test__create_temp_file_with_commit_template_in_unicode_dir(self):
322
 
        self.requireFeature(tests.UnicodeFilenameFeature)
323
 
        if hasattr(self, 'info'):
324
 
            os.mkdir(self.info['directory'])
325
 
            os.chdir(self.info['directory'])
326
 
            msgeditor._create_temp_file_with_commit_template('infotext')
327
 
        else:
328
 
            raise TestNotApplicable('Test run elsewhere with non-ascii data.')
329
 
 
330
248
    def test__create_temp_file_with_empty_commit_template(self):
331
249
        # empty file
332
250
        create_file = msgeditor._create_temp_file_with_commit_template
338
256
    def test_unsupported_encoding_commit_message(self):
339
257
        old_env = osutils.set_or_unset_env('LANG', 'C')
340
258
        try:
341
 
            # LANG env variable has no effect on Windows
342
 
            # but some characters anyway cannot be represented
343
 
            # in default user encoding
344
 
            char = probe_bad_non_ascii(osutils.get_user_encoding())
345
 
            if char is None:
346
 
                raise TestSkipped('Cannot find suitable non-ascii character '
347
 
                    'for user_encoding (%s)' % osutils.get_user_encoding())
348
 
 
349
 
            self.make_fake_editor(message=char)
 
259
            self.make_fake_editor(message='\xff')
350
260
 
351
261
            working_tree = self.make_uncommitted_tree()
352
262
            self.assertRaises(errors.BadCommitMessageEncoding,
353
263
                              msgeditor.edit_commit_message, '')
354
264
        finally:
355
265
            osutils.set_or_unset_env('LANG', old_env)
356
 
 
357
 
    def test_generate_commit_message_template_no_hooks(self):
358
 
        commit_obj = commit.Commit()
359
 
        self.assertIs(None,
360
 
            msgeditor.generate_commit_message_template(commit_obj))
361
 
 
362
 
    def test_generate_commit_message_template_hook(self):
363
 
        msgeditor.hooks.install_named_hook("commit_message_template",
364
 
                lambda commit_obj, msg: "save me some typing\n", None)
365
 
        commit_obj = commit.Commit()
366
 
        self.assertEquals("save me some typing\n",
367
 
            msgeditor.generate_commit_message_template(commit_obj))
368
 
 
369
 
 
370
 
# GZ 2009-11-17: This wants moving to osutils when the errno checking code is
371
 
class TestPlatformErrnoWorkarounds(TestCaseInTempDir):
372
 
    """Ensuring workarounds enshrined in code actually serve a purpose"""
373
 
 
374
 
    def test_subprocess_call_bad_file(self):
375
 
        if sys.platform != "win32":
376
 
            raise TestNotApplicable("Workarounds for windows only")
377
 
        import subprocess, errno
378
 
        ERROR_BAD_EXE_FORMAT = 193
379
 
        file("textfile.txt", "w").close()
380
 
        e = self.assertRaises(WindowsError, subprocess.call, "textfile.txt")
381
 
        # Python2.4 used the 'winerror' as the errno, which confuses a lot of
382
 
        # our error trapping code. Make sure that we understand the mapping
383
 
        # correctly.
384
 
        if sys.version_info >= (2, 5):
385
 
            self.assertEqual(e.errno, errno.ENOEXEC)
386
 
            self.assertEqual(e.winerror, ERROR_BAD_EXE_FORMAT)
387
 
        else:
388
 
            self.assertEqual(e.errno, ERROR_BAD_EXE_FORMAT)