/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
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
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
26
from . 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
    )
6734.1.20 by Jelmer Vernooij
Move errors.
34
from .errors import BzrError
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
35
from .hooks import Hooks
36
from .sixish import (
7045.4.21 by Jelmer Vernooij
Fix some msgeditor tests.
37
    BytesIO,
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
38
    StringIO,
39
    )
1167 by Martin Pool
- split commit message editor functions out into own file
40
1185.50.90 by John Arbash Meinel
[patch] Olaf Conradi: missing sys import in msgeditor.py after platform test fix
41
6734.1.20 by Jelmer Vernooij
Move errors.
42
class BadCommitMessageEncoding(BzrError):
43
44
    _fmt = 'The specified commit message contains characters unsupported by '\
45
        'the current encoding.'
46
47
1167 by Martin Pool
- split commit message editor functions out into own file
48
def _get_editor():
49
    """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
50
    try:
6622.1.28 by Jelmer Vernooij
More renames; commands in output, environment variables.
51
        yield os.environ["BRZ_EDITOR"], '$BRZ_EDITOR'
1185.1.30 by Robert Collins
Accept and tweak David Clymers BZREDITOR support patch
52
    except KeyError:
53
        pass
54
5743.13.2 by Vincent Ladeuil
Use GlobalStack.
55
    e = config.GlobalStack().get('editor')
1167 by Martin Pool
- split commit message editor functions out into own file
56
    if e is not None:
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
57
        yield e, config.config_filename()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
58
1668.1.13 by Martin Pool
msgeditor and bzr info improvements (olaf)
59
    for varname in 'VISUAL', 'EDITOR':
1963.2.1 by Robey Pointer
remove usage of has_key()
60
        if varname in os.environ:
3910.1.2 by Andrew Bennetts
Fix thinko.
61
            yield os.environ[varname], '$' + varname
1185.1.30 by Robert Collins
Accept and tweak David Clymers BZREDITOR support patch
62
1684.1.7 by Martin Pool
(patch) better detection of the write commit message editor to use (mpe, robertc)
63
    if sys.platform == 'win32':
64
        for editor in 'wordpad.exe', 'notepad.exe':
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
65
            yield editor, None
1684.1.7 by Martin Pool
(patch) better detection of the write commit message editor to use (mpe, robertc)
66
    else:
1668.4.1 by Olaf Conradi
Make msgeditor invocation comply with Debian Policy.
67
        for editor in ['/usr/bin/editor', 'vi', 'pico', 'nano', 'joe']:
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
68
            yield editor, None
1167 by Martin Pool
- split commit message editor functions out into own file
69
70
71
def _run_editor(filename):
1168 by Martin Pool
- work properly when $EDITOR contains multiple words
72
    """Try to execute an editor to edit the commit message."""
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
73
    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.
74
        edargs = cmdline.split(candidate)
1185.62.19 by John Arbash Meinel
Fix error when we can't find an editor
75
        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
76
            ## mutter("trying editor: %r", (edargs +[filename]))
1185.62.19 by John Arbash Meinel
Fix error when we can't find an editor
77
            x = call(edargs + [filename])
6619.3.2 by Jelmer Vernooij
Apply 2to3 except fix.
78
        except OSError as e:
4948.2.2 by Martin Pool
If there's an OS error running a user-specified editor, always show it,
79
            if candidate_source is not None:
80
                # We tried this editor because some user configuration (an
81
                # environment variable or config file) said to try it.  Let
82
                # the user know their configuration is broken.
83
                trace.warning(
84
                    'Could not start editor "%s" (specified by %s): %s\n'
85
                    % (candidate, candidate_source, str(e)))
86
            continue
3376.1.1 by Martin Pool
Fix incorrect indentation (#220333)
87
            raise
1167 by Martin Pool
- split commit message editor functions out into own file
88
        if x == 0:
89
            return True
90
        elif x == 127:
91
            continue
92
        else:
93
            break
1684.1.7 by Martin Pool
(patch) better detection of the write commit message editor to use (mpe, robertc)
94
    raise BzrError("Could not start any editor.\nPlease specify one with:\n"
6622.1.28 by Jelmer Vernooij
More renames; commands in output, environment variables.
95
                   " - $BRZ_EDITOR\n - editor=/some/path in %s\n"
2135.1.3 by Matthew Fuller
Include $VISUAL in the list of env variables when we can't start an
96
                   " - $VISUAL\n - $EDITOR" % \
1684.1.7 by Martin Pool
(patch) better detection of the write commit message editor to use (mpe, robertc)
97
                    config.config_filename())
1553.4.9 by Michael Ellerman
Make the "ignore line" in the commit message editor the "right" width, so
98
99
100
DEFAULT_IGNORE_LINE = "%(bar)s %(msg)s %(bar)s" % \
101
    { 'bar' : '-' * 14, 'msg' : 'This line and the following will be ignored' }
102
103
2258.3.1 by James Westby
Add a way to specify a template commit message.
104
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
105
                        start_message=None):
1167 by Martin Pool
- split commit message editor functions out into own file
106
    """Let the user edit a commit message in a temp file.
