Rev 2470: Merge Johns fix for bug 110399. in http://people.ubuntu.com/~robertc/baz2.0/integration
Robert Collins
robertc at robertcollins.net
Mon Apr 30 06:14:02 BST 2007
At http://people.ubuntu.com/~robertc/baz2.0/integration
------------------------------------------------------------
revno: 2470
revision-id: robertc at robertcollins.net-20070430051358-8cp7kvp1q0tqhxx0
parent: john at arbash-meinel.com-20070426230146-ip22905t91xhkjs9
parent: pqm at pqm.ubuntu.com-20070430042900-o9x8ggxoevt9s9fi
committer: Robert Collins <robertc at robertcollins.net>
branch nick: integration
timestamp: Mon 2007-04-30 15:13:58 +1000
message:
Merge Johns fix for bug 110399.
modified:
NEWS NEWS-20050323055033-4e00b5db738777ff
bzrlib/msgeditor.py msgeditor.py-20050901111708-ef6d8de98f5d8f2f
bzrlib/tests/intertree_implementations/test_compare.py test_compare.py-20060724101752-09ysswo1a92uqyoz-2
bzrlib/tests/test_remote.py test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
bzrlib/tests/test_smart_transport.py test_ssh_transport.py-20060608202016-c25gvf1ob7ypbus6-2
bzrlib/transport/remote.py ssh.py-20060608202016-c25gvf1ob7ypbus6-1
bzrlib/workingtree_4.py workingtree_4.py-20070208044105-5fgpc5j3ljlh5q6c-1
------------------------------------------------------------
revno: 2466.1.4
merged: pqm at pqm.ubuntu.com-20070430042900-o9x8ggxoevt9s9fi
parent: pqm at pqm.ubuntu.com-20070430040006-olr7xpzdbp02y1sd
parent: robertc at robertcollins.net-20070430034851-aik2bzpubf44oyjc
committer: Canonical.com Patch Queue Manager<pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Mon 2007-04-30 05:29:00 +0100
message:
(robertc) Properly compare filesystem paths with absent and renamed entries. (John Arbash Meinel, #110256)
------------------------------------------------------------
revno: 2465.1.4
merged: robertc at robertcollins.net-20070430034851-aik2bzpubf44oyjc
parent: john at arbash-meinel.com-20070426211345-fh5tuoii9mb7w15a
parent: pqm at pqm.ubuntu.com-20070430025942-y83xydh67a37zebd
committer: Robert Collins <robertc at robertcollins.net>
branch nick: integration
timestamp: Mon 2007-04-30 13:48:51 +1000
message:
Merge Johns fix for bug 110256.
------------------------------------------------------------
revno: 2465.1.3
merged: john at arbash-meinel.com-20070426211345-fh5tuoii9mb7w15a
parent: john at arbash-meinel.com-20070426211150-q67uvpdf3os770u2
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: status_after_merge_110256
timestamp: Thu 2007-04-26 16:13:45 -0500
message:
NEWS entry for fixing bug #110256
------------------------------------------------------------
revno: 2465.1.2
merged: john at arbash-meinel.com-20070426211150-q67uvpdf3os770u2
parent: john at arbash-meinel.com-20070426204553-sfw4mo98pxggdrfm
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: status_after_merge_110256
timestamp: Thu 2007-04-26 16:11:50 -0500
message:
Alternate fix for 'absent' entries.
This also handles 'renamed' entries properly.
Basically, when we get a path which happens to match a dirstate entry
check to see if the entry is considered 'live'.
If it isn't, then we treat it as a non-match, which allows
later checks to properly handle the file on disk.
------------------------------------------------------------
revno: 2465.1.1
merged: john at arbash-meinel.com-20070426204553-sfw4mo98pxggdrfm
parent: pqm at pqm.ubuntu.com-20070426181928-ot99t6eyhjjfj5h3
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: status_after_merge_110256
timestamp: Thu 2007-04-26 15:45:53 -0500
message:
Add a (failing) test exposing the bug in _iter_changes
If you bzr mv a => b, and then bzr add a (for a new a), bzr can get
confused as to the state of 'a'.
------------------------------------------------------------
revno: 2466.1.3
merged: pqm at pqm.ubuntu.com-20070430040006-olr7xpzdbp02y1sd
parent: pqm at pqm.ubuntu.com-20070430025942-y83xydh67a37zebd
parent: andrew.bennetts at canonical.com-20070427021911-pk1ylmrmc1ueo9ad
committer: Canonical.com Patch Queue Manager<pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Mon 2007-04-30 05:00:06 +0100
message:
(Andrew Bennetts) Normalise URLs in RemoteHTTPTransport before doing URL calculations to fix bad results.
------------------------------------------------------------
revno: 2466.4.1
merged: andrew.bennetts at canonical.com-20070427021911-pk1ylmrmc1ueo9ad
parent: pqm at pqm.ubuntu.com-20070426211103-h84prqh7a4ad3ez2
committer: Andrew Bennetts <andrew.bennetts at canonical.com>
branch nick: normalize-remote-http-urls
timestamp: Fri 2007-04-27 12:19:11 +1000
message:
Normalise URLs in RemoteHTTPTransport before doing URL calculations to fix bad results.
------------------------------------------------------------
revno: 2466.1.2
merged: pqm at pqm.ubuntu.com-20070430025942-y83xydh67a37zebd
parent: pqm at pqm.ubuntu.com-20070430022343-wnbvslzfz6fpyyj7
parent: andrew.bennetts at canonical.com-20070430022545-iubud5mcxc1mdsw9
committer: Canonical.com Patch Queue Manager<pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Mon 2007-04-30 03:59:42 +0100
message:
(Andrew Bennetts) Fix incompatibility with < 0.16 smart servers.
------------------------------------------------------------
revno: 2466.3.4
merged: andrew.bennetts at canonical.com-20070430022545-iubud5mcxc1mdsw9
parent: andrew.bennetts at canonical.com-20070430020406-9vvmb4f9x8bdmvv8
committer: Andrew Bennetts <andrew.bennetts at canonical.com>
branch nick: hpss-older-server-compat-bug
timestamp: Mon 2007-04-30 12:25:45 +1000
message:
Tweaks asked for by Robert.
------------------------------------------------------------
revno: 2466.3.3
merged: andrew.bennetts at canonical.com-20070430020406-9vvmb4f9x8bdmvv8
parent: andrew.bennetts at canonical.com-20070430020205-ensbvu0t14yb3tk4
committer: Andrew Bennetts <andrew.bennetts at canonical.com>
branch nick: hpss-older-server-compat-bug
timestamp: Mon 2007-04-30 12:04:06 +1000
message:
Remove another XXX.
------------------------------------------------------------
revno: 2466.3.2
merged: andrew.bennetts at canonical.com-20070430020205-ensbvu0t14yb3tk4
parent: andrew.bennetts at canonical.com-20070427030144-vz2vna1t31ymdgz9
committer: Andrew Bennetts <andrew.bennetts at canonical.com>
branch nick: hpss-older-server-compat-bug
timestamp: Mon 2007-04-30 12:02:05 +1000
message:
Add tests for RemoteTransport.is_readonly in the style of the other remote object tests.
------------------------------------------------------------
revno: 2466.3.1
merged: andrew.bennetts at canonical.com-20070427030144-vz2vna1t31ymdgz9
parent: pqm at pqm.ubuntu.com-20070426211103-h84prqh7a4ad3ez2
committer: Andrew Bennetts <andrew.bennetts at canonical.com>
branch nick: hpss-older-server-compat-bug
timestamp: Fri 2007-04-27 13:01:44 +1000
message:
Fix incompatibility with < 0.16 smart servers.
------------------------------------------------------------
revno: 2466.1.1
merged: pqm at pqm.ubuntu.com-20070430022343-wnbvslzfz6fpyyj7
parent: pqm at pqm.ubuntu.com-20070426211103-h84prqh7a4ad3ez2
parent: robertc at robertcollins.net-20070430014939-mjnji1bq7zulpjlv
committer: Canonical.com Patch Queue Manager<pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Mon 2007-04-30 03:23:43 +0100
message:
(robertc) Fix the bzr commit message to be in text mode. (Alexander Belchenko)
------------------------------------------------------------
revno: 2466.2.1
merged: robertc at robertcollins.net-20070430014939-mjnji1bq7zulpjlv
parent: pqm at pqm.ubuntu.com-20070426211103-h84prqh7a4ad3ez2
committer: Robert Collins <robertc at robertcollins.net>
branch nick: integration
timestamp: Mon 2007-04-30 11:49:39 +1000
message:
Fix the bzr commit message to be in text mode. (Alexander Belchenko)
=== modified file 'NEWS'
--- a/NEWS 2007-04-26 23:01:46 +0000
+++ b/NEWS 2007-04-30 05:13:58 +0000
@@ -11,10 +11,15 @@
empty value. And when the value is not ASCII.
(John Arbash Meinel, #109613)
+ * Fix the bzr commit message to be in text mode.
+ (Alexander Belchenko, #110901)
+
+ * Also handle when you rename a file and create a file where it used
+ to be. (John Arbash Meinel, #110256)
+
* ``WorkingTree4._iter_changes`` should not descend into unversioned
directories. (John Arbash Meinel, #110399)
-
bzr 0.16rc1 2007-04-26
NOTES WHEN UPGRADING:
=== modified file 'bzrlib/msgeditor.py'
--- a/bzrlib/msgeditor.py 2007-02-26 21:48:05 +0000
+++ b/bzrlib/msgeditor.py 2007-04-30 01:49:39 +0000
@@ -103,7 +103,9 @@
msgfilename = None
try:
- tmp_fileno, msgfilename = tempfile.mkstemp(prefix='bzr_log.', dir=u'.')
+ tmp_fileno, msgfilename = tempfile.mkstemp(prefix='bzr_log.',
+ dir=u'.',
+ text=True)
msgfile = os.fdopen(tmp_fileno, 'w')
try:
if start_message is not None:
=== modified file 'bzrlib/tests/intertree_implementations/test_compare.py'
--- a/bzrlib/tests/intertree_implementations/test_compare.py 2007-04-25 22:45:55 +0000
+++ b/bzrlib/tests/intertree_implementations/test_compare.py 2007-04-26 20:45:53 +0000
@@ -1318,3 +1318,39 @@
self.assertEqual(expected,
self.do_iter_changes(tree1, tree2,
want_unversioned=False))
+
+ def test_renamed_and_added(self):
+ """Test when we have renamed a file, and put another in its place."""
+ tree1 = self.make_branch_and_tree('tree1')
+ tree2 = self.make_to_branch_and_tree('tree2')
+ root_id = tree1.get_root_id()
+ tree2.set_root_id(root_id)
+
+ # The final changes are:
+ # bzr add b c
+ # bzr mv b a
+ # bzr mv c d
+ # bzr add b c
+
+ self.build_tree_contents([
+ ('tree1/b', 'b contents\n'),
+ ('tree1/c', 'c contents\n'),
+ ('tree2/a', 'b contents\n'),
+ ('tree2/b', 'new b contents\n'),
+ ('tree2/c', 'new c contents\n'),
+ ('tree2/d', 'c contents\n'),
+ ])
+ tree1.add(['b', 'c'], ['b1-id', 'c1-id'])
+ tree2.add(['a', 'b', 'c', 'd'], ['b1-id', 'b2-id', 'c2-id', 'c1-id'])
+
+ tree1, tree2 = self.mutable_trees_to_locked_test_trees(tree1, tree2)
+
+ expected = sorted([
+ self.renamed(tree1, tree2, 'b1-id', False),
+ self.renamed(tree1, tree2, 'c1-id', False),
+ self.added(tree2, 'b2-id'),
+ self.added(tree2, 'c2-id'),
+ ])
+ self.assertEqual(expected,
+ self.do_iter_changes(tree1, tree2,
+ want_unversioned=True))
=== modified file 'bzrlib/tests/test_remote.py'
--- a/bzrlib/tests/test_remote.py 2007-04-26 08:15:40 +0000
+++ b/bzrlib/tests/test_remote.py 2007-04-30 02:04:06 +0000
@@ -44,6 +44,7 @@
from bzrlib.smart import server, medium
from bzrlib.smart.client import _SmartClient
from bzrlib.transport.memory import MemoryTransport
+from bzrlib.transport.remote import RemoteTransport
class BasicRemoteObjectTests(tests.TestCaseWithTransport):
@@ -60,12 +61,6 @@
self.transport.disconnect()
tests.TestCaseWithTransport.tearDown(self)
- def test_is_readonly(self):
- # XXX: this is a poor way to test RemoteTransport, but currently there's
- # no easy way to substitute in a fake client on a transport like we can
- # with RemoteBzrDir/Branch/Repository.
- self.assertEqual(self.transport.is_readonly(), False)
-
def test_create_remote_bzrdir(self):
b = remote.RemoteBzrDir(self.transport)
self.assertIsInstance(b, BzrDir)
@@ -104,20 +99,6 @@
self.assertIsInstance(d, BzrDir)
-class ReadonlyRemoteTransportTests(tests.TestCaseWithTransport):
-
- def setUp(self):
- self.transport_server = server.ReadonlySmartTCPServer_for_testing
- super(ReadonlyRemoteTransportTests, self).setUp()
-
- def test_is_readonly_yes(self):
- # XXX: this is a poor way to test RemoteTransport, but currently there's
- # no easy way to substitute in a fake client on a transport like we can
- # with RemoteBzrDir/Branch/Repository.
- transport = self.get_readonly_transport()
- self.assertEqual(transport.is_readonly(), True)
-
-
class FakeProtocol(object):
"""Lookalike SmartClientRequestProtocolOne allowing body reading tests."""
@@ -404,6 +385,44 @@
client._calls)
+class TestTransportIsReadonly(tests.TestCase):
+
+ def test_true(self):
+ client = FakeClient([(('yes',), '')])
+ transport = RemoteTransport('bzr://example.com/', medium=False,
+ _client=client)
+ self.assertEqual(True, transport.is_readonly())
+ self.assertEqual(
+ [('call', 'Transport.is_readonly', ())],
+ client._calls)
+
+ def test_false(self):
+ client = FakeClient([(('no',), '')])
+ transport = RemoteTransport('bzr://example.com/', medium=False,
+ _client=client)
+ self.assertEqual(False, transport.is_readonly())
+ self.assertEqual(
+ [('call', 'Transport.is_readonly', ())],
+ client._calls)
+
+ def test_error_from_old_server(self):
+ """bzr 0.15 and earlier servers don't recognise the is_readonly verb.
+
+ Clients should treat it as a "no" response, because is_readonly is only
+ advisory anyway (a transport could be read-write, but then the
+ underlying filesystem could be readonly anyway).
+ """
+ client = FakeClient([(
+ ('error', "Generic bzr smart protocol error: "
+ "bad request 'Transport.is_readonly'"), '')])
+ transport = RemoteTransport('bzr://example.com/', medium=False,
+ _client=client)
+ self.assertEqual(False, transport.is_readonly())
+ self.assertEqual(
+ [('call', 'Transport.is_readonly', ())],
+ client._calls)
+
+
class TestRemoteRepository(tests.TestCase):
"""Base for testing RemoteRepository protocol usage.
=== modified file 'bzrlib/tests/test_smart_transport.py'
--- a/bzrlib/tests/test_smart_transport.py 2007-04-26 09:07:38 +0000
+++ b/bzrlib/tests/test_smart_transport.py 2007-04-27 02:19:11 +0000
@@ -2087,6 +2087,19 @@
new_transport = base_transport.clone('abc/../..')
self.assertEqual('foo', new_transport._remote_path('foo'))
+ def test_remote_path_unnormal_base(self):
+ # If the transport's base isn't normalised, the _remote_path should
+ # still be calculated correctly.
+ base_transport = remote.RemoteHTTPTransport('bzr+http://host/%7Ea/b')
+ self.assertEqual('c', base_transport._remote_path('c'))
+
+ def test_clone_unnormal_base(self):
+ # If the transport's base isn't normalised, cloned transports should
+ # still work correctly.
+ base_transport = remote.RemoteHTTPTransport('bzr+http://host/%7Ea/b')
+ new_transport = base_transport.clone('c')
+ self.assertEqual('bzr+http://host/%7Ea/b/c/', new_transport.base)
+
# TODO: Client feature that does get_bundle and then installs that into a
# branch; this can be used in place of the regular pull/fetch operation when
=== modified file 'bzrlib/transport/remote.py'
--- a/bzrlib/transport/remote.py 2007-04-26 06:19:07 +0000
+++ b/bzrlib/transport/remote.py 2007-04-30 04:00:06 +0000
@@ -74,11 +74,17 @@
# RemoteTransport is an adapter from the Transport object model to the
# SmartClient model, not an encoder.
- def __init__(self, url, clone_from=None, medium=None):
+ def __init__(self, url, clone_from=None, medium=None, _client=None):
"""Constructor.
+ :param clone_from: Another RemoteTransport instance that this one is
+ being cloned from. Attributes such as credentials and the medium
+ will be reused.
:param medium: The medium to use for this RemoteTransport. This must be
supplied if clone_from is None.
+ :param _client: Override the _SmartClient used by this transport. This
+ should only be used for testing purposes; normally this is
+ determined from the medium.
"""
### Technically super() here is faulty because Transport's __init__
### fails to take 2 parameters, and if super were to choose a silly
@@ -97,6 +103,10 @@
# reuse same connection
self._medium = clone_from._medium
assert self._medium is not None
+ if _client is None:
+ self._client = client._SmartClient(self._medium)
+ else:
+ self._client = _client
def abspath(self, relpath):
"""Return the full url to the given relative path.
@@ -123,6 +133,12 @@
return True
elif resp == ('no', ):
return False
+ elif resp == ('error', "Generic bzr smart protocol error: "
+ "bad request 'Transport.is_readonly'"):
+ # XXX: nasty hack: servers before 0.16 don't have a
+ # 'Transport.is_readonly' verb, so we do what clients before 0.16
+ # did: assume False.
+ return False
else:
self._translate_error(resp)
assert False, 'weird response %r' % (resp,)
@@ -160,12 +176,11 @@
def _call2(self, method, *args):
"""Call a method on the remote server."""
- return client._SmartClient(self._medium).call(method, *args)
+ return self._client.call(method, *args)
def _call_with_body_bytes(self, method, args, body):
"""Call a method on the remote server with body bytes."""
- smart_client = client._SmartClient(self._medium)
- return smart_client.call_with_body_bytes(method, args, body)
+ return self._client.call_with_body_bytes(method, args, body)
def has(self, relpath):
"""Indicate whether a remote file of the given name exists or not.
@@ -488,7 +503,7 @@
"""After connecting HTTP Transport only deals in relative URLs."""
# Adjust the relpath based on which URL this smart transport is
# connected to.
- base = self._http_transport.base
+ base = urlutils.normalize_url(self._http_transport.base)
url = urlutils.join(self.base[len('bzr+'):], relpath)
url = urlutils.normalize_url(url)
return urlutils.relative_url(base, url)
@@ -523,7 +538,9 @@
# We either use the exact same http_transport (for child locations), or
# a clone of the underlying http_transport (for parent locations). This
# means we share the connection.
- normalized_rel_url = urlutils.relative_url(self.base, abs_url)
+ norm_base = urlutils.normalize_url(self.base)
+ norm_abs_url = urlutils.normalize_url(abs_url)
+ normalized_rel_url = urlutils.relative_url(norm_base, norm_abs_url)
if normalized_rel_url == ".." or normalized_rel_url.startswith("../"):
http_transport = self._http_transport.clone(normalized_rel_url)
else:
=== modified file 'bzrlib/workingtree_4.py'
--- a/bzrlib/workingtree_4.py 2007-04-26 23:01:46 +0000
+++ b/bzrlib/workingtree_4.py 2007-04-30 05:13:58 +0000
@@ -2289,16 +2289,39 @@
result[7],
)
advance_path = False
+ elif current_entry[1][target_index][0] in 'ar':
+ # The path matches, but the current entry is marked as
+ # not being here. So we don't want to consider this
+ # as a match. We still need to process the current
+ # entry, though.
+ advance_path = False
+ path_handled = False
+ for result in _process_entry(current_entry, None):
+ if (include_unchanged
+ or result[2] # content change
+ or result[3][0] != result[3][1] # versioned status
+ or result[4][0] != result[4][1] # parent id
+ or result[5][0] != result[5][1] # name
+ or result[6][0] != result[6][1] # kind
+ or result[7][0] != result[7][1] # executable
+ ):
+ yield (result[0],
+ (utf8_decode_or_none(result[1][0]),
+ utf8_decode_or_none(result[1][1])),
+ result[2],
+ result[3],
+ result[4],
+ (utf8_decode_or_none(result[5][0]),
+ utf8_decode_or_none(result[5][1])),
+ result[6],
+ result[7],
+ )
else:
for result in _process_entry(current_entry, current_path_info):
# this check should probably be outside the loop: one
# 'iterate two trees' api, and then _iter_changes filters
# unchanged pairs. - RBC 20070226
- if current_entry[1][target_index][0] == 'a':
- advance_path = False
- path_handled = False
- else:
- path_handled = True
+ path_handled = True
if (include_unchanged
or result[2] # content change
or result[3][0] != result[3][1] # versioned status
More information about the bazaar-commits
mailing list