~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/msgeditor.py

  • Committer: Michael Ellerman
  • Date: 2005-12-10 22:11:46 UTC
  • mto: This revision was merged to the branch mainline in revision 1528.
  • Revision ID: michael@ellerman.id.au-20051210221145-7765347ea4ca0093
Raise NoSuchFile when someone tries to add a non-existant file.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 by Canonical Ltd
 
1
# Bazaar-NG -- distributed version control
 
2
 
 
3
# Copyright (C) 2005 by Canonical Ltd
2
4
 
3
5
# This program is free software; you can redistribute it and/or modify
4
6
# it under the terms of the GNU General Public License as published by
17
19
 
18
20
"""Commit message editor support."""
19
21
 
20
 
import codecs
21
 
import errno
22
22
import os
23
23
from subprocess import call
24
 
import sys
25
24
 
26
 
import bzrlib
27
25
import bzrlib.config as config
28
26
from bzrlib.errors import BzrError
29
27
 
30
 
 
31
28
def _get_editor():
32
29
    """Return a sequence of possible editor binaries for the current platform"""
33
30
    try:
39
36
    if e is not None:
40
37
        yield e
41
38
        
42
 
    for varname in 'VISUAL', 'EDITOR':
43
 
        if os.environ.has_key(varname):
44
 
            yield os.environ[varname]
 
39
    try:
 
40
        yield os.environ["EDITOR"]
 
41
    except KeyError:
 
42
        pass
45
43
 
46
 
    if sys.platform == 'win32':
47
 
        for editor in 'wordpad.exe', 'notepad.exe':
48
 
            yield editor
49
 
    else:
50
 
        for editor in ['/usr/bin/editor', 'vi', 'pico', 'nano', 'joe']:
51
 
            yield editor
 
44
    if os.name == "nt":
 
45
        yield "notepad.exe"
 
46
    elif os.name == "posix":
 
47
        yield "/usr/bin/vi"
52
48
 
53
49
 
54
50
def _run_editor(filename):
55
51
    """Try to execute an editor to edit the commit message."""
56
52
    for e in _get_editor():
57
53
        edargs = e.split(' ')
58
 
        try:
59
 
            x = call(edargs + [filename])
60
 
        except OSError, e:
61
 
           # We're searching for an editor, so catch safe errors and continue
62
 
           if e.errno in (errno.ENOENT, ):
63
 
               continue
64
 
           raise
 
54
        x = call(edargs + [filename])
65
55
        if x == 0:
66
56
            return True
67
57
        elif x == 127:
68
58
            continue
69
59
        else:
70
60
            break
71
 
    raise BzrError("Could not start any editor.\nPlease specify one with:\n"
72
 
                   " - $BZR_EDITOR\n - editor=/some/path in %s\n - $EDITOR" % \
73
 
                    config.config_filename())
74
 
 
75
 
 
76
 
DEFAULT_IGNORE_LINE = "%(bar)s %(msg)s %(bar)s" % \
77
 
    { 'bar' : '-' * 14, 'msg' : 'This line and the following will be ignored' }
78
 
 
79
 
 
80
 
def edit_commit_message(infotext, ignoreline=DEFAULT_IGNORE_LINE):
 
61
    raise BzrError("Could not start any editor. "
 
62
                   "Please specify $EDITOR or use ~/.bzr.conf/editor")
 
63
                          
 
64
 
 
65
def edit_commit_message(infotext, ignoreline=None):
81
66
    """Let the user edit a commit message in a temp file.
82
67
 
83
68
    This is run if they don't give a message or
89
74
        'bzr status'.
90
75
    """
91
76
    import tempfile
92
 
 
93
 
    msgfilename = None
 
77
    
 
78
    if ignoreline is None:
 
79
        ignoreline = "-- This line and the following will be ignored --"
 
80
        
94
81
    try:
95
82
        tmp_fileno, msgfilename = tempfile.mkstemp(prefix='bzr_log.', dir=u'.')
96
83
        msgfile = os.close(tmp_fileno)
97
84
        if infotext is not None and infotext != "":
98
85
            hasinfo = True
99
86
            msgfile = file(msgfilename, "w")
100
 
            msgfile.write("\n\n%s\n\n%s" % (ignoreline,
101
 
                infotext.encode(bzrlib.user_encoding, 'replace')))
 
87
            msgfile.write("\n\n%s\n\n%s" % (ignoreline, infotext))
102
88
            msgfile.close()
103
89
        else:
104
90
            hasinfo = False
109
95
        started = False
110
96
        msg = []
111
97
        lastline, nlines = 0, 0
112
 
        for line in codecs.open(msgfilename, 'r', bzrlib.user_encoding):
 
98
        for line in file(msgfilename, "r"):
113
99
            stripped_line = line.strip()
114
100
            # strip empty line before the log message starts
115
101
            if not started:
138
124
            return "".join(msg)
139
125
    finally:
140
126
        # delete the msg file in any case
141
 
        if msgfilename is not None:
142
 
            try:
143
 
                os.unlink(msgfilename)
144
 
            except IOError, e:
145
 
                mutter("failed to unlink %s: %s; ignored", msgfilename, e)
 
127
        try: os.unlink(msgfilename)
 
128
        except IOError: pass
146
129
 
147
130
 
148
131
def make_commit_message_template(working_tree, specific_files):
158
141
    # the revision to be committed, then pause and ask the user to
159
142
    # confirm/write a message.
160
143
    from StringIO import StringIO       # must be unicode-safe
161
 
    from bzrlib.status import show_tree_status
 
144
    from bzrlib.status import show_status
162
145
    status_tmp = StringIO()
163
 
    show_tree_status(working_tree, specific_files=specific_files, 
164
 
                     to_file=status_tmp)
 
146
    show_status(working_tree.branch, specific_files=specific_files, to_file=status_tmp)
165
147
    return status_tmp.getvalue()