~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_msgeditor.py

  • Committer: Robert Collins
  • Date: 2007-07-15 15:40:37 UTC
  • mto: (2592.3.33 repository)
  • mto: This revision was merged to the branch mainline in revision 2624.
  • Revision ID: robertc@robertcollins.net-20070715154037-3ar8g89decddc9su
Make GraphIndex accept nodes as key, value, references, so that the method
signature is closer to what a simple key->value index delivers. Also
change the behaviour when the reference list count is zero to accept
key, value as nodes, and emit key, value to make it identical in that case
to a simple key->value index. This may not be a good idea, but for now it
seems ok.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005 Canonical Ltd
 
2
#
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
 
7
#
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU General Public License
 
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
 
16
 
 
17
"""Test commit message editor.
 
18
"""
 
19
 
 
20
import os
 
21
import sys
 
22
 
 
23
from bzrlib.branch import Branch
 
24
from bzrlib.config import ensure_config_dir_exists, config_filename
 
25
import bzrlib.msgeditor 
 
26
from bzrlib.tests import TestCaseWithTransport, TestSkipped
 
27
from bzrlib.trace import mutter
 
28
 
 
29
 
 
30
class MsgEditorTest(TestCaseWithTransport):
 
31
 
 
32
    def make_uncommitted_tree(self):
 
33
        """Build a branch with uncommitted unicode named changes in the cwd."""
 
34
        working_tree = self.make_branch_and_tree('.')
 
35
        b = working_tree.branch
 
36
        filename = u'hell\u00d8'
 
37
        try:
 
38
            self.build_tree_contents([(filename, 'contents of hello')])
 
39
        except UnicodeEncodeError:
 
40
            raise TestSkipped("can't build unicode working tree in "
 
41
                "filesystem encoding %s" % sys.getfilesystemencoding())
 
42
        working_tree.add(filename)
 
43
        return working_tree
 
44
    
 
45
    def test_commit_template(self):
 
46
        """Test building a commit message template"""
 
47
        working_tree = self.make_uncommitted_tree()
 
48
        template = bzrlib.msgeditor.make_commit_message_template(working_tree, None)
 
49
        self.assertEqualDiff(template,
 
50
u"""\
 
51
added:
 
52
  hell\u00d8
 
53
""")
 
54
 
 
55
    def setUp(self):
 
56
        super(MsgEditorTest, self).setUp()
 
57
        self._bzr_editor = os.environ.get('BZR_EDITOR', None)
 
58
 
 
59
    def tearDown(self):
 
60
        if self._bzr_editor is not None:
 
61
            os.environ['BZR_EDITOR'] = self._bzr_editor
 
62
        else:
 
63
            if os.environ.get('BZR_EDITOR', None) is not None:
 
64
                del os.environ['BZR_EDITOR']
 
65
        super(MsgEditorTest, self).tearDown()
 
66
 
 
67
    def test_run_editor(self):
 
68
        if sys.platform == "win32":
 
69
            f = file('fed.bat', 'w')
 
70
            f.write('@rem dummy fed')
 
71
            f.close()
 
72
            os.environ['BZR_EDITOR'] = 'fed.bat'
 
73
        else:
 
74
            f = file('fed.sh', 'wb')
 
75
            f.write('#!/bin/sh\n')
 
76
            f.close()
 
77
            os.chmod('fed.sh', 0755)
 
78
            os.environ['BZR_EDITOR'] = './fed.sh'
 
79
 
 
80
        self.assertEqual(True, bzrlib.msgeditor._run_editor(''),
 
81
                         'Unable to run dummy fake editor')
 
82
 
 
83
    def make_fake_editor(self):
 
84
        """Set up environment so that an editor will be a known script.
 
85
 
 
86
        Sets up BZR_EDITOR so that if an editor is spawned it will run a
 
87
        script that just adds a known message to the start of the file.
 
88
        """
 
89
        f = file('fed.py', 'wb')
 
90
        f.write('#!%s\n' % sys.executable)
 
91
        f.write("""\
 
92
import sys
 
93
if len(sys.argv) == 2:
 
94
    fn = sys.argv[1]
 
95
    f = file(fn, 'rb')
 
96
    s = f.read()
 
97
    f.close()
 
98
    f = file(fn, 'wb')
 
99
    f.write('test message from fed\\n')
 
100
    f.write(s)
 
101
    f.close()
 
102
""")
 
103
        f.close()
 
104
        if sys.platform == "win32":
 
105
            # [win32] make batch file and set BZR_EDITOR
 
106
            f = file('fed.bat', 'w')
 
107
            f.write("""\
 
108
@echo off
 
109
"%s" fed.py %%1
 
110
""" % sys.executable)
 
111
            f.close()
 
112
            os.environ['BZR_EDITOR'] = 'fed.bat'
 
