~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/msgeditor.py

  • Committer: John Arbash Meinel
  • Date: 2007-06-28 23:18:09 UTC
  • mfrom: (2562 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2566.
  • Revision ID: john@arbash-meinel.com-20070628231809-pqbt7puoqj8bl07b
[merge] bzr.dev 2562

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.', dir=u'.')
107
 
        msgfile = os.fdopen(tmp_fileno, 'w')
108
 
        try:
109
 
            if start_message is not None:
110
 
                msgfile.write("%s\n" % start_message.encode(
111
 
                                           bzrlib.user_encoding, 'replace'))
112
 
 
113
 
            if infotext is not None and infotext != "":
114
 
                hasinfo = True
115
 
                msgfile.write("\n\n%s\n\n%s" % (ignoreline,
116
 
                              infotext.encode(bzrlib.user_encoding,
117
 
                                                    'replace')))
118
 
            else:
119
 
                hasinfo = False
120
 
        finally:
121
 
            msgfile.close()
122
 
 
123
 
        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):
124
108
            return None
125
109
        
126
110
        started = False
127
111
        msg = []
128
112
        lastline, nlines = 0, 0
129
 
        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):
130
117
            stripped_line = line.strip()
131
118
            # strip empty line before the log message starts
132
119
            if not started:
143
130
            if stripped_line != "":
144
131
                lastline = nlines
145
132
            msg.append(line)
146
 
            
 
133
        f.close()
 
134
 
147
135
        if len(msg) == 0:
148
136
            return ""
149
137
        # delete empty lines at the end
162
150
                warning("failed to unlink %s: %s; ignored", msgfilename, e)
163
151
 
164
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
 
165
193
def make_commit_message_template(working_tree, specific_files):
166
194
    """Prepare a template file for a commit into a branch.
167
195