Rev 4519: Merge bzr.dev 4519 to resolve NEWS in http://bazaar.launchpad.net/~jameinel/bzr/1.17-lru-cleanup
John Arbash Meinel
john at arbash-meinel.com
Wed Jul 8 19:47:31 BST 2009
At http://bazaar.launchpad.net/~jameinel/bzr/1.17-lru-cleanup
------------------------------------------------------------
revno: 4519 [merge]
revision-id: john at arbash-meinel.com-20090708184725-zo5zgwy9sui6gxue
parent: john at arbash-meinel.com-20090708154351-u0t41fwjqm28pbnu
parent: pqm at pqm.ubuntu.com-20090708180538-ars9cga8c3p5tcgz
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 1.17-lru-cleanup
timestamp: Wed 2009-07-08 13:47:25 -0500
message:
Merge bzr.dev 4519 to resolve NEWS
modified:
NEWS NEWS-20050323055033-4e00b5db738777ff
bzrlib/__init__.py __init__.py-20050309040759-33e65acf91bbcd5d
bzrlib/repofmt/groupcompress_repo.py repofmt.py-20080715094215-wp1qfvoo7093c8qr-1
bzrlib/tests/http_server.py httpserver.py-20061012142527-m1yxdj1xazsf8d7s-1
bzrlib/tests/test_read_bundle.py test_read_bundle.py-20060615211421-ud8cwr1ulgd914zf-1
bzrlib/tests/test_transport_implementations.py test_transport_implementations.py-20051227111451-f97c5c7d5c49fce7
-------------- next part --------------
=== modified file 'NEWS'
--- a/NEWS 2009-07-08 14:28:04 +0000
+++ b/NEWS 2009-07-08 18:47:25 +0000
@@ -79,6 +79,9 @@
transforms.
(Craig Hewetson, Martin Pool, #218206)
+* Force socket shutdown in threaded http test servers to avoid client hangs
+ (pycurl). (Vincent Ladeuil, #383920).
+
* ``LRUCache`` will maintain the linked list pointers even if a nodes
cleanup function raises an exception. (John Arbash Meinel, #396838)
@@ -123,6 +126,11 @@
Internals
*********
+* ``bzrlib.user_encoding`` is now officially deprecated. It is not
+ possible to write a deprecation wrapper, but the variable will be
+ removed in the near future. Use ``bzrlib.osutils.get_user_encoding()``
+ instead. (Alexander Belchenko)
+
* Command lookup has had hooks added. ``bzrlib.Command.hooks`` has
three new hook points: ``get_command``, ``get_missing_command`` and
``list_commands``, which allow just-in-time command name provision
=== modified file 'bzrlib/__init__.py'
--- a/bzrlib/__init__.py 2009-06-26 09:24:34 +0000
+++ b/bzrlib/__init__.py 2009-07-08 14:40:29 +0000
@@ -37,7 +37,7 @@
IGNORE_FILENAME = ".bzrignore"
-# XXX: Compatibility. This should probably be deprecated
+# XXX: Deprecated as of bzr-1.17 use osutils.get_user_encoding() directly
user_encoding = get_user_encoding()
=== modified file 'bzrlib/repofmt/groupcompress_repo.py'
--- a/bzrlib/repofmt/groupcompress_repo.py 2009-07-01 10:45:13 +0000
+++ b/bzrlib/repofmt/groupcompress_repo.py 2009-07-06 14:47:36 +0000
@@ -443,7 +443,7 @@
# is grabbing too many keys...
text_keys = source_vf.keys()
self._copy_stream(source_vf, target_vf, text_keys,
- 'text', self._get_progress_stream, 4)
+ 'texts', self._get_progress_stream, 4)
def _copy_signature_texts(self):
source_vf, target_vf = self._build_vfs('signature', False, False)
=== modified file 'bzrlib/tests/http_server.py'
--- a/bzrlib/tests/http_server.py 2009-03-23 14:59:43 +0000
+++ b/bzrlib/tests/http_server.py 2009-07-08 15:24:31 +0000
@@ -382,6 +382,23 @@
# lying around.
self.daemon_threads = True
+ def process_request_thread(self, request, client_address):
+ SocketServer.ThreadingTCPServer.process_request_thread(
+ self, request, client_address)
+ # Under some circumstances (as in bug #383920), we need to force the
+ # shutdown as python delays it until gc occur otherwise and the client
+ # may hang.
+ try:
+ # The request process has been completed, the thread is about to
+ # die, let's shutdown the socket if we can.
+ request.shutdown(socket.SHUT_RDWR)
+ except (socket.error, select.error), e:
+ if e[0] in (errno.EBADF, errno.ENOTCONN):
+ # Right, the socket is already down
+ pass
+ else:
+ raise
+
class HttpServer(transport.Server):
"""A test server for http transports.
=== modified file 'bzrlib/tests/test_read_bundle.py'
--- a/bzrlib/tests/test_read_bundle.py 2009-03-23 14:59:43 +0000
+++ b/bzrlib/tests/test_read_bundle.py 2009-07-08 08:51:19 +0000
@@ -84,70 +84,54 @@
class TestReadBundleFromURL(TestTransportImplementation):
"""Test that read_bundle works properly across multiple transports"""
+ def setUp(self):
+ super(TestReadBundleFromURL, self).setUp()
+ self.bundle_name = 'test_bundle'
+ # read_mergeable_from_url will invoke get_transport which may *not*
+ # respect self._transport (i.e. returns a transport that is different
+ # from the one we want to test, so we must inject a correct transport
+ # into possible_transports first).
+ self.possible_transports = [self.get_transport(self.bundle_name)]
+ self._captureVar('BZR_NO_SMART_VFS', None)
+ wt = self.create_test_bundle()
+
+ def read_mergeable_from_url(self, url):
+ return bzrlib.bundle.read_mergeable_from_url(
+ url, possible_transports=self.possible_transports)
+
def get_url(self, relpath=''):
return bzrlib.urlutils.join(self._server.get_url(), relpath)
def create_test_bundle(self):
out, wt = create_bundle_file(self)
if self.get_transport().is_readonly():
- f = open('test_bundle', 'wb')
- try:
- f.write(out.getvalue())
- finally:
- f.close()
+ self.build_tree_contents([(self.bundle_name, out.getvalue())])
else:
- self.get_transport().put_file('test_bundle', out)
- self.log('Put to: %s', self.get_url('test_bundle'))
+ self.get_transport().put_file(self.bundle_name, out)
+ self.log('Put to: %s', self.get_url(self.bundle_name))
return wt
def test_read_mergeable_from_url(self):
- self._captureVar('BZR_NO_SMART_VFS', None)
- wt = self.create_test_bundle()
- if wt is None:
- return
- # read_mergeable_from_url will invoke get_transport which may *not*
- # respect self._transport (i.e. returns a transport that is different
- # from the one we want to test, so we must inject a correct transport
- # into possible_transports first.
- t = self.get_transport('test_bundle')
- possible_transports = [t]
- info = bzrlib.bundle.read_mergeable_from_url(
- unicode(self.get_url('test_bundle')),
- possible_transports=possible_transports)
+ info = self.read_mergeable_from_url(
+ unicode(self.get_url(self.bundle_name)))
revision = info.real_revisions[-1]
self.assertEqual('commit-1', revision.revision_id)
def test_read_fail(self):
# Trying to read from a directory, or non-bundle file
# should fail with NotABundle
- self._captureVar('BZR_NO_SMART_VFS', None)
- wt = self.create_test_bundle()
- if wt is None:
- return
-
- self.assertRaises(errors.NotABundle,
- bzrlib.bundle.read_mergeable_from_url,
- self.get_url('tree'))
- self.assertRaises(errors.NotABundle,
- bzrlib.bundle.read_mergeable_from_url,
- self.get_url('tree/a'))
+ self.assertRaises(errors.NotABundle,
+ self.read_mergeable_from_url, self.get_url('tree'))
+ self.assertRaises(errors.NotABundle,
+ self.read_mergeable_from_url, self.get_url('tree/a'))
def test_read_mergeable_respects_possible_transports(self):
- t = self.get_transport('test_bundle')
- if not isinstance(t, bzrlib.transport.ConnectedTransport):
+ if not isinstance(self.get_transport(self.bundle_name),
+ bzrlib.transport.ConnectedTransport):
# There is no point testing transport reuse for not connected
# transports (the test will fail even).
- return
- self._captureVar('BZR_NO_SMART_VFS', None)
- wt = self.create_test_bundle()
- if wt is None:
- return
- # read_mergeable_from_url will invoke get_transport which may *not*
- # respect self._transport (i.e. returns a transport that is different
- # from the one we want to test, so we must inject a correct transport
- # into possible_transports first.
- possible_transports = [t]
- url = unicode(self.get_url('test_bundle'))
- info = bzrlib.bundle.read_mergeable_from_url(url,
- possible_transports=possible_transports)
- self.assertEqual(1, len(possible_transports))
+ raise tests.TestSkipped(
+ 'Need a ConnectedTransport to test transport reuse')
+ url = unicode(self.get_url(self.bundle_name))
+ info = self.read_mergeable_from_url(url)
+ self.assertEqual(1, len(self.possible_transports))
=== modified file 'bzrlib/tests/test_transport_implementations.py'
--- a/bzrlib/tests/test_transport_implementations.py 2009-04-20 04:19:45 +0000
+++ b/bzrlib/tests/test_transport_implementations.py 2009-07-07 08:24:57 +0000
@@ -203,6 +203,13 @@
for content, f in itertools.izip(contents, content_f):
self.assertEqual(content, f.read())
+ def test_get_unknown_file(self):
+ t = self.get_transport()
+ files = ['a', 'b']
+ contents = ['contents of a\n',
+ 'contents of b\n',
+ ]
+ self.build_tree(files, transport=t, line_endings='binary')
self.assertRaises(NoSuchFile, t.get, 'c')
self.assertListRaises(NoSuchFile, t.get_multi, ['a', 'b', 'c'])
self.assertListRaises(NoSuchFile, t.get_multi, iter(['a', 'b', 'c']))
@@ -242,6 +249,9 @@
for content, fname in zip(contents, files):
self.assertEqual(content, t.get_bytes(fname))
+ def test_get_bytes_unknown_file(self):
+ t = self.get_transport()
+
self.assertRaises(NoSuchFile, t.get_bytes, 'c')
def test_get_with_open_write_stream_sees_all_content(self):
More information about the bazaar-commits
mailing list