Rev 5264: Release 2.2b3. in http://bazaar.launchpad.net/~lifeless/bzr/trunk
Robert Collins
robertc at robertcollins.net
Thu May 27 18:59:38 BST 2010
At http://bazaar.launchpad.net/~lifeless/bzr/trunk
------------------------------------------------------------
revno: 5264 [merge]
revision-id: robertc at robertcollins.net-20100527175918-un0gcxr0n9or5tb3
parent: pqm at pqm.ubuntu.com-20100527072300-2ne7hfu800189v4q
parent: pqm at pqm.ubuntu.com-20100527165824-blsinv7oywcaezy7
committer: Robert Collins <robertc at robertcollins.net>
branch nick: trunk
timestamp: Fri 2010-05-28 05:59:18 +1200
message:
Release 2.2b3.
modified:
NEWS NEWS-20050323055033-4e00b5db738777ff
bzrlib/__init__.py __init__.py-20050309040759-33e65acf91bbcd5d
bzrlib/osutils.py osutils.py-20050309040759-eeaff12fbf77ac86
bzrlib/tests/test_osutils.py test_osutils.py-20051201224856-e48ee24c12182989
bzrlib/ui/text.py text.py-20051130153916-2e438cffc8afc478
=== modified file 'NEWS'
--- a/NEWS 2010-05-27 02:00:27 +0000
+++ b/NEWS 2010-05-27 17:59:18 +0000
@@ -8,7 +8,17 @@
bzr 2.2b3
#########
-:2.2b3: NOT RELEASED YET
+:2.2b3: 2010-05-28
+
+This third beta in the 2.2 series brings with it all the goodness of 2.1.2
+and 2.0.6 (though it preceeds 2.0.6 slightly). Of particular note for
+users are compatibility fixes with bzr 1.5 and below servers, a hopeful
+end to the EINTR errors caused by SIGWINCH interactions, a shiny new
+bash completion script and bzr will no longer guess at identity details -
+it was too unreliable in reality. Use ``bzr whoami`` on every new install.
+For developers we have some API changes which may impact plugins as well
+as a bunch of our regular improvements to internal clarity and test
+support.
Compatibility Breaks
********************
@@ -27,7 +37,8 @@
(Parth Malwankar, #549310)
* ``bzrlib.commands.Command`` will now raise ValueError during
- construction if there is no __doc__ set. (Robert Collins)
+ construction if there is no __doc__ set. (Note, this will be reverted in
+ 2.2b4) (Robert Collins)
New Features
************
@@ -104,6 +115,12 @@
* CommitBuilder refuses to create revisions whose trees have no root.
(Aaron Bentley)
+* Do not register a SIGWINCH signal handler, instead just poll for the
+ terminal width as needed. This avoids the "Interrupted System Call"
+ problems that occur on POSIX with all currently released versions of
+ Python.
+ (Andrew Bennetts, #583941)
+
* Don't mention --no-strict when we just issue the warning about unclean trees.
(Vincent Ladeuil, #401599)
@@ -317,7 +334,7 @@
* Reset ``siginterrupt`` flag to False every time we handle a signal
installed with ``set_signal_handler(..., restart_syscall=True)`` (from
``bzrlib.osutils``. Reduces the likelihood of "Interrupted System Call"
- errors after two window resizes.
+ errors compared to registering ``signal.signal`` directly.
(Andrew Bennetts)
* When invoked with a range revision, ``bzr log`` doesn't show revisions
@@ -666,7 +683,11 @@
bzr 2.1.2
#########
-:2.1.2: NOT RELEASED YET
+:2.1.2: 2010-05-28
+
+This release fixes two critical networking issues with older servers and
+with interrupted system call errors when pushing or pulling. We recommend
+upgrading to anyone running a 2.1.x version of bzr.
Bug Fixes
*********
@@ -678,6 +699,12 @@
* ``bzr switch`` does not die if a ConfigurableFileMerger is used.
(Aaron Bentley, #559436)
+* Do not register a SIGWINCH signal handler, instead just poll for the
+ terminal width as needed. This avoids the "Interrupted System Call"
+ problems that occur on POSIX with all currently released versions of
+ Python.
+ (Andrew Bennetts, #583941)
+
* Fixed ``AssertionError`` when accessing smart servers running Bazaar
versions before 1.6.
(Andrew Bennetts, #528041)
@@ -685,7 +712,7 @@
* Reset ``siginterrupt`` flag to False every time we handle a signal
installed with ``set_signal_handler(..., restart_syscall=True)`` (from
``bzrlib.osutils``. Reduces the likelihood of "Interrupted System Call"
- errors after two window resizes.
+ errors compared to registering ``signal.signal`` directly.
(Andrew Bennetts)
* Reduce peak memory by one copy of compressed text.
=== modified file 'bzrlib/__init__.py'
--- a/bzrlib/__init__.py 2010-04-22 10:20:40 +0000
+++ b/bzrlib/__init__.py 2010-05-27 17:59:18 +0000
@@ -44,7 +44,7 @@
# Python version 2.0 is (2, 0, 0, 'final', 0)." Additionally we use a
# releaselevel of 'dev' for unreleased under-development code.
-version_info = (2, 2, 0, 'dev', 1)
+version_info = (2, 2, 0, 'beta', 3)
# API compatibility version
api_minimum_version = (2, 2, 0)
=== modified file 'bzrlib/osutils.py'
--- a/bzrlib/osutils.py 2010-05-25 17:27:52 +0000
+++ b/bzrlib/osutils.py 2010-05-27 17:59:18 +0000
@@ -1400,6 +1400,12 @@
terminal_width() returns None.
"""
+# Keep some state so that terminal_width can detect if _terminal_size has
+# returned a different size since the process started. See docstring and
+# comments of terminal_width for details.
+# _terminal_size_state has 3 possible values: no_data, unchanged, and changed.
+_terminal_size_state = 'no_data'
+_first_terminal_size = None
def terminal_width():
"""Return terminal width.
@@ -1409,20 +1415,34 @@
The rules are:
- if BZR_COLUMNS is set, returns its value
- if there is no controlling terminal, returns None
+ - query the OS, if the queried size has changed since the last query,
+ return its value,
- if COLUMNS is set, returns its value,
+ - if the OS has a value (even though it's never changed), return its value.
From there, we need to query the OS to get the size of the controlling
terminal.
- Unices:
+ On Unices we query the OS by:
- get termios.TIOCGWINSZ
- if an error occurs or a negative value is obtained, returns None
- Windows:
-
+ On Windows we query the OS by:
- win32utils.get_console_size() decides,
- returns None on error (provided default value)
"""
+ # Note to implementors: if changing the rules for determining the width,
+ # make sure you've considered the behaviour in these cases:
+ # - M-x shell in emacs, where $COLUMNS is set and TIOCGWINSZ returns 0,0.
+ # - bzr log | less, in bash, where $COLUMNS not set and TIOCGWINSZ returns
+ # 0,0.
+ # - (add more interesting cases here, if you find any)
+ # Some programs implement "Use $COLUMNS (if set) until SIGWINCH occurs",
+ # but we don't want to register a signal handler because it is impossible
+ # to do so without risking EINTR errors in Python <= 2.6.5 (see
+ # <http://bugs.python.org/issue8354>). Instead we check TIOCGWINSZ every
+ # time so we can notice if the reported size has changed, which should have
+ # a similar effect.
# If BZR_COLUMNS is set, take it, user is always right
try:
@@ -1431,24 +1451,39 @@
pass
isatty = getattr(sys.stdout, 'isatty', None)
- if isatty is None or not isatty():
+ if isatty is None or not isatty():
# Don't guess, setting BZR_COLUMNS is the recommended way to override.
return None
- # If COLUMNS is set, take it, the terminal knows better (even inside a
- # given terminal, the application can decide to set COLUMNS to a lower
- # value (splitted screen) or a bigger value (scroll bars))
+ # Query the OS
+ width, height = os_size = _terminal_size(None, None)
+ global _first_terminal_size, _terminal_size_state
+ if _terminal_size_state == 'no_data':
+ _first_terminal_size = os_size
+ _terminal_size_state = 'unchanged'
+ elif (_terminal_size_state == 'unchanged' and
+ _first_terminal_size != os_size):
+ _terminal_size_state = 'changed'
+
+ # If the OS claims to know how wide the terminal is, and this value has
+ # ever changed, use that.
+ if _terminal_size_state == 'changed':
+ if width is not None and width > 0:
+ return width
+
+ # If COLUMNS is set, use it.
try:
return int(os.environ['COLUMNS'])
except (KeyError, ValueError):
pass
- width, height = _terminal_size(None, None)
- if width <= 0:
- # Consider invalid values as meaning no width
- return None
+ # Finally, use an unchanged size from the OS, if we have one.
+ if _terminal_size_state == 'unchanged':
+ if width is not None and width > 0:
+ return width
- return width
+ # The width could not be determined.
+ return None
def _win32_terminal_size(width, height):
@@ -1481,31 +1516,6 @@
_terminal_size = _ioctl_terminal_size
-def _terminal_size_changed(signum, frame):
- """Set COLUMNS upon receiving a SIGnal for WINdow size CHange."""
- width, height = _terminal_size(None, None)
- if width is not None:
- os.environ['COLUMNS'] = str(width)
-
-
-_registered_sigwinch = False
-def watch_sigwinch():
- """Register for SIGWINCH, once and only once.
-
- Do nothing if the signal module is not available.
- """
- global _registered_sigwinch
- if not _registered_sigwinch:
- try:
- import signal
- if getattr(signal, "SIGWINCH", None) is not None:
- set_signal_handler(signal.SIGWINCH, _terminal_size_changed)
- except ImportError:
- # python doesn't provide signal support, nothing we can do about it
- pass
- _registered_sigwinch = True
-
-
def supports_executable():
return sys.platform != "win32"
=== modified file 'bzrlib/tests/test_osutils.py'
--- a/bzrlib/tests/test_osutils.py 2010-05-20 18:23:17 +0000
+++ b/bzrlib/tests/test_osutils.py 2010-05-27 17:59:18 +0000
@@ -1910,6 +1910,18 @@
class TestTerminalWidth(tests.TestCase):
+ def setUp(self):
+ tests.TestCase.setUp(self)
+ self._orig_terminal_size_state = osutils._terminal_size_state
+ self._orig_first_terminal_size = osutils._first_terminal_size
+ self.addCleanup(self.restore_osutils_globals)
+ osutils._terminal_size_state = 'no_data'
+ osutils._first_terminal_size = None
+
+ def restore_osutils_globals(self):
+ osutils._terminal_size_state = self._orig_terminal_size_state
+ osutils._first_terminal_size = self._orig_first_terminal_size
+
def replace_stdout(self, new):
self.overrideAttr(sys, 'stdout', new)
=== modified file 'bzrlib/ui/text.py'
--- a/bzrlib/ui/text.py 2010-05-20 18:23:17 +0000
+++ b/bzrlib/ui/text.py 2010-05-27 17:59:18 +0000
@@ -37,8 +37,6 @@
""")
-from bzrlib.osutils import watch_sigwinch
-
from bzrlib.ui import (
UIFactory,
NullProgressView,
@@ -62,8 +60,6 @@
self.stderr = stderr
# paints progress, network activity, etc
self._progress_view = self.make_progress_view()
- # hook up the signals to watch for terminal size changes
- watch_sigwinch()
def be_quiet(self, state):
if state and not self._quiet:
More information about the bazaar-commits
mailing list