107
108
    This is run if they don't give a message or
109
    message-containing file on the command line.
110
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
111
    :param infotext:    Text to be displayed at bottom of message
112
                        for the user's reference;
113
                        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.
114
115
    :param ignoreline:  The separator to use above the infotext.
116
117
    :param start_message:   The text to place above the separator, if any.
118
                            This will not be removed from the message
119
                            after the user has edited it.
120
121
    :return:    commit message or None.
122
    """
123
2598.6.18 by ghigo
Update the tests to the new *_encoded() functions
124
    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.
125
        start_message = start_message.encode(osutils.get_user_encoding())
126
    infotext = infotext.encode(osutils.get_user_encoding(), 'replace')
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
127
    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.
128
2598.6.21 by ghigo
updates on the basis of Jhon email
129
2598.6.17 by ghigo
Revert the behaviour of the function make_commit_message_template() and make_commit_message_template() to the original one.
130
def edit_commit_message_encoded(infotext, ignoreline=DEFAULT_IGNORE_LINE,
2598.6.23 by ghigo
Cosmetic clean up
131
                                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.
132
    """Let the user edit a commit message in a temp file.
133
134
    This is run if they don't give a message or
135
    message-containing file on the command line.
136
137
    :param infotext:    Text to be displayed at bottom of message
138
                        for the user's reference;
139
                        currently similar to 'bzr status'.
2598.6.12 by ghigo
Move the encoding of the commit message at the command line level
140
                        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
141
142
    :param ignoreline:  The separator to use above the infotext.
143
144
    :param start_message:   The text to place above the separator, if any.
145
                            This will not be removed from the message
146
                            after the user has edited it.
2598.6.15 by ghigo
Update the param description
147
                            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
148
149
    :return:    commit message or None.
1167 by Martin Pool
- split commit message editor functions out into own file
150
    """
1704.2.21 by Martin Pool
Fix unbound local when handling failure to write message template
151
    msgfilename = None
1167 by Martin Pool
- split commit message editor functions out into own file
152
    try:
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
153
        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
154
                                    infotext, ignoreline, start_message)
5137.1.1 by Robert Collins
* ``bzr commit`` will prompt before using a commit message that was
155
        if not msgfilename:
156
            return None
157
        basename = osutils.basename(msgfilename)
6039.1.5 by Jelmer Vernooij
Add get_transport_from_url and get_transport_from_path functions.
158
        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
159
        reference_content = msg_transport.get_bytes(basename)
160
        if not _run_editor(msgfilename):
161
            return None
162
        edited_content = msg_transport.get_bytes(basename)
163
        if edited_content == reference_content:
5416.1.10 by Martin Pool
Use confirm_action before proceeding with an unedited commit message template
164
            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.
165
                u"Commit message was not edited, use anyway",
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
166
                "breezy.msgeditor.unchanged",
5416.1.10 by Martin Pool
Use confirm_action before proceeding with an unedited commit message template
167
                {}):
5137.1.2 by Robert Collins
Review feedback: add comment about return value and an additional test.
168
                # Returning "" makes cmd_commit raise 'empty commit message
169
                # specified' which is a reasonable error, given the user has
170
                # rejected using the unedited template.
5137.1.1 by Robert Collins
* ``bzr commit`` will prompt before using a commit message that was
171
                return ""
1167 by Martin Pool
- split commit message editor functions out into own file
172
        started = False
173
        msg = []
174
        lastline, nlines = 0, 0
7045.4.21 by Jelmer Vernooij
Fix some msgeditor tests.
175
        with codecs.open(msgfilename, mode='rb', encoding=osutils.get_user_encoding()) as f:
2765.1.2 by Ian Clatworthy
fix try/except/finally nesting for Python 2.4
176
            try:
7045.4.21 by Jelmer Vernooij
Fix some msgeditor tests.
177
                for line in f:
2765.1.2 by Ian Clatworthy
fix try/except/finally nesting for Python 2.4
178
                    stripped_line = line.strip()
179
                    # strip empty line before the log message starts
180
                    if not started:
181
                        if stripped_line != "":
182
                            started = True
183
                        else:
184
                            continue
185
                    # check for the ignore line only if there
186
                    # is additional information at the end
187
                    if hasinfo and stripped_line == ignoreline:
188
                        break
189
                    nlines += 1
190
                    # 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.
191
                    if stripped_line != "":
2765.1.2 by Ian Clatworthy
fix try/except/finally nesting for Python 2.4
192
                        lastline = nlines
193
                    msg.append(line)
194
            except UnicodeDecodeError:
195
                raise BadCommitMessageEncoding()
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
196
1393.3.3 by Jelmer Vernooij
Add test for empty commit messages.
197
        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.
198
            return ""
1167 by Martin Pool
- split commit message editor functions out into own file
199
        # delete empty lines at the end
200
        del msg[lastline:]
201
        # add a newline at the end, if needed
202
        if not msg[-1].endswith("\n"):
203
            return "%s%s" % ("".join(msg), "\n")
204
        else:
205
            return "".join(msg)
206
    finally:
207
        # delete the msg file in any case
1704.2.21 by Martin Pool
Fix unbound local when handling failure to write message template
208
        if msgfilename is not None:
209
            try:
210
                os.unlink(msgfilename)
6619.3.2 by Jelmer Vernooij
Apply 2to3 except fix.
211
            except IOError as e:
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
212
                trace.warning(
213
                    "failed to unlink %s: %s; ignored", msgfilename, e)
1167 by Martin Pool
- split commit message editor functions out into own file
214
1185.33.72 by Martin Pool
Fix commit message template for non-ascii files, and add test for handling of
215
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
216
def _create_temp_file_with_commit_template(infotext,
217
                                           ignoreline=DEFAULT_IGNORE_LINE,
5537.1.1 by Vincent Ladeuil
Create commit message files in TMPDIR instead of the current dir
218
                                           start_message=None,
219
                                           tmpdir=None):
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
220
    """Create temp file and write commit template in it.
