~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/msgeditor.py

  • Committer: Vincent Ladeuil
  • Date: 2007-07-22 15:44:59 UTC
  • mto: This revision was merged to the branch mainline in revision 2646.
  • Revision ID: v.ladeuil+lp@free.fr-20070722154459-520ws2gnifghkpgy
From review comments, use a private scheme for testing.

* bzrlib/transport/__init__.py:
(_unregister_urlparse_netloc_protocol): New function.

* bzrlib/tests/transport_util.py:
(InstrumentedTransport.__init__): Use a dedicated scheme.
(TestCaseWithConnectionHookedTransport.setUp): Reworked to
register the new transport.
(TestCaseWithConnectionHookedTransport.get_url): Use our dedicated
scheme.
(TestCaseWithConnectionHookedTransport.install_hooks,
TestCaseWithConnectionHookedTransport.reset_hooks): Registering
transport is setUp job.

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
 
26
26
import bzrlib
27
27
import bzrlib.config as config
28
 
from bzrlib.errors import BzrError, BadCommitMessageEncoding
 
28
from bzrlib.errors import BzrError
29
29
from bzrlib.trace import warning, mutter
30
30
 
31
31
 
99
99
 
100
100
    :return:    commit message or None.
101
101
    """
102
 
 
103
 
    if not start_message is None:
104
 
        start_message = start_message.encode(bzrlib.user_encoding)
105
 
    return edit_commit_message_encoded(infotext.encode(bzrlib.user_encoding),
106
 
                                       ignoreline, start_message)
107
 
 
108
 
 
109
 
def edit_commit_message_encoded(infotext, ignoreline=DEFAULT_IGNORE_LINE,
110
 
                                start_message=None):
111
 
    """Let the user edit a commit message in a temp file.
112
 
 
113
 
    This is run if they don't give a message or
114
 
    message-containing file on the command line.
115
 
 
116
 
    :param infotext:    Text to be displayed at bottom of message
117
 
                        for the user's reference;
118
 
                        currently similar to 'bzr status'.
119
 
                        The string is already encoded
120
 
 
121
 
    :param ignoreline:  The separator to use above the infotext.
122
 
 
123
 
    :param start_message:   The text to place above the separator, if any.
124
 
                            This will not be removed from the message
125
 
                            after the user has edited it.
126
 
                            The string is already encoded
127
 
 
128
 
    :return:    commit message or None.
129
 
    """
130
102
    msgfilename = None
131
103
    try:
132
104
        msgfilename, hasinfo = _create_temp_file_with_commit_template(
141
113
        # codecs.open() ALWAYS opens file in binary mode but we need text mode
142
114
        # 'rU' mode useful when bzr.exe used on Cygwin (bialix 20070430)
143
115
        f = file(msgfilename, 'rU')
144
 
        try:
145
 
            try:
146
 
                for line in codecs.getreader(bzrlib.user_encoding)(f):
147
 
                    stripped_line = line.strip()
148
 
                    # strip empty line before the log message starts
149
 
                    if not started:
150
 
                        if stripped_line != "":
151
 
                            started = True
152
 
                        else:
153
 
                            continue
154
 
                    # check for the ignore line only if there
155
 
                    # is additional information at the end
156
 
                    if hasinfo and stripped_line == ignoreline:
157
 
                        break
158
 
                    nlines += 1
159
 
                    # keep track of the last line that had some content
160
 
                    if stripped_line != "":
161
 
                        lastline = nlines
162
 
                    msg.append(line)
163
 
            except UnicodeDecodeError:
164
 
                raise BadCommitMessageEncoding()
165
 
        finally:
166
 
            f.close()
 
116
        for line in codecs.getreader(bzrlib.user_encoding)(f):
 
117
            stripped_line = line.strip()
 
118
            # strip empty line before the log message starts
 
119
            if not started:
 
120
                if stripped_line != "":
 
121
                    started = True
 
122
                else:
 
123
                    continue
 
124
            # check for the ignore line only if there
 
125
            # is additional information at the end
 
126
            if hasinfo and stripped_line == ignoreline:
 
127
                break
 
128
            nlines += 1
 
129
            # keep track of the last line that had some content
 
130
            if stripped_line != "":
 
131
                lastline = nlines
 
132
            msg.append(line)
 
133
        f.close()
167
134
 
168
135
        if len(msg) == 0:
169
136
            return ""
191
158
    :param infotext:    Text to be displayed at bottom of message
192
159
                        for the user's reference;
193
160
                        currently similar to 'bzr status'.
194
 
                        The text is already encoded.
195
161
 
196
162
    :param ignoreline:  The separator to use above the infotext.
197
163
 
198
164
    :param start_message:   The text to place above the separator, if any.
199
165
                            This will not be removed from the message
200
166
                            after the user has edited it.
201
 
                            The string is already encoded
202
167
 
203
168
    :return:    2-tuple (temp file name, hasinfo)
204
169
    """
209
174
    msgfile = os.fdopen(tmp_fileno, 'w')
210
175
    try:
211
176
        if start_message is not None:
212
 
            msgfile.write("%s\n" % start_message)
 
177
            msgfile.write("%s\n" % start_message.encode(
 
178
                                       bzrlib.user_encoding, 'replace'))
213
179
 
214
180
        if infotext is not None and infotext != "":
215
181
            hasinfo = True
216
 
            msgfile.write("\n\n%s\n\n%s" %(ignoreline, infotext))
 
182
            msgfile.write("\n\n%s\n\n%s" % (ignoreline,
 
183
                          infotext.encode(bzrlib.user_encoding,
 
184
                                                'replace')))
217
185
        else:
218
186
            hasinfo = False
219
187
    finally:
227
195
 
228
196
    Returns a unicode string containing the template.
229
197
    """
 
198
    # TODO: Should probably be given the WorkingTree not the branch
 
199
    #
230
200
    # TODO: make provision for this to be overridden or modified by a hook
231
201
    #
232
202
    # TODO: Rather than running the status command, should prepare a draft of
238
208
    show_tree_status(working_tree, specific_files=specific_files, 
239
209
                     to_file=status_tmp)
240
210
    return status_tmp.getvalue()
241
 
 
242
 
 
243
 
def make_commit_message_template_encoded(working_tree, specific_files,
244
 
                                         diff=None, output_encoding='utf-8'):
245
 
    """Prepare a template file for a commit into a branch.
246
 
 
247
 
    Returns an encoded string.
248
 
    """
249
 
    # TODO: make provision for this to be overridden or modified by a hook
250
 
    #
251
 
    # TODO: Rather than running the status command, should prepare a draft of
252
 
    # the revision to be committed, then pause and ask the user to
253
 
    # confirm/write a message.
254
 
    from StringIO import StringIO       # must be unicode-safe
255
 
    from bzrlib.diff import show_diff_trees
256
 
 
257
 
    template = make_commit_message_template(working_tree, specific_files)
258
 
    template = template.encode(output_encoding, "replace")
259
 
 
260
 
    if diff:
261
 
        stream = StringIO()
262
 
        show_diff_trees(working_tree.basis_tree(),
263
 
                        working_tree, stream, specific_files,
264
 
                        path_encoding=output_encoding)
265
 
        template = template + '\n' + stream.getvalue()
266
 
 
267
 
    return template