~bzr-pqm/bzr/bzr.dev

5646.1.1 by Martin Pool
Use cmdline.split on BZR_EDITOR so that you can pass names including spaces.
1
# Copyright (C) 2005-2011 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1167 by Martin Pool
- split commit message editor functions out into own file
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1167 by Martin Pool
- split commit message editor functions out into own file
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1167 by Martin Pool
- split commit message editor functions out into own file
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1167 by Martin Pool
- split commit message editor functions out into own file
16
6379.6.7 by Jelmer Vernooij
Move importing from future until after doc string, otherwise the doc string will disappear.
17
"""Commit message editor support."""
18
6379.6.3 by Jelmer Vernooij
Use absolute_import.
19
from __future__ import absolute_import
1167 by Martin Pool
- split commit message editor functions out into own file
20
1185.85.2 by John Arbash Meinel
[patch] from Ivan Vilata i Balaguer: infotext should be encoded from unicode to flat strings
21
import codecs
1167 by Martin Pool
- split commit message editor functions out into own file
22
import os
1185.50.91 by John Arbash Meinel
Fix import order for msgeditor.py
23
from subprocess import call
1185.50.90 by John Arbash Meinel
[patch] Olaf Conradi: missing sys import in msgeditor.py after platform test fix
24
import sys
1442.1.3 by Robert Collins
move editor into the config file too
25
3224.5.33 by Andrew Bennetts
Tidy imports in bzrlib/msgeditor.py as suggested by John's review.
26
from bzrlib import (
5646.1.1 by Martin Pool
Use cmdline.split on BZR_EDITOR so that you can pass names including spaces.
27
    cmdline,
3224.5.33 by Andrew Bennetts
Tidy imports in bzrlib/msgeditor.py as suggested by John's review.
28
    config,
29
    osutils,
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
30
    trace,
5137.1.1 by Robert Collins
* ``bzr commit`` will prompt before using a commit message that was
31
    transport,
32
    ui,
3224.5.33 by Andrew Bennetts
Tidy imports in bzrlib/msgeditor.py as suggested by John's review.
33
    )
2625.9.4 by Daniel Watkins
Fixed editor commit message to die cleanly if a UnicodeDecodeError is thrown.
34
from bzrlib.errors import BzrError, BadCommitMessageEncoding
5622.3.2 by Jelmer Vernooij
Add more lazily usable hook points.
35
from bzrlib.hooks import Hooks
1167 by Martin Pool
- split commit message editor functions out into own file
36
1185.50.90 by John Arbash Meinel
[patch] Olaf Conradi: missing sys import in msgeditor.py after platform test fix
37
1167 by Martin Pool
- split commit message editor functions out into own file
38
def _get_editor():
39
    """Return a sequence of possible editor binaries for the current platform"""
1185.1.30 by Robert Collins
Accept and tweak David Clymers BZREDITOR support patch
40
    try:
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
41
        yield os.environ["BZR_EDITOR"], '$BZR_EDITOR'
1185.1.30 by Robert Collins
Accept and tweak David Clymers BZREDITOR support patch
42
    except KeyError:
43
        pass
44
5743.13.2 by Vincent Ladeuil
Use GlobalStack.
45
    e = config.GlobalStack().get('editor')
1167 by Martin Pool
- split commit message editor functions out into own file
46
    if e is not None:
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
47
        yield e, config.config_filename()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
48
1668.1.13 by Martin Pool
msgeditor and bzr info improvements (olaf)
49
    for varname in 'VISUAL', 'EDITOR':
1963.2.1 by Robey Pointer
remove usage of has_key()
50
        if varname in os.environ:
3910.1.2 by Andrew Bennetts
Fix thinko.
51
            yield os.environ[varname], '$' + varname
1185.1.30 by Robert Collins
Accept and tweak David Clymers BZREDITOR support patch
52
1684.1.7 by Martin Pool
(patch) better detection of the write commit message editor to use (mpe, robertc)
53
    if sys.platform == 'win32':
54
        for editor in 'wordpad.exe', 'notepad.exe':
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
55
            yield editor, None
