~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/shelf_ui.py

(vila) Allows bzr shelve to be used in test scripts and under emacs shells
 (Vincent Ladeuil)

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
 
18
18
from cStringIO import StringIO
 
19
import os
19
20
import shutil
20
21
import sys
21
22
import tempfile
251
252
        diff_file.seek(0)
252
253
        return patches.parse_patch(diff_file)
253
254
 
 
255
    def _char_based(self):
 
256
        # FIXME: A bit hackish to use INSIDE_EMACS here, but there is another
 
257
        # work in progress moving this method (and more importantly prompt()
 
258
        # below) into the ui area and address the issue in better ways.
 
259
        # -- vila 2011-09-28
 
260
        return os.environ.get('INSIDE_EMACS', None) is None
 
261
 
254
262
    def prompt(self, message):
255
263
        """Prompt the user for a character.
256
264
 
257
265
        :param message: The message to prompt a user with.
258
266
        :return: A character.
259
267
        """
260
 
        if not sys.stdin.isatty():
261
 
            # Since there is no controlling terminal we will hang when trying
262
 
            # to prompt the user, better abort now.  See
 
268
        char_based = self._char_based()
 
269
        if char_based and not sys.stdin.isatty():
 
270
            # Since there is no controlling terminal we will hang when
 
271
            # trying to prompt the user, better abort now.  See
263
272
            # https://code.launchpad.net/~bialix/bzr/shelve-no-tty/+merge/14905
264
273
            # for more context.
265
274
            raise errors.BzrError(gettext("You need a controlling terminal."))
266
275
        sys.stdout.write(message)
267
 
        char = osutils.getchar()
 
276
        if char_based:
 
277
            # We peek one char at a time which requires a real term here
 
278
            char = osutils.getchar()
 
279
        else:
 
280
            # While running tests (or under emacs) the input is line buffered
 
281
            # so we must not use osutils.getchar(). Instead we switch to a mode
 
282
            # where each line is terminated by a new line
 
283
            line = sys.stdin.readline()
 
284
            if line:
 
285
                # XXX: Warn if more than one char is typed ?
 
286
                char = line[0]
 
287
            else:
 
288
                # Empty input, callers handle it as enter
 
289
                char = ''
268
290
        sys.stdout.write("\r" + ' ' * len(message) + '\r')
269
291
        sys.stdout.flush()
270
292
        return char