~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/msgeditor.py

  • Committer: Robert Collins
  • Date: 2006-03-28 14:29:13 UTC
  • mto: (1626.2.1 integration)
  • mto: This revision was merged to the branch mainline in revision 1628.
  • Revision ID: robertc@robertcollins.net-20060328142913-ac5afb37075719c6
Convert log to use the new tsort.merge_sort routine.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
"""Commit message editor support."""
21
21
 
22
22
import os
 
23
import errno
 
24
from subprocess import call
 
25
 
 
26
import bzrlib.config as config
23
27
from bzrlib.errors import BzrError
24
28
 
25
29
def _get_editor():
26
30
    """Return a sequence of possible editor binaries for the current platform"""
27
 
    from bzrlib.osutils import _read_config_value
28
 
    
29
 
    e = _read_config_value("editor")
 
31
    try:
 
32
        yield os.environ["BZR_EDITOR"]
 
33
    except KeyError:
 
34
        pass
 
35
 
 
36
    e = config.GlobalConfig().get_editor()
30
37
    if e is not None:
31
38
        yield e
32
39
        
33
 
    if os.name == "windows":
 
40
    try:
 
41
        yield os.environ["EDITOR"]
 
42
    except KeyError:
 
43
        pass
 
44
 
 
45
    if os.name == "nt":
34
46
        yield "notepad.exe"
35
47
    elif os.name == "posix":
36
 
        try:
37
 
            yield os.environ["EDITOR"]
38
 
        except KeyError:
39
 
            yield "/usr/bin/vi"
 
48
        yield "/usr/bin/vi"
40
49
 
41
50
 
42
51
def _run_editor(filename):
43
52
    """Try to execute an editor to edit the commit message."""
44
53
    for e in _get_editor():
45
54
        edargs = e.split(' ')
46
 
        x = os.spawnvp(os.P_WAIT, edargs[0],
47
 
                       edargs + [filename])
 
55
        try:
 
56
            x = call(edargs + [filename])
 
57
        except OSError, e:
 
58
           # ENOENT means no such editor
 
59
           if e.errno == errno.ENOENT:
 
60
               continue
 
61
           raise
48
62
        if x == 0:
49
63
            return True
50
64
        elif x == 127:
53
67
            break
54
68
    raise BzrError("Could not start any editor. "
55
69
                   "Please specify $EDITOR or use ~/.bzr.conf/editor")
56
 
                          
57
 
 
58
 
def edit_commit_message(infotext, ignoreline=None):
 
70
 
 
71
 
 
72
DEFAULT_IGNORE_LINE = "%(bar)s %(msg)s %(bar)s" % \
 
73
    { 'bar' : '-' * 14, 'msg' : 'This line and the following will be ignored' }
 
74
 
 
75
 
 
76
def edit_commit_message(infotext, ignoreline=DEFAULT_IGNORE_LINE):
59
77
    """Let the user edit a commit message in a temp file.
60
78
 
61
79
    This is run if they don't give a message or
67
85
        'bzr status'.
68
86
    """
69
87
    import tempfile
70
 
    
71
 
    if ignoreline is None:
72
 
        ignoreline = "-- This line and the following will be ignored --"
73
 
        
 
88
 
74
89
    try:
75
 
        tmp_fileno, msgfilename = tempfile.mkstemp()
 
90
        tmp_fileno, msgfilename = tempfile.mkstemp(prefix='bzr_log.', dir=u'.')
76
91
        msgfile = os.close(tmp_fileno)
77
92
        if infotext is not None and infotext != "":
78
93
            hasinfo = True
107
122
            msg.append(line)
108
123
            
109
124
        if len(msg) == 0:
110
 
            return None
 
125
            return ""
111
126
        # delete empty lines at the end
112
127
        del msg[lastline:]
113
128
        # add a newline at the end, if needed
120
135
        try: os.unlink(msgfilename)
121
136
        except IOError: pass
122
137
 
 
138
 
 
139
def make_commit_message_template(working_tree, specific_files):
 
140
    """Prepare a template file for a commit into a branch.
 
141
 
 
142
    Returns a unicode string containing the template.
 
143
    """
 
144
    # TODO: Should probably be given the WorkingTree not the branch
 
145
    #
 
146
    # TODO: make provision for this to be overridden or modified by a hook
 
147
    #
 
148
    # TODO: Rather than running the status command, should prepare a draft of
 
149
    # the revision to be committed, then pause and ask the user to
 
150
    # confirm/write a message.
 
151
    from StringIO import StringIO       # must be unicode-safe
 
152
    from bzrlib.status import show_tree_status
 
153
    status_tmp = StringIO()
 
154
    show_tree_status(working_tree, specific_files=specific_files, 
 
155
                     to_file=status_tmp)
 
156
    return status_tmp.getvalue()