~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/msgeditor.py

  • Committer: Alexander Belchenko
  • Date: 2007-04-30 19:52:44 UTC
  • mto: This revision was merged to the branch mainline in revision 2478.
  • Revision ID: bialix@ukr.net-20070430195244-pxc5r3x72ckh027e
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added

Show diffs side-by-side

added added

removed removed

Lines of Context:
87
87
    This is run if they don't give a message or
88
88
    message-containing file on the command line.
89
89
 
90
 
    infotext:
91
 
        Text to be displayed at bottom of message for
92
 
        the user's reference; currently similar to
93
 
        'bzr status'.
94
 
 
95
 
    ignoreline:
96
 
        The separator to use above the infotext.
97
 
 
98
 
    start_message:
99
 
        The text to place above the separator, if any. This will not be
100
 
        removed from the message after the user has edited it.
 
90
    :param infotext:    Text to be displayed at bottom of message
 
91
                        for the user's reference;
 
92
                        currently similar to 'bzr status'.
 
93
 
 
94
    :param ignoreline:  The separator to use above the infotext.
 
95
 
 
96
    :param start_message:   The text to place above the separator, if any.
 
97
                            This will not be removed from the message
 
98
                            after the user has edited it.
 
99
 
 
100
    :return:    commit message or None.
101
101
    """
102
 
    import tempfile
103
 
 
104
102
    msgfilename = None
105
103
    try:
106
 
        tmp_fileno, msgfilename = tempfile.mkstemp(prefix='bzr_log.',
107
 
                                                   dir=u'.',
108
 
                                                   text=True)
109
 
        msgfile = os.fdopen(tmp_fileno, 'w')
110
 
        try:
111
 
            if start_message is not None:
112
 
                msgfile.write("%s\n" % start_message.encode(
113
 
                                           bzrlib.user_encoding, 'replace'))
114
 
 
115
 
            if infotext is not None and infotext != "":
116
 
                hasinfo = True
117
 
                msgfile.write("\n\n%s\n\n%s" % (ignoreline,
118
 
                              infotext.encode(bzrlib.user_encoding,
119
 
                                                    'replace')))
120
 
            else:
121
 
                hasinfo = False
122
 
        finally:
123
 
            msgfile.close()
124
 
 
125
 
        if not _run_editor(msgfilename):
 
104
        msgfilename, hasinfo = _create_temp_file_with_commit_template(
 
105
                                    infotext, ignoreline, start_message)
 
106
 
 
107
        if not msgfilename or not _run_editor(msgfilename):
126
108
            return None
127
109
        
128
110
        started = False
129
111
        msg = []
130
112
        lastline, nlines = 0, 0
131
 
        for line in codecs.open(msgfilename, 'r', bzrlib.user_encoding):
 
113
        # codecs.open() ALWAYS opens file in binary mode but we need text mode
 
114
        # 'rU' mode useful when bzr.exe used on Cygwin (bialix 20070430)
 
115
        f = file(msgfilename, 'rU')
 
116
        for line in codecs.getreader(bzrlib.user_encoding)(f):
132
117
            stripped_line = line.strip()
133
118
            # strip empty line before the log message starts
134
119
            if not started:
145
130
            if stripped_line != "":
146
131
                lastline = nlines
147
132
            msg.append(line)
148
 
            
 
133
        f.close()
 
134
 
149
135
        if len(msg) == 0:
150
136
            return ""
151
137
        # delete empty lines at the end
164
150
                warning("failed to unlink %s: %s; ignored", msgfilename, e)
165
151
 
166
152
 
 
153
def _create_temp_file_with_commit_template(infotext,
 
154
                                           ignoreline=DEFAULT_IGNORE_LINE,
 
155
                                           start_message=None):
 
156
    """Create temp file and write commit template in it.
 
157
 
 
158
    :param infotext:    Text to be displayed at bottom of message
 
159
                        for the user's reference;
 
160
                        currently similar to 'bzr status'.
 
161
 
 
162
    :param ignoreline:  The separator to use above the infotext.
 
163
 
 
164
    :param start_message:   The text to place above the separator, if any.
 
165
                            This will not be removed from the message
 
166
                            after the user has edited it.
 
167
 
 
168
    :return:    2-tuple (temp file name, hasinfo)
 
169
    """
 
170
    import tempfile
 
171
    tmp_fileno, msgfilename = tempfile.mkstemp(prefix='bzr_log.',
 
172
                                               dir=u'.',
 
173
                                               text=True)
 
174
    msgfile = os.fdopen(tmp_fileno, 'w')
 
175
    try:
 
176
        if start_message is not None:
 
177
            msgfile.write("%s\n" % start_message.encode(
 
178
                                       bzrlib.user_encoding, 'replace'))
 
179
 
 
180
        if infotext is not None and infotext != "":
 
181
            hasinfo = True
 
182
            msgfile.write("\n\n%s\n\n%s" % (ignoreline,
 
183
                          infotext.encode(bzrlib.user_encoding,
 
184
                                                'replace')))
 
185
        else:
 
186
            hasinfo = False
 
187
    finally:
 
188
        msgfile.close()
 
189
 
 
190
    return (msgfilename, hasinfo)
 
191
 
 
192
 
167
193
def make_commit_message_template(working_tree, specific_files):
168
194
    """Prepare a template file for a commit into a branch.
169
195