~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_msgeditor.py

Initial commit for russian version of documents.

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., 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
"""
20
20
import os
21
21
import sys
22
22
 
 
23
import bzrlib
23
24
from bzrlib import (
24
 
    commit,
25
25
    errors,
26
26
    msgeditor,
27
27
    osutils,
28
28
    tests,
29
 
    trace,
30
29
    )
31
30
from bzrlib.branch import Branch
32
31
from bzrlib.config import ensure_config_dir_exists, config_filename
35
34
    edit_commit_message_encoded
36
35
)
37
36
from bzrlib.tests import (
 
37
    iter_suite_tests,
 
38
    probe_bad_non_ascii,
 
39
    split_suite_by_re,
38
40
    TestCaseWithTransport,
39
41
    TestNotApplicable,
40
42
    TestSkipped,
41
 
    multiply_tests,
42
 
    probe_bad_non_ascii,
43
 
    split_suite_by_re,
44
43
    )
45
 
from bzrlib.tests.EncodingAdapter import encoding_scenarios
 
44
from bzrlib.tests.EncodingAdapter import EncodingTestAdapter
46
45
from bzrlib.trace import mutter
47
46
 
48
47
 
50
49
    """Parameterize the test for tempfile creation with different encodings."""
51
50
    to_adapt, result = split_suite_by_re(standard_tests,
52
51
        "test__create_temp_file_with_commit_template_in_unicode_dir")
53
 
    return multiply_tests(to_adapt, encoding_scenarios, result)
 
52
    for test in iter_suite_tests(to_adapt):
 
53
        result.addTests(EncodingTestAdapter().adapt(test))
 
54
    return result
54
55
 
55
56
 
56
57
class MsgEditorTest(TestCaseWithTransport):
67
68
                "filesystem encoding %s" % sys.getfilesystemencoding())
68
69
        working_tree.add(filename)
69
70
        return working_tree
70
 
 
 
71
    
71
72
    def test_commit_template(self):
72
73
        """Test building a commit message template"""
73
74
        working_tree = self.make_uncommitted_tree()
79
80
  hell\u00d8
80
81
""")
81
82
 
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
 
 
114
83
    def test_commit_template_encoded(self):
115
84
        """Test building a commit message template"""
116
85
        working_tree = self.make_uncommitted_tree()
141
110
  hell\u00d8
142
111
""".encode('utf8') in template)
143
112
 
144
 
    def make_do_nothing_editor(self):
 
113
    def test_run_editor(self):
145
114
        if sys.platform == "win32":
146
115
            f = file('fed.bat', 'w')
147
116
            f.write('@rem dummy fed')
148
117
            f.close()
149
 
            return 'fed.bat'
 
118
            os.environ['BZR_EDITOR'] = 'fed.bat'
150
119
        else:
151
120
            f = file('fed.sh', 'wb')
152
121
            f.write('#!/bin/sh\n')
153
122
            f.close()
154
123
            os.chmod('fed.sh', 0755)
155
 
            return './fed.sh'
 
124
            os.environ['BZR_EDITOR'] = './fed.sh'
156
125
 
157
 
    def test_run_editor(self):
158
 
        os.environ['BZR_EDITOR'] = self.make_do_nothing_editor()
159
126
        self.assertEqual(True, msgeditor._run_editor(''),
160
127
                         'Unable to run dummy fake editor')
161
128
 
250
217
            f.close()
251
218
 
252
219
            editors = list(msgeditor._get_editor())
253
 
            editors = [editor for (editor, cfg_src) in editors]
254
220
 
255
221
            self.assertEqual(['bzr_editor', 'config_editor', 'visual',
256
222
                              'editor'], editors[:4])
276
242
            else:
277
243
                os.environ['EDITOR'] = editor
278
244
 
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
 
 
302
245
    def test__create_temp_file_with_commit_template(self):
303
246
        # check that commit template written properly
304
247
        # and has platform native line-endings (CRLF on win32)
337
280
            # LANG env variable has no effect on Windows
338
281
            # but some characters anyway cannot be represented
339
282
            # in default user encoding
340
 
            char = probe_bad_non_ascii(osutils.get_user_encoding())
 
283
            char = probe_bad_non_ascii(bzrlib.user_encoding)
341
284
            if char is None:
342
285
                raise TestSkipped('Cannot find suitable non-ascii character '
343
 
                    'for user_encoding (%s)' % osutils.get_user_encoding())
 
286
                    'for user_encoding (%s)' % bzrlib.user_encoding)
344
287
 
345
288
            self.make_fake_editor(message=char)
346
289
 
349
292
                              msgeditor.edit_commit_message, '')
350
293
        finally:
351
294
            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))