221
5537.1.1 by Vincent Ladeuil
Create commit message files in TMPDIR instead of the current dir
222
    :param infotext: Text to be displayed at bottom of message for the
223
        user's reference; currently similar to 'bzr status'.  The text is
224
        already encoded.
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
225
226
    :param ignoreline:  The separator to use above the infotext.
227
5537.1.1 by Vincent Ladeuil
Create commit message files in TMPDIR instead of the current dir
228
    :param start_message: The text to place above the separator, if any.
229
        This will not be removed from the message after the user has edited
230
        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
231
232
    :return:    2-tuple (temp file name, hasinfo)
233
    """
234
    import tempfile
235
    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
236
                                               dir=tmpdir, text=True)
7045.4.21 by Jelmer Vernooij
Fix some msgeditor tests.
237
    with os.fdopen(tmp_fileno, 'wb') as msgfile:
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
238
        if start_message is not None:
7045.4.21 by Jelmer Vernooij
Fix some msgeditor tests.
239
            msgfile.write(b"%s\n" % start_message)
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
240
2598.6.20 by ghigo
Small clean up
241
        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
242
            hasinfo = True
7045.4.21 by Jelmer Vernooij
Fix some msgeditor tests.
243
            trailer = b"\n\n%s\n\n%s" % (
244
                ignoreline.encode(osutils.get_user_encoding()), infotext)
245
            msgfile.write(trailer)
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
246
        else:
247
            hasinfo = False
248
249
    return (msgfilename, hasinfo)
250
2598.6.20 by ghigo
Small clean up
251
2598.6.17 by ghigo
Revert the behaviour of the function make_commit_message_template() and make_commit_message_template() to the original one.
252
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
253
    """Prepare a template file for a commit into a branch.
254
2598.6.17 by ghigo
Revert the behaviour of the function make_commit_message_template() and make_commit_message_template() to the original one.
255
    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
256
    """
257
    # TODO: make provision for this to be overridden or modified by a hook
258
    #
259
    # TODO: Rather than running the status command, should prepare a draft of
260
    # the revision to be committed, then pause and ask the user to
261
    # confirm/write a message.
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
262
    from .status import show_tree_status
2598.6.5 by ghigo
On the basis of the email from Martin, Aaron I changed the encoding logic
263
    status_tmp = StringIO()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
264
    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.
265
                     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.
266
    return status_tmp.getvalue()
267
268
269
def make_commit_message_template_encoded(working_tree, specific_files,
2598.6.30 by ghigo
- Updated the identation on the basis of Aaron suggestions
270
                                         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.
271
    """Prepare a template file for a commit into a branch.
272
273
    Returns an encoded string.
