~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/msgeditor.py

  • Committer: Martin Pool
  • Date: 2007-08-31 05:32:00 UTC
  • mfrom: (2598.6.32 bzr-ci-verbose2)
  • mto: This revision was merged to the branch mainline in revision 2773.
  • Revision ID: mbp@sourcefrog.net-20070831053200-px49z9ajuv15dxpi
Merge commit --show-diff feature from Goffredo

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
    """
102
130
    msgfilename = None
103
131
    try:
104
132
        msgfilename, hasinfo = _create_temp_file_with_commit_template(
163
191
    :param infotext:    Text to be displayed at bottom of message
164
192
                        for the user's reference;
165
193
                        currently similar to 'bzr status'.
 
194
                        The text is already encoded.
166
195
 
167
196
    :param ignoreline:  The separator to use above the infotext.
168
197
 
169
198
    :param start_message:   The text to place above the separator, if any.
170
199
                            This will not be removed from the message
171
200
                            after the user has edited it.
 
201
                            The string is already encoded
172
202
 
173
203
    :return:    2-tuple (temp file name, hasinfo)
174
204
    """
179
209
    msgfile = os.fdopen(tmp_fileno, 'w')
180
210
    try:
181
211
        if start_message is not None:
182
 
            msgfile.write("%s\n" % start_message.encode(
183
 
                                       bzrlib.user_encoding, 'replace'))
 
212
            msgfile.write("%s\n" % start_message)
184
213
 
185
214
        if infotext is not None and infotext != "":
186
215
            hasinfo = True
187
 
            msgfile.write("\n\n%s\n\n%s" % (ignoreline,
188
 
                          infotext.encode(bzrlib.user_encoding,
189
 
                                                'replace')))
 
216
            msgfile.write("\n\n%s\n\n%s" %(ignoreline, infotext))
190
217
        else:
191
218
            hasinfo = False
192
219
    finally:
200
227
 
201
228
    Returns a unicode string containing the template.
202
229
    """
203
 
    # TODO: Should probably be given the WorkingTree not the branch
204
 
    #
205
230
    # TODO: make provision for this to be overridden or modified by a hook
206
231
    #
207
232
    # TODO: Rather than running the status command, should prepare a draft of
213
238
    show_tree_status(working_tree, specific_files=specific_files, 
214
239
                     to_file=status_tmp)
215
240
    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