~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_msgeditor.py

NEWS section template into a separate file

Show diffs side-by-side

added added

removed removed

Lines of Context:
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
"""Test commit message editor.
18
18
"""
20
20
import os
21
21
import sys
22
22
 
23
 
import bzrlib
24
23
from bzrlib import (
 
24
    commit,
25
25
    errors,
26
26
    msgeditor,
27
27
    osutils,
28
28
    tests,
 
29
    trace,
29
30
    )
30
31
from bzrlib.branch import Branch
31
32
from bzrlib.config import ensure_config_dir_exists, config_filename
34
35
    edit_commit_message_encoded
35
36
)
36
37
from bzrlib.tests import (
37
 
    iter_suite_tests,
38
 
    probe_bad_non_ascii,
39
 
    split_suite_by_re,
40
38
    TestCaseWithTransport,
41
39
    TestNotApplicable,
42
40
    TestSkipped,
 
41
    multiply_tests,
 
42
    probe_bad_non_ascii,
 
43
    split_suite_by_re,
43
44
    )
44
 
from bzrlib.tests.EncodingAdapter import EncodingTestAdapter
 
45
from bzrlib.tests.EncodingAdapter import encoding_scenarios
45
46
from bzrlib.trace import mutter
46
47
 
47
48
 
49
50
    """Parameterize the test for tempfile creation with different encodings."""
50
51
    to_adapt, result = split_suite_by_re(standard_tests,
51
52
        "test__create_temp_file_with_commit_template_in_unicode_dir")
52
 
    for test in iter_suite_tests(to_adapt):
53
 
        result.addTests(EncodingTestAdapter().adapt(test))
54
 
    return result
 
53
    return multiply_tests(to_adapt, encoding_scenarios, result)
55
54
 
56
55
 
57
56
class MsgEditorTest(TestCaseWithTransport):
68
67
                "filesystem encoding %s" % sys.getfilesystemencoding())
69
68
        working_tree.add(filename)
70
69
        return working_tree
71
 
    
 
70
 
72
71
    def test_commit_template(self):
73
72
        """Test building a commit message template"""
74
73
        working_tree = self.make_uncommitted_tree()
80
79
  hell\u00d8
81
80
""")
82
81
 
 
82
    def make_multiple_pending_tree(self):
 
83
        from bzrlib import config
 
84
        config.GlobalConfig().set_user_option('email',
 
85
                                              'Bilbo Baggins <bb@hobbit.net>')
 
86
        tree = self.make_branch_and_tree('a')
 
87
        tree.commit('Initial checkin.', timestamp=1230912900, timezone=0)
 
88
        tree2 = tree.bzrdir.clone('b').open_workingtree()
 
89
        tree.commit('Minor tweak.', timestamp=1231977840, timezone=0)
 
90
        tree2.commit('Feature X work.', timestamp=1233186240, timezone=0)
 
91
        tree3 = tree2.bzrdir.clone('c').open_workingtree()
 
92
        tree2.commit('Feature X finished.', timestamp=1233187680, timezone=0)
 
93
        tree3.commit('Feature Y, based on initial X work.',
 
94
                     timestamp=1233285960, timezone=0)
 
95
        tree.merge_from_branch(tree2.branch)
 
96
        tree.merge_from_branch(tree3.branch)
 
97
        return tree
 
98
 
 
99
    def test_commit_template_pending_merges(self):
 
100
        """Test building a commit message template when there are pending
 
101
        merges.  The commit message should show all pending merge revisions,
 
102
        as does 'status -v', not only the merge tips.
 
103
        """
 
104
        working_tree = self.make_multiple_pending_tree()
 
105
        template = msgeditor.make_commit_message_template(working_tree, None)
 
106
        self.assertEqualDiff(template,
 
107
u"""\
 
108
pending merges:
 
109
  Bilbo Baggins 2009-01-29 Feature X finished.
 
110
    Bilbo Baggins 2009-01-28 Feature X work.
 
111
  Bilbo Baggins 2009-01-30 Feature Y, based on initial X work.
 
112
""")
 
113
 
83
114
    def test_commit_template_encoded(self):
84
115
        """Test building a commit message template"""
85
116
        working_tree = self.make_uncommitted_tree()
110
141
  hell\u00d8
111
142
""".encode('utf8') in template)
112
143
 