274
    """
275
    # TODO: make provision for this to be overridden or modified by a hook
276
    #
277
    # TODO: Rather than running the status command, should prepare a draft of
278
    # the revision to be committed, then pause and ask the user to
279
    # confirm/write a message.
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
280
    from .diff import show_diff_trees
2598.6.17 by ghigo
Revert the behaviour of the function make_commit_message_template() and make_commit_message_template() to the original one.
281
2598.6.24 by ghigo
update on the basis of Aaron suggestions
282
    template = make_commit_message_template(working_tree, specific_files)
283
    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.
284
2598.6.1 by ghigo
add support for the diff at the end of the commit messages
285
    if diff:
7045.4.21 by Jelmer Vernooij
Fix some msgeditor tests.
286
        stream = BytesIO()
2598.6.12 by ghigo
Move the encoding of the commit message at the command line level
287
        show_diff_trees(working_tree.basis_tree(),
2598.6.26 by ghigo
small cleanup
288
                        working_tree, stream, specific_files,
289
                        path_encoding=output_encoding)
7045.4.21 by Jelmer Vernooij
Fix some msgeditor tests.
290
        template = template + b'\n' + stream.getvalue()
2598.6.12 by ghigo
Move the encoding of the commit message at the command line level
291
292
    return template
3642.2.1 by Jelmer Vernooij
Add simple commit message template hook.
293
294
295
class MessageEditorHooks(Hooks):
296
    """A dictionary mapping hook name to a list of callables for message editor
297
    hooks.
298
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
299
    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.
300
    generate a commit message template
301
    """
302
5622.3.10 by Jelmer Vernooij
Don't require arguments to hooks.
303
    def __init__(self):
3642.2.1 by Jelmer Vernooij
Add simple commit message template hook.
304
        """Create the default hooks.
305
306
        These are all empty initially.
307
        """
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
308
        Hooks.__init__(self, "breezy.msgeditor", "hooks")
5912.4.1 by Jonathan Riddell
Add commit message hook
309
        self.add_hook('set_commit_message',
310
            "Set a fixed commit message. "
5912.4.9 by Jonathan Riddell
make hook documentation match syntax
311
            "set_commit_message is called with the "
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
312
            "breezy.commit.Commit object (so you can also change e.g. revision "
5912.4.9 by Jonathan Riddell
make hook documentation match syntax
313
            "properties by editing commit.builder._revprops) and the message "
314
            "so far. set_commit_message must return the message to use or None"
315
            " if it should use the message editor as normal.", (2, 4))
5622.3.2 by Jelmer Vernooij
Add more lazily usable hook points.
316
        self.add_hook('commit_message_template',
4119.3.2 by Robert Collins
Migrate existing hooks over to the new HookPoint infrastructure.
317
            "Called when a commit message is being generated. "
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
318
            "commit_message_template is called with the breezy.commit.Commit "
4119.3.2 by Robert Collins
Migrate existing hooks over to the new HookPoint infrastructure.
319
            "object and the message that is known so far. "
320
            "commit_message_template must return a new message to use (which "
5909.1.1 by Jonathan Riddell
add missing docs bracket
321
            "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.
322
            "hooks registered for commit_message_template, they are chained "
323
            "with the result from the first passed into the second, and so "
5622.3.2 by Jelmer Vernooij
Add more lazily usable hook points.
324
            "on.", (1, 10))
325
326
5622.3.10 by Jelmer Vernooij
Don't require arguments to hooks.
327
hooks = MessageEditorHooks()
3642.2.1 by Jelmer Vernooij
Add simple commit message template hook.
328
5912.4.1 by Jonathan Riddell
Add commit message hook
329
5912.4.8 by Jonathan Riddell
make set_commit_message hook syntax more consistent with generate_commit_message_template
330
def set_commit_message(commit, start_message=None):
5912.4.1 by Jonathan Riddell
Add commit message hook
331
    """Sets the commit message.
332
    :param commit: Commit object for the active commit.
5912.4.2 by Jonathan Riddell
remove debugging
333
    :return: The commit message or None to continue using the message editor
5912.4.1 by Jonathan Riddell
Add commit message hook
334
    """
5912.4.8 by Jonathan Riddell
make set_commit_message hook syntax more consistent with generate_commit_message_template
335
    start_message = None
5912.4.1 by Jonathan Riddell
Add commit message hook
336
    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
337
        start_message = hook(commit, start_message)
338
    return start_message
3642.2.1 by Jelmer Vernooij
Add simple commit message template hook.
339
5912.4.12 by Jonathan Riddell
correct spacing
340
3642.2.1 by Jelmer Vernooij
Add simple commit message template hook.
341
def generate_commit_message_template(commit, start_message=None):
342
    """Generate a commit message template.
343
344
    :param commit: Commit object for the active commit.
345
    :param start_message: Message to start with.
346
    :return: A start commit message or None for an empty start commit message.
347
    """
348
    start_message = None
349
    for hook in hooks['commit_message_template']:
3642.2.2 by Jelmer Vernooij
Add tests for commit_message_template hooks.
350
        start_message = hook(commit, start_message)
3642.2.1 by Jelmer Vernooij
Add simple commit message template hook.
351
    return start_message