Rev 6156: Don't try to use osutils.getchar() where it's known to not work. in file:///home/vila/src/bzr/bugs/856261-unshelve-line-based/

Vincent Ladeuil v.ladeuil+lp at free.fr
Tue Sep 27 16:17:25 UTC 2011


At file:///home/vila/src/bzr/bugs/856261-unshelve-line-based/

------------------------------------------------------------
revno: 6156
revision-id: v.ladeuil+lp at free.fr-20110927161725-6b2z9jq6229bry6c
parent: pqm at pqm.ubuntu.com-20110921151127-hojrogt4w8w2z6si
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: 856261-unshelve-line-based
timestamp: Tue 2011-09-27 18:17:25 +0200
message:
  Don't try to use osutils.getchar() where it's known to not work.
  
  Instead, consider that input always end up with a newline and read a full
  line.
  
  This allows shelve (without --all) to just work in a regular shell under
  emacs as well as in the test suite.
-------------- next part --------------
=== modified file 'bzrlib/shelf_ui.py'
--- a/bzrlib/shelf_ui.py	2011-09-16 15:39:47 +0000
+++ b/bzrlib/shelf_ui.py	2011-09-27 16:17:25 +0000
@@ -257,14 +257,30 @@
         :param message: The message to prompt a user with.
         :return: A character.
         """
-        if not sys.stdin.isatty():
-            # Since there is no controlling terminal we will hang when trying
-            # to prompt the user, better abort now.  See
+        char_based = os.environ.get('INSIDE_EMACS', None) is not None
+        if char_based and not sys.stdin.isatty():
+            # Since there is no controlling terminal we will hang when
+            # trying to prompt the user, better abort now.  See
             # https://code.launchpad.net/~bialix/bzr/shelve-no-tty/+merge/14905
             # for more context.
-            raise errors.BzrError(gettext("You need a controlling terminal."))
+            raise errors.BzrError("You need a controlling terminal.")
         sys.stdout.write(message)
-        char = osutils.getchar()
+        if char_based:
+            # We peek one char at a time which requires a real term here
+            char = osutils.getchar()
+        else:
+            # While running tests (or under emacs) the input is line buffered
+            # so we must not use osutils.getchar(). Instead we switch to a mode
+            # where each line is terminated by a new line
+            line = sys.stdin.readline()
+            if line:
+                # XXX: Warn if more than one char is typed ?
+                char = line[0]
+            else:
+                # In the char based implementation, the default value is
+                # selected when the user just hit enter, so we return that here
+                # for edge cases.
+                char = '\n'
         sys.stdout.write("\r" + ' ' * len(message) + '\r')
         sys.stdout.flush()
         return char



More information about the bazaar-commits mailing list