1684.1.7 by Martin Pool
(patch) better detection of the write commit message editor to use (mpe, robertc)
56
    else:
1668.4.1 by Olaf Conradi
Make msgeditor invocation comply with Debian Policy.
57
        for editor in ['/usr/bin/editor', 'vi', 'pico', 'nano', 'joe']:
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
58
            yield editor, None
1167 by Martin Pool
- split commit message editor functions out into own file
59
60
61
def _run_editor(filename):
1168 by Martin Pool
- work properly when $EDITOR contains multiple words
62
    """Try to execute an editor to edit the commit message."""
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
63
    for candidate, candidate_source in _get_editor():
5646.1.1 by Martin Pool
Use cmdline.split on BZR_EDITOR so that you can pass names including spaces.
64
        edargs = cmdline.split(candidate)
1185.62.19 by John Arbash Meinel
Fix error when we can't find an editor
65
        try:
1711.4.2 by jfmeinel
current python may be running in a path that has a space, so properly quote the python exe name. for test_msgeditor
66
            ## mutter("trying editor: %r", (edargs +[filename]))
1185.62.19 by John Arbash Meinel
Fix error when we can't find an editor
67
            x = call(edargs + [filename])
68
        except OSError, e:
4948.2.2 by Martin Pool
If there's an OS error running a user-specified editor, always show it,
69
            if candidate_source is not None:
70
                # We tried this editor because some user configuration (an
71
                # environment variable or config file) said to try it.  Let
72
                # the user know their configuration is broken.
73
                trace.warning(
74
                    'Could not start editor "%s" (specified by %s): %s\n'
75
                    % (candidate, candidate_source, str(e)))
76
            continue