113
 
    def test_run_editor(self):
 
144
    def make_do_nothing_editor(self):
114
145
        if sys.platform == "win32":
115
146
            f = file('fed.bat', 'w')
116
147
            f.write('@rem dummy fed')
117
148
            f.close()
118
 
            os.environ['BZR_EDITOR'] = 'fed.bat'
 
149
            return 'fed.bat'
119
150
        else:
120
151
            f = file('fed.sh', 'wb')
121
152
            f.write('#!/bin/sh\n')
122
153
            f.close()
123
154
            os.chmod('fed.sh', 0755)
124
 
            os.environ['BZR_EDITOR'] = './fed.sh'
 
155
            return './fed.sh'
125
156
 
 
157
    def test_run_editor(self):
 
158
        os.environ['BZR_EDITOR'] = self.make_do_nothing_editor()
126
159
        self.assertEqual(True, msgeditor._run_editor(''),
127
160
                         'Unable to run dummy fake editor')
128
161
 
217
250
            f.close()
218
251
 
219
252
            editors = list(msgeditor._get_editor())
 
253
            editors = [editor for (editor, cfg_src) in editors]
220
254
 
221
255
            self.assertEqual(['bzr_editor', 'config_editor', 'visual',
222
256
                              'editor'], editors[:4])
242
276
            else:
243
277
                os.environ['EDITOR'] = editor
244
278
 
 
279
    def test__run_editor_EACCES(self):
 
280
        """If running a configured editor raises EACESS, the user is warned."""
 
281
        os.environ['BZR_EDITOR'] = 'eacces.py'
 
282
        f = file('eacces.py', 'wb')
 
283
        f.write('# Not a real editor')
 
284
        f.close()
 
285
        # Make the fake editor unreadable (and unexecutable)
 
286
        os.chmod('eacces.py', 0)
 
287
        # Set $EDITOR so that _run_editor will terminate before trying real
 
288
        # editors.
 
289
        os.environ['EDITOR'] = self.make_do_nothing_editor()
 
290
        # Call _run_editor, capturing mutter.warning calls.
 
291
        warnings = []
 
292
        def warning(*args):
 
293
            warnings.append(args[0] % args[1:])
 
294
        _warning = trace.warning
 
295
        trace.warning = warning
 
296
        try:
 
297
            msgeditor._run_editor('')
 
298
        finally:
 
299
            trace.warning = _warning
 
300
        self.assertStartsWith(warnings[0], 'Could not start editor "eacces.py"')
 
301
 
245
302
    def test__create_temp_file_with_commit_template(self):
246
303
        # check that commit template written properly
247
304
        # and has platform native line-endings (CRLF on win32)
280
337
            # LANG env variable has no effect on Windows
281
338
            # but some characters anyway cannot be represented
282
339
            # in default user encoding
283
 
            char = probe_bad_non_ascii(bzrlib.user_encoding)
 
340
            char = probe_bad_non_ascii(osutils.get_user_encoding())
284
341
            if char is None:
285
342
                raise TestSkipped('Cannot find suitable non-ascii character '
286
 
                    'for user_encoding (%s)' % bzrlib.user_encoding)
 
343
                    'for user_encoding (%s)' % osutils.get_user_encoding())
287
344
 
288
345
            self.make_fake_editor(message=char)
289
346
 
292
349
                              msgeditor.edit_commit_message, '')
293
350
        finally:
294
351
            osutils.set_or_unset_env('LANG', old_env)
 
352
 
 
353
    def test_generate_commit_message_template_no_hooks(self):
 
354
        commit_obj = commit.Commit()
 
355
        self.assertIs(None,
 
356
            msgeditor.generate_commit_message_template(commit_obj))
 
357
 
 
358
    def test_generate_commit_message_template_hook(self):
 
359
        def restoreDefaults():
 
360
            msgeditor.hooks['commit_message_template'] = []
 
361
        self.addCleanup(restoreDefaults)
 
362
        msgeditor.hooks.install_named_hook("commit_message_template",
 
363
                lambda commit_obj, msg: "save me some typing\n", None)
 
364
        commit_obj = commit.Commit()
 
365
        self.assertEquals("save me some typing\n",
 
366
            msgeditor.generate_commit_message_template(commit_obj))