~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_msgeditor.py

  • Committer: Naoki INADA
  • Date: 2009-10-29 10:01:19 UTC
  • mto: (4634.97.3 2.0)
  • mto: This revision was merged to the branch mainline in revision 4798.
  • Revision ID: inada-n@klab.jp-20091029100119-uckv9t7ej2qrghw3
import doc-ja rev90

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
    tests,
 
29
    trace,
28
30
    )
29
31
from bzrlib.branch import Branch
30
32
from bzrlib.config import ensure_config_dir_exists, config_filename
33
35
    edit_commit_message_encoded
34
36
)
35
37
from bzrlib.tests import (
36
 
    probe_bad_non_ascii,
37
38
    TestCaseWithTransport,
 
39
    TestNotApplicable,
38
40
    TestSkipped,
 
41
    multiply_tests,
 
42
    probe_bad_non_ascii,
 
43
    split_suite_by_re,
39
44
    )
 
45
from bzrlib.tests.EncodingAdapter import encoding_scenarios
40
46
from bzrlib.trace import mutter
41
47
 
42
48
 
 
49
def load_tests(standard_tests, module, loader):
 
50
    """Parameterize the test for tempfile creation with different encodings."""
 
51
    to_adapt, result = split_suite_by_re(standard_tests,
 
52
        "test__create_temp_file_with_commit_template_in_unicode_dir")
 
53
    return multiply_tests(to_adapt, encoding_scenarios, result)
 
54
 
 
55
 
43
56
class MsgEditorTest(TestCaseWithTransport):
44
57
 
45
58
    def make_uncommitted_tree(self):
54
67
                "filesystem encoding %s" % sys.getfilesystemencoding())
55
68
        working_tree.add(filename)
56
69
        return working_tree
57
 
    
 
70
 
58
71
    def test_commit_template(self):
59
72
        """Test building a commit message template"""
60
73
        working_tree = self.make_uncommitted_tree()
66
79
  hell\u00d8
67
80
""")
68
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
 
69
114
    def test_commit_template_encoded(self):
70
115
        """Test building a commit message template"""
71
116
        working_tree = self.make_uncommitted_tree()
96
141
  hell\u00d8
97
142
""".encode('utf8') in template)
98
143
 
99
 
    def test_run_editor(self):
 
144
    def make_do_nothing_editor(self):
100
145
        if sys.platform == "win32":
101
146
            f = file('fed.bat', 'w')
102
147
            f.write('@rem dummy fed')
103
148
            f.close()
104
 
            os.environ['BZR_EDITOR'] = 'fed.bat'
 
149
            return 'fed.bat'
105
150
        else:
106
151
            f = file('fed.sh', 'wb')
107
152
            f.write('#!/bin/sh\n')
108
153
            f.close()
109
154
            os.chmod('fed.sh', 0755)
110
 
            os.environ['BZR_EDITOR'] = './fed.sh'
 
155
            return './fed.sh'
111
156
 
 
157
    def test_run_editor(self):
 
158
        os.environ['BZR_EDITOR'] = self.make_do_nothing_editor()
112
159
        self.assertEqual(True, msgeditor._run_editor(''),
113
160
                         'Unable to run dummy fake editor')
114
161
 
203
250
            f.close()
204
251
 
205
252
            editors = list(msgeditor._get_editor())
 
253
            editors = [editor for (editor, cfg_src) in editors]
206
254
 
207
255
            self.assertEqual(['bzr_editor', 'config_editor', 'visual',
208
256
                              'editor'], editors[:4])
228
276
            else:
229
277
                os.environ['EDITOR'] = editor
230
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
 
231
302
    def test__create_temp_file_with_commit_template(self):
232
303
        # check that commit template written properly
233
304
        # and has platform native line-endings (CRLF on win32)
243
314
                                    'infotext'])
244
315
        self.assertFileEqual(expected, msgfilename)
245
316
 
 
317
    def test__create_temp_file_with_commit_template_in_unicode_dir(self):
 
318
        self.requireFeature(tests.UnicodeFilenameFeature)
 
319
        if hasattr(self, 'info'):
 
320
            os.mkdir(self.info['directory'])
 
321
            os.chdir(self.info['directory'])
 
322
            msgeditor._create_temp_file_with_commit_template('infotext')
 
323
        else:
 
324
            raise TestNotApplicable('Test run elsewhere with non-ascii data.')
 
325
 
246
326
    def test__create_temp_file_with_empty_commit_template(self):
247
327
        # empty file
248
328
        create_file = msgeditor._create_temp_file_with_commit_template
257
337
            # LANG env variable has no effect on Windows
258
338
            # but some characters anyway cannot be represented
259
339
            # in default user encoding
260
 
            char = probe_bad_non_ascii(bzrlib.user_encoding)
 
340
            char = probe_bad_non_ascii(osutils.get_user_encoding())
261
341
            if char is None:
262
342
                raise TestSkipped('Cannot find suitable non-ascii character '
263
 
                    'for user_encoding (%s)' % bzrlib.user_encoding)
 
343
                    'for user_encoding (%s)' % osutils.get_user_encoding())
264
344
 
265
345
            self.make_fake_editor(message=char)
266
346
 
269
349
                              msgeditor.edit_commit_message, '')
270
350
        finally:
271
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))