3376.1.1 by Martin Pool
Fix incorrect indentation (#220333)
77
            raise
1167 by Martin Pool
- split commit message editor functions out into own file
78
        if x == 0:
79
            return True
80
        elif x == 127:
81
            continue
82
        else:
83
            break
1684.1.7 by Martin Pool
(patch) better detection of the write commit message editor to use (mpe, robertc)
84
    raise BzrError("Could not start any editor.\nPlease specify one with:\n"
2135.1.3 by Matthew Fuller
Include $VISUAL in the list of env variables when we can't start an
85
                   " - $BZR_EDITOR\n - editor=/some/path in %s\n"
86
                   " - $VISUAL\n - $EDITOR" % \
1684.1.7 by Martin Pool
(patch) better detection of the write commit message editor to use (mpe, robertc)
87
                    config.config_filename())
1553.4.9 by Michael Ellerman
Make the "ignore line" in the commit message editor the "right" width, so
88
89
90
DEFAULT_IGNORE_LINE = "%(bar)s %(msg)s %(bar)s" % \
91
    { 'bar' : '-' * 14, 'msg' : 'This line and the following will be ignored' }
92
93
2258.3.1 by James Westby
Add a way to specify a template commit message.
94
def edit_commit_message(infotext, ignoreline=DEFAULT_IGNORE_LINE,
2598.6.12 by ghigo
Move the encoding of the commit message at the command line level
95
                        start_message=None):
1167 by Martin Pool
- split commit message editor functions out into own file
96
    """Let the user edit a commit message in a temp file.
97
98
    This is run if they don't give a message or
99
    message-containing file on the command line.
100
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
101
    :param infotext:    Text to be displayed at bottom of message
102
                        for the user's reference;
103
                        currently similar to 'bzr status'.
2598.6.17 by ghigo
Revert the behaviour of the function make_commit_message_template() and make_commit_message_template() to the original one.
104
105
    :param ignoreline:  The separator to use above the infotext.
106
107
    :param start_message:   The text to place above the separator, if any.
108
                            This will not be removed from the message
109
                            after the user has edited it.
110
111
    :return:    commit message or None.
112
    """
113
2598.6.18 by ghigo
Update the tests to the new *_encoded() functions
114
    if not start_message is None:
3224.5.1 by Andrew Bennetts
Lots of assorted hackery to reduce the number of imports for common operations. Improves 'rocks', 'st' and 'help' times by ~50ms on my laptop.
115
        start_message = start_message.encode(osutils.get_user_encoding())
116
    infotext = infotext.encode(osutils.get_user_encoding(), 'replace')
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
117
    return edit_commit_message_encoded(infotext, ignoreline, start_message)
2598.6.17 by ghigo
Revert the behaviour of the function make_commit_message_template() and make_commit_message_template() to the original one.
118
2598.6.21 by ghigo
updates on the basis of Jhon email
119
2598.6.17 by ghigo
Revert the behaviour of the function make_commit_message_template() and make_commit_message_template() to the original one.
120
def edit_commit_message_encoded(infotext, ignoreline=DEFAULT_IGNORE_LINE,
2598.6.23 by ghigo
Cosmetic clean up
121
                                start_message=None):
2598.6.17 by ghigo
Revert the behaviour of the function make_commit_message_template() and make_commit_message_template() to the original one.
122
    """Let the user edit a commit message in a temp file.
123
124
    This is run if they don't give a message or
125
    message-containing file on the command line.
126
127
    :param infotext:    Text to be displayed at bottom of message
128
                        for the user's reference;
129
                        currently similar to 'bzr status'.
2598.6.12 by ghigo
Move the encoding of the commit message at the command line level
130
                        The string is already encoded
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
131
132
    :param ignoreline:  The separator to use above the infotext.
133
134
    :param start_message:   The text to place above the separator, if any.
135
                            This will not be removed from the message
136
                            after the user has edited it.
2598.6.15 by ghigo
Update the param description
137
                            The string is already encoded
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
138
139
    :return:    commit message or None.
1167 by Martin Pool
- split commit message editor functions out into own file
140
    """
1704.2.21 by Martin Pool
Fix unbound local when handling failure to write message template
141
    msgfilename = None
1167 by Martin Pool
- split commit message editor functions out into own file
142
    try:
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
143
        msgfilename, hasinfo = _create_temp_file_with_commit_template(
2598.6.12 by ghigo
Move the encoding of the commit message at the command line level
144
                                    infotext, ignoreline, start_message)
5137.1.1 by Robert Collins
* ``bzr commit`` will prompt before using a commit message that was
145
        if not msgfilename:
146
            return None
147
        basename = osutils.basename(msgfilename)
6039.1.5 by Jelmer Vernooij
Add get_transport_from_url and get_transport_from_path functions.
148
        msg_transport = transport.get_transport_from_path(osutils.dirname(msgfilename))
5137.1.1 by Robert Collins
* ``bzr commit`` will prompt before using a commit message that was
149
        reference_content = msg_transport.get_bytes(basename)
150
        if not _run_editor(msgfilename):
151
            return None
152
        edited_content = msg_transport.get_bytes(basename)
153
        if edited_content == reference_content:
5416.1.10 by Martin Pool
Use confirm_action before proceeding with an unedited commit message template
154
            if not ui.ui_factory.confirm_action(
5863.6.1 by Jelmer Vernooij
Require a unicode prompt to be passed into all methods that prompt.
155
                u"Commit message was not edited, use anyway",
5416.1.10 by Martin Pool
Use confirm_action before proceeding with an unedited commit message template
156
                "bzrlib.msgeditor.unchanged",
157
                {}):
5137.1.2 by Robert Collins
Review feedback: add comment about return value and an additional test.
158
                # Returning "" makes cmd_commit raise 'empty commit message
159
                # specified' which is a reasonable error, given the user has
160
                # rejected using the unedited template.
5137.1.1 by Robert Collins
* ``bzr commit`` will prompt before using a commit message that was
161
                return ""
1167 by Martin Pool
- split commit message editor functions out into own file
162
        started = False
163
        msg = []
164
        lastline, nlines = 0, 0
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
165
        # codecs.open() ALWAYS opens file in binary mode but we need text mode
166
        # 'rU' mode useful when bzr.exe used on Cygwin (bialix 20070430)
167
        f = file(msgfilename, 'rU')
2625.9.4 by Daniel Watkins
Fixed editor commit message to die cleanly if a UnicodeDecodeError is thrown.
168
        try:
2765.1.2 by Ian Clatworthy
fix try/except/finally nesting for Python 2.4
169
            try:
3224.5.1 by Andrew Bennetts
Lots of assorted hackery to reduce the number of imports for common operations. Improves 'rocks', 'st' and 'help' times by ~50ms on my laptop.
170
                for line in codecs.getreader(osutils.get_user_encoding())(f):
2765.1.2 by Ian Clatworthy
fix try/except/finally nesting for Python 2.4
171
                    stripped_line = line.strip()
172
                    # strip empty line before the log message starts
173
                    if not started:
174
                        if stripped_line != "":
175
                            started = True
176
                        else:
177
                            continue
178
                    # check for the ignore line only if there
179
                    # is additional information at the end
180
                    if hasinfo and stripped_line == ignoreline:
181
                        break
182
                    nlines += 1
183
                    # keep track of the last line that had some content
2625.9.4 by Daniel Watkins
Fixed editor commit message to die cleanly if a UnicodeDecodeError is thrown.
184
                    if stripped_line != "":
2765.1.2 by Ian Clatworthy
fix try/except/finally nesting for Python 2.4
185
                        lastline = nlines
186
                    msg.append(line)
187
            except UnicodeDecodeError:
188
                raise BadCommitMessageEncoding()
2625.9.8 by Daniel Watkins
Updated as per poolie's !tweak.
189
        finally:
190
            f.close()
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
191
1393.3.3 by Jelmer Vernooij
Add test for empty commit messages.
192
        if len(msg) == 0:
1393.3.2 by Jelmer Vernooij
Fix error message when an empty commit message was specified (when using an editor). Previously bzr warned that it wanted either --message or --file.
193
            return ""
1167 by Martin Pool
- split commit message editor functions out into own file
194
        # delete empty lines at the end
195
        del msg[lastline:]
196
        # add a newline at the end, if needed
197
        if not msg[-1].endswith("\n"):
198
            return "%s%s" % ("".join(msg), "\n")
199
        else:
200
            return "".join(msg)
201
    finally:
202
        # delete the msg file in any case
1704.2.21 by Martin Pool
Fix unbound local when handling failure to write message template
203
        if msgfilename is not None:
204
            try:
205
                os.unlink(msgfilename)
206
            except IOError, e:
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
207
                trace.warning(
208
                    "failed to unlink %s: %s; ignored", msgfilename, e)
1167 by Martin Pool
- split commit message editor functions out into own file
209
1185.33.72 by Martin Pool
Fix commit message template for non-ascii files, and add test for handling of
210
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
211
def _create_temp_file_with_commit_template(infotext,
212
                                           ignoreline=DEFAULT_IGNORE_LINE,
5537.1.1 by Vincent Ladeuil
Create commit message files in TMPDIR instead of the current dir
213
                                           start_message=None,
214
                                           tmpdir=None):
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
215
    """Create temp file and write commit template in it.
216
5537.1.1 by Vincent Ladeuil
Create commit message files in TMPDIR instead of the current dir
217
    :param infotext: Text to be displayed at bottom of message for the
218
        user's reference; currently similar to 'bzr status'.  The text is
219
        already encoded.
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
220
221
    :param ignoreline:  The separator to use above the infotext.
222
5537.1.1 by Vincent Ladeuil
Create commit message files in TMPDIR instead of the current dir
223
    :param start_message: The text to place above the separator, if any.
224
        This will not be removed from the message after the user has edited
225
        it.  The string is already encoded
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
226
227
    :return:    2-tuple (temp file name, hasinfo)
228
    """
229
    import tempfile
230
    tmp_fileno, msgfilename = tempfile.mkstemp(prefix='bzr_log.',
5537.1.1 by Vincent Ladeuil
Create commit message files in TMPDIR instead of the current dir
231
                                               dir=tmpdir, text=True)
3004.1.4 by Daniel Watkins
Modified fix as suggested by John on-list.
232
    msgfile = os.fdopen(tmp_fileno, 'w')
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
233
    try:
234
        if start_message is not None:
2598.6.12 by ghigo
Move the encoding of the commit message at the command line level
235
            msgfile.write("%s\n" % start_message)
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
236
2598.6.20 by ghigo
Small clean up
237
        if infotext is not None and infotext != "":
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
238
            hasinfo = True
2598.6.12 by ghigo
Move the encoding of the commit message at the command line level
239
            msgfile.write("\n\n%s\n\n%s" %(ignoreline, infotext))
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
240
        else:
241
            hasinfo = False
242
    finally:
243
        msgfile.close()
244
245
    return (msgfilename, hasinfo)
246
2598.6.20 by ghigo
Small clean up
247
2598.6.17 by ghigo
Revert the behaviour of the function make_commit_message_template() and make_commit_message_template() to the original one.
248
def make_commit_message_template(working_tree, specific_files):
1185.33.72 by Martin Pool
Fix commit message template for non-ascii files, and add test for handling of
249
    """Prepare a template file for a commit into a branch.
250
2598.6.17 by ghigo
Revert the behaviour of the function make_commit_message_template() and make_commit_message_template() to the original one.
251
    Returns a unicode string containing the template.
1185.33.72 by Martin Pool
Fix commit message template for non-ascii files, and add test for handling of
252
    """
253
    # TODO: make provision for this to be overridden or modified by a hook
254
    #
255
    # TODO: Rather than running the status command, should prepare a draft of
256
    # the revision to be committed, then pause and ask the user to
257
    # confirm/write a message.
258
    from StringIO import StringIO       # must be unicode-safe
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
259
    from bzrlib.status import show_tree_status
2598.6.5 by ghigo
On the basis of the email from Martin, Aaron I changed the encoding logic
260
    status_tmp = StringIO()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
261
    show_tree_status(working_tree, specific_files=specific_files,
3968.1.1 by Colin D Bennett
Show all pending merge revisions in the commit message template.
262
                     to_file=status_tmp, verbose=True)
2598.6.17 by ghigo
Revert the behaviour of the function make_commit_message_template() and make_commit_message_template() to the original one.
263
    return status_tmp.getvalue()
264
265
266
def make_commit_message_template_encoded(working_tree, specific_files,
2598.6.30 by ghigo
- Updated the identation on the basis of Aaron suggestions
267
                                         diff=None, output_encoding='utf-8'):
2598.6.17 by ghigo
Revert the behaviour of the function make_commit_message_template() and make_commit_message_template() to the original one.
268
    """Prepare a template file for a commit into a branch.
269
270
    Returns an encoded string.
271
    """
272
    # TODO: make provision for this to be overridden or modified by a hook
273
    #
274
    # TODO: Rather than running the status command, should prepare a draft of
275
    # the revision to be committed, then pause and ask the user to
276
    # confirm/write a message.
277
    from StringIO import StringIO       # must be unicode-safe
278
    from bzrlib.diff import show_diff_trees
279
2598.6.24 by ghigo
update on the basis of Aaron suggestions
280
    template = make_commit_message_template(working_tree, specific_files)
281
    template = template.encode(output_encoding, "replace")
2598.6.17 by ghigo
Revert the behaviour of the function make_commit_message_template() and make_commit_message_template() to the original one.
282
2598.6.1 by ghigo
add support for the diff at the end of the commit messages
283
    if diff:
2598.6.5 by ghigo
On the basis of the email from Martin, Aaron I changed the encoding logic
284
        stream = StringIO()
2598.6.12 by ghigo
Move the encoding of the commit message at the command line level
285
        show_diff_trees(working_tree.basis_tree(),
2598.6.26 by ghigo
small cleanup
286
                        working_tree, stream, specific_files,
287
                        path_encoding=output_encoding)
2598.6.21 by ghigo
updates on the basis of Jhon email
288
        template = template + '\n' + stream.getvalue()
2598.6.12 by ghigo
Move the encoding of the commit message at the command line level
289
290
    return template
3642.2.1 by Jelmer Vernooij
Add simple commit message template hook.
291
292
293
class MessageEditorHooks(Hooks):
294
    """A dictionary mapping hook name to a list of callables for message editor
295
    hooks.
296
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
297
    e.g. ['commit_message_template'] is the list of items to be called to
3642.2.1 by Jelmer Vernooij
Add simple commit message template hook.
298
    generate a commit message template
299
    """
300
5622.3.10 by Jelmer Vernooij
Don't require arguments to hooks.
301
    def __init__(self):
3642.2.1 by Jelmer Vernooij
Add simple commit message template hook.
302
        """Create the default hooks.
303
304
        These are all empty initially.
305
        """
5622.3.10 by Jelmer Vernooij
Don't require arguments to hooks.
306
        Hooks.__init__(self, "bzrlib.msgeditor", "hooks")
5912.4.1 by Jonathan Riddell
Add commit message hook
307
        self.add_hook('set_commit_message',
308
            "Set a fixed commit message. "
5912.4.9 by Jonathan Riddell
make hook documentation match syntax
309
            "set_commit_message is called with the "
310
            "bzrlib.commit.Commit object (so you can also change e.g. revision "
311
            "properties by editing commit.builder._revprops) and the message "
312
            "so far. set_commit_message must return the message to use or None"
313
            " if it should use the message editor as normal.", (2, 4))
5622.3.2 by Jelmer Vernooij
Add more lazily usable hook points.
314
        self.add_hook('commit_message_template',
4119.3.2 by Robert Collins
Migrate existing hooks over to the new HookPoint infrastructure.
315
            "Called when a commit message is being generated. "
316
            "commit_message_template is called with the bzrlib.commit.Commit "
317
            "object and the message that is known so far. "
318
            "commit_message_template must return a new message to use (which "
5909.1.1 by Jonathan Riddell
add missing docs bracket
319
            "could be the same as it was given). When there are multiple "
4119.3.2 by Robert Collins
Migrate existing hooks over to the new HookPoint infrastructure.
320
            "hooks registered for commit_message_template, they are chained "
321
            "with the result from the first passed into the second, and so "
5622.3.2 by Jelmer Vernooij
Add more lazily usable hook points.
322
            "on.", (1, 10))
323
324
5622.3.10 by Jelmer Vernooij
Don't require arguments to hooks.
325
hooks = MessageEditorHooks()
3642.2.1 by Jelmer Vernooij
Add simple commit message template hook.
326
5912.4.1 by Jonathan Riddell
Add commit message hook
327
5912.4.8 by Jonathan Riddell
make set_commit_message hook syntax more consistent with generate_commit_message_template
328
def set_commit_message(commit, start_message=None):
5912.4.1 by Jonathan Riddell
Add commit message hook
329
    """Sets the commit message.
330
    :param commit: Commit object for the active commit.
5912.4.2 by Jonathan Riddell
remove debugging
331
    :return: The commit message or None to continue using the message editor
5912.4.1 by Jonathan Riddell
Add commit message hook
332
    """
5912.4.8 by Jonathan Riddell
make set_commit_message hook syntax more consistent with generate_commit_message_template
333
    start_message = None
5912.4.1 by Jonathan Riddell
Add commit message hook
334
    for hook in hooks['set_commit_message']:
5912.4.8 by Jonathan Riddell
make set_commit_message hook syntax more consistent with generate_commit_message_template
335
        start_message = hook(commit, start_message)
336
    return start_message
3642.2.1 by Jelmer Vernooij
Add simple commit message template hook.
337
5912.4.12 by Jonathan Riddell
correct spacing
338
3642.2.1 by Jelmer Vernooij
Add simple commit message template hook.
339
def generate_commit_message_template(commit, start_message=None):
340
    """Generate a commit message template.
341
342
    :param commit: Commit object for the active commit.
343
    :param start_message: Message to start with.
344
    :return: A start commit message or None for an empty start commit message.
345
    """
346
    start_message = None
347
    for hook in hooks['commit_message_template']:
3642.2.2 by Jelmer Vernooij
Add tests for commit_message_template hooks.
348
        start_message = hook(commit, start_message)
3642.2.1 by Jelmer Vernooij
Add simple commit message template hook.
349
    return start_message