113
        else:
 
114
            # [non-win32] make python script executable and set BZR_EDITOR
 
115
            os.chmod('fed.py', 0755)
 
116
            os.environ['BZR_EDITOR'] = './fed.py'
 
117
 
 
118
    def test_edit_commit_message(self):
 
119
        working_tree = self.make_uncommitted_tree()
 
120
        self.make_fake_editor()
 
121
 
 
122
        mutter('edit_commit_message without infotext')
 
123
        self.assertEqual('test message from fed\n',
 
124
                         bzrlib.msgeditor.edit_commit_message(''))
 
125
 
 
126
        mutter('edit_commit_message with unicode infotext')
 
127
        self.assertEqual('test message from fed\n',
 
128
                         bzrlib.msgeditor.edit_commit_message(u'\u1234'))
 
129
 
 
130
    def test_start_message(self):
 
131
        self.make_uncommitted_tree()
 
132
        self.make_fake_editor()
 
133
        self.assertEqual('test message from fed\nstart message\n',
 
134
                         bzrlib.msgeditor.edit_commit_message('',
 
135
                                              start_message='start message\n'))
 
136
        self.assertEqual('test message from fed\n',
 
137
                         bzrlib.msgeditor.edit_commit_message('',
 
138
                                              start_message=''))
 
139
 
 
140
    def test_deleted_commit_message(self):
 
141
        working_tree = self.make_uncommitted_tree()
 
142
 
 
143
        if sys.platform == 'win32':
 
144
            os.environ['BZR_EDITOR'] = 'cmd.exe /c del'
 
145
        else:
 
146
            os.environ['BZR_EDITOR'] = 'rm'
 
147
 
 
148
        self.assertRaises((IOError, OSError), bzrlib.msgeditor.edit_commit_message, '')
 
149
 
 
150
    def test__get_editor(self):
 
151
        # Test that _get_editor can return a decent list of items
 
152
        bzr_editor = os.environ.get('BZR_EDITOR')
 
153
        visual = os.environ.get('VISUAL')
 
154
        editor = os.environ.get('EDITOR')
 
155
        try:
 
156
            os.environ['BZR_EDITOR'] = 'bzr_editor'
 
157
            os.environ['VISUAL'] = 'visual'
 
158
            os.environ['EDITOR'] = 'editor'
 
159
 
 
160
            ensure_config_dir_exists()
 
161
            f = open(config_filename(), 'wb')
 
162
            f.write('editor = config_editor\n')
 
163
            f.close()
 
164
 
 
165
            editors = list(bzrlib.msgeditor._get_editor())
 
166
 
 
167
            self.assertEqual(['bzr_editor', 'config_editor', 'visual',
 
168
                              'editor'], editors[:4])
 
169
 
 
170
            if sys.platform == 'win32':
 
171
                self.assertEqual(['wordpad.exe', 'notepad.exe'], editors[4:])
 
172
            else:
 
173
                self.assertEqual(['/usr/bin/editor', 'vi', 'pico', 'nano',
 
174
                                  'joe'], editors[4:])
 
175
 
 
176
        finally:
 
177
            # Restore the environment
 
178
            if bzr_editor is None:
 
179
                del os.environ['BZR_EDITOR']
 
180
            else:
 
181
                os.environ['BZR_EDITOR'] = bzr_editor
 
182
            if visual is None:
 
183
                del os.environ['VISUAL']
 
184
            else:
 
185
                os.environ['VISUAL'] = visual
 
186
            if editor is None:
 
187
                del os.environ['EDITOR']
 
188
            else:
 
189
                os.environ['EDITOR'] = editor
 
190
 
 
191
    def test__create_temp_file_with_commit_template(self):
 
192
        # check that commit template written properly
 
193
        # and has platform native line-endings (CRLF on win32)
 
194
        create_file = bzrlib.msgeditor._create_temp_file_with_commit_template
 
195
        msgfilename, hasinfo = create_file('infotext','----','start message')
 
196
        self.assertNotEqual(None, msgfilename)
 
197
        self.assertTrue(hasinfo)
 
198
        expected = os.linesep.join(['start message',
 
199
                                    '',
 
200
                                    '',
 
201
                                    '----',
 
202
                                    '',
 
203
                                    'infotext'])
 
204
        self.assertFileEqual(expected, msgfilename)
 
205
 
 
206
    def test__create_temp_file_with_empty_commit_template(self):
 
207
        # empty file
 
208
        create_file = bzrlib.msgeditor._create_temp_file_with_commit_template
 
209
        msgfilename, hasinfo = create_file('')
 
210
        self.assertNotEqual(None, msgfilename)
 
211
        self.assertFalse(hasinfo)
 
212
        self.assertFileEqual('', msgfilename)