~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/msgeditor.py

  • Committer: ghigo
  • Date: 2007-07-16 17:52:07 UTC
  • mto: (2772.1.1 show-diff)
  • mto: This revision was merged to the branch mainline in revision 2773.
  • Revision ID: ghigo@venice-20070716175207-d1d8mmetgg8krcbd
On the basis of the email from Martin, Aaron I changed the encoding logic
in the function make_commit_message_template()
- in the diff, if the line is an header is decoded as UTF8
- otherwise the line is decoded as bzrlib.user_encoding
the rationale is that the message is already encoded as bzrlib.user_encoding
during the writing.
So the header which is know the encoding are correctly decoded. For the
other data, the decoding is the same of one which is used during the 
file writing in order do minimize the encoding/decoding effect.

In order to move the user encoding at the UI level, the parameter user_encoding
is added to the functions

- make_commit_message_template 
- _create_temp_file_with_commit_template
- edit_commit_message


Finally, I also added a paragraph to the tutorial about the option, and added
another while I was there (thank to James Westby)

Show diffs side-by-side

added added

removed removed

Lines of Context:
81
81
 
82
82
 
83
83
def edit_commit_message(infotext, ignoreline=DEFAULT_IGNORE_LINE,
84
 
                        start_message=None):
 
84
                        start_message=None, user_encoding=bzrlib.user_encoding):
85
85
    """Let the user edit a commit message in a temp file.
86
86
 
87
87
    This is run if they don't give a message or
97
97
                            This will not be removed from the message
98
98
                            after the user has edited it.
99
99
 
 
100
    :user_encoding:     message encoding
 
101
 
100
102
    :return:    commit message or None.
101
103
    """
102
104
    msgfilename = None
103
105
    try:
104
106
        msgfilename, hasinfo = _create_temp_file_with_commit_template(
105
 
                                    infotext, ignoreline, start_message)
 
107
                                    infotext, ignoreline, start_message,
 
108
                                    user_encoding)
106
109
 
107
110
        if not msgfilename or not _run_editor(msgfilename):
108
111
            return None
113
116
        # codecs.open() ALWAYS opens file in binary mode but we need text mode
114
117
        # 'rU' mode useful when bzr.exe used on Cygwin (bialix 20070430)
115
118
        f = file(msgfilename, 'rU')
116
 
        for line in codecs.getreader(bzrlib.user_encoding)(f):
 
119
        for line in codecs.getreader(user_encoding)(f):
117
120
            stripped_line = line.strip()
118
121
            # strip empty line before the log message starts
119
122
            if not started:
152
155
 
153
156
def _create_temp_file_with_commit_template(infotext,
154
157
                                           ignoreline=DEFAULT_IGNORE_LINE,
155
 
                                           start_message=None):
 
158
                                           start_message=None,
 
159
                                           user_encoding=bzrlib.user_encoding):
156
160
    """Create temp file and write commit template in it.
157
161
 
158
162
    :param infotext:    Text to be displayed at bottom of message
165
169
                            This will not be removed from the message
166
170
                            after the user has edited it.
167
171
 
 
172
    :user_encoding:     message encoding
 
173
 
168
174
    :return:    2-tuple (temp file name, hasinfo)
169
175
    """
170
176
    import tempfile
175
181
    try:
176
182
        if start_message is not None:
177
183
            msgfile.write("%s\n" % start_message.encode(
178
 
                                       bzrlib.user_encoding, 'replace'))
 
184
                                       user_encoding, 'replace'))
179
185
 
180
186
        if infotext is not None and infotext != "":
181
187
            hasinfo = True
182
188
            msgfile.write("\n\n%s\n\n%s" % (ignoreline,
183
 
                          infotext.encode(bzrlib.user_encoding,
 
189
                          infotext.encode(user_encoding,
184
190
                                                'replace')))
185
191
        else:
186
192
            hasinfo = False
190
196
    return (msgfilename, hasinfo)
191
197
 
192
198
 
193
 
def make_commit_message_template(working_tree, specific_files, diff=False):
 
199
def make_commit_message_template(working_tree, specific_files, diff=False,
 
200
                                 user_encoding=bzrlib.user_encoding):
194
201
    """Prepare a template file for a commit into a branch.
195
202
 
196
203
    Returns a unicode string containing the template.
204
211
    # confirm/write a message.
205
212
    from StringIO import StringIO       # must be unicode-safe
206
213
    from bzrlib.status import show_tree_status
207
 
    class UnicodeStringIO(StringIO):
208
 
        def __init__(self, buf='', decoding='utf8'):
209
 
                StringIO.__init__(self, buf)
210
 
                self._usio_decoding = decoding
211
 
 
212
 
        def write(self, s):
213
 
            if not isinstance(s, unicode):
214
 
                s = s.decode(self._usio_decoding, "replace")
215
 
            StringIO.write(self, s)
216
 
    status_tmp = UnicodeStringIO()
 
214
    status_tmp = StringIO()
217
215
    show_tree_status(working_tree, specific_files=specific_files, 
218
216
                     to_file=status_tmp)
219
217
    if diff:
 
218
        from bzrlib.diff import show_diff_trees
 
219
        stream = StringIO()
220
220
        status_tmp.write(u"\n")
221
 
        from bzrlib.diff import show_diff_trees
222
221
        show_diff_trees(working_tree.basis_tree(), working_tree,
223
 
                    status_tmp,
224
 
                    specific_files)
 
222
                    stream, specific_files)
 
223
 
 
224
        stream.seek(0,0)
 
225
        for l in stream.readlines():
 
226
            if ( l.startswith("===") or l.startswith("---") or
 
227
                 l.startswith("+++") ):
 
228
                    # the header are utf8 encoded
 
229
                    status_tmp.write(l.decode("utf8"))
 
230
            else:
 
231
                    status_tmp.write(l.decode(user_encoding, "replace"))
225
232
 
226
233
    return status_tmp.getvalue()