Merge lp:~jelmer/brz/fix-open-policy into lp:brz/3.0

Proposed by Jelmer Vernooij
Status: Merged
Approved by: Jelmer Vernooij
Approved revision: no longer in the source branch.
Merge reported by: The Breezy Bot
Merged at revision: not available
Proposed branch: lp:~jelmer/brz/fix-open-policy
Merge into: lp:brz/3.0
Diff against target: 178 lines (+101/-8)
2 files modified
breezy/tests/test_url_policy_open.py (+55/-2)
breezy/url_policy_open.py (+46/-6)
To merge this branch: bzr merge lp:~jelmer/brz/fix-open-policy
Reviewer Review Type Date Requested Status
Jelmer Vernooij Approve
Review via email: mp+368594@code.launchpad.net

Commit message

Support redirects in URL policy opener.

Description of the change

Support redirects in URL policy opener.

This should fix the tests for lp:~cjwatson/launchpad/use-bzr-policy-open

To post a comment you must log in.
Revision history for this message
Jelmer Vernooij (jelmer) :
review: Approve
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'breezy/tests/test_url_policy_open.py'
--- breezy/tests/test_url_policy_open.py 2018-11-12 01:41:38 +0000
+++ breezy/tests/test_url_policy_open.py 2019-06-09 19:10:13 +0000
@@ -30,7 +30,10 @@
30 ControlDir,30 ControlDir,
31 ControlDirFormat,31 ControlDirFormat,
32 )32 )
33from ..errors import NotBranchError33from ..errors import (
34 NotBranchError,
35 RedirectRequested,
36 )
34from ..url_policy_open import (37from ..url_policy_open import (
35 BadUrl,38 BadUrl,
36 _BlacklistPolicy,39 _BlacklistPolicy,
@@ -44,7 +47,15 @@
44 TestCase,47 TestCase,
45 TestCaseWithTransport,48 TestCaseWithTransport,
46 )49 )
47from ..transport import chroot50from ..transport import (
51 chroot,
52 get_transport,
53 register_transport_proto,
54 register_transport,
55 unregister_transport,
56 transport_list_registry,
57 Transport,
58 )
4859
4960
50class TestBranchOpenerCheckAndFollowBranchReference(TestCase):61class TestBranchOpenerCheckAndFollowBranchReference(TestCase):
@@ -305,6 +316,48 @@
305 set(TrackingProber.seen_urls), {b.base, a.base})316 set(TrackingProber.seen_urls), {b.base, a.base})
306317
307318
319class TestRedirects(TestCaseWithTransport):
320
321 def setUp(self):
322 super(TestRedirects, self).setUp()
323 BranchOpener.install_hook()
324
325 def setup_redirect(self, target_url):
326 class RedirectingTransport(Transport):
327
328 def get(self, name):
329 raise RedirectRequested(self.base, target_url)
330
331 def _redirected_to(self, source, target):
332 return get_transport(target)
333
334 register_transport_proto(
335 'redirecting://', help="Test transport that redirects.")
336 register_transport('redirecting://', RedirectingTransport)
337 self.addCleanup(unregister_transport, 'redirecting://', RedirectingTransport)
338
339 def make_branch_opener(self, allowed_urls, probers=None):
340 policy = WhitelistPolicy(True, allowed_urls, True)
341 return BranchOpener(policy, probers)
342
343 def test_redirect_forbidden(self):
344 b = self.make_branch('b')
345 self.setup_redirect(b.base)
346 class TrackingProber(BzrProber):
347 seen_urls = []
348
349 @classmethod
350 def probe_transport(klass, transport):
351 klass.seen_urls.append(transport.base)
352 return BzrProber.probe_transport(transport)
353
354 opener = self.make_branch_opener(['redirecting:///'], probers=[TrackingProber])
355 self.assertRaises(BadUrl, opener.open, 'redirecting:///')
356
357 opener = self.make_branch_opener(['redirecting:///', b.base], probers=[TrackingProber])
358 opener.open('redirecting:///')
359
360
308class TestOpenOnlyScheme(TestCaseWithTransport):361class TestOpenOnlyScheme(TestCaseWithTransport):
309 """Tests for `open_only_scheme`."""362 """Tests for `open_only_scheme`."""
310363
311364
=== modified file 'breezy/url_policy_open.py'
--- breezy/url_policy_open.py 2018-11-12 01:41:38 +0000
+++ breezy/url_policy_open.py 2019-06-09 19:10:13 +0000
@@ -22,11 +22,17 @@
2222
23from . import (23from . import (
24 errors,24 errors,
25 trace,
25 urlutils,26 urlutils,
26 )27 )
27from .branch import Branch28from .branch import Branch
28from .controldir import (29from .controldir import (
29 ControlDir,30 ControlDir,
31 ControlDirFormat,
32 )
33from .transport import (
34 do_catching_redirections,
35 get_transport,
30 )36 )
3137
3238
@@ -200,6 +206,8 @@
200 """206 """
201 self.policy = policy207 self.policy = policy
202 self._seen_urls = set()208 self._seen_urls = set()
209 if probers is None:
210 probers = ControlDirFormat.all_probers()
203 self.probers = probers211 self.probers = probers
204212
205 @classmethod213 @classmethod
@@ -276,15 +284,47 @@
276 # spurious loop exceptions.284 # spurious loop exceptions.
277 self._seen_urls = set()285 self._seen_urls = set()
278286
287 def _open_dir(self, url):
288 """Simple BzrDir.open clone that only uses specific probers.
289
290 :param url: URL to open
291 :return: ControlDir instance
292 """
293 def redirected(transport, e, redirection_notice):
294 self.policy.check_one_url(e.target)
295 redirected_transport = transport._redirected_to(
296 e.source, e.target)
297 if redirected_transport is None:
298 raise errors.NotBranchError(e.source)
299 trace.note(
300 '%s is%s redirected to %s',
301 transport.base, e.permanently, redirected_transport.base)
302 return redirected_transport
303
304 def find_format(transport):
305 last_error = errors.NotBranchError(transport.base)
306 for prober_kls in self.probers:
307 prober = prober_kls()
308 try:
309 return transport, prober.probe_transport(transport)
310 except errors.NotBranchError as e:
311 last_error = e
312 else:
313 raise last_error
314 transport = get_transport(url)
315 transport, format = do_catching_redirections(
316 find_format, transport, redirected)
317 return format.open(transport)
318
279 def follow_reference(self, url):319 def follow_reference(self, url):
280 """Get the branch-reference value at the specified url.320 """Get the branch-reference value at the specified url.
281321
282 This exists as a separate method only to be overriden in unit tests.322 This exists as a separate method only to be overriden in unit tests.
283 """323 """
284 controldir = ControlDir.open(url, probers=self.probers)324 controldir = self._open_dir(url)
285 return controldir.get_branch_reference()325 return controldir.get_branch_reference()
286326
287 def open(self, url):327 def open(self, url, ignore_fallbacks=False):
288 """Open the Bazaar branch at url, first checking it.328 """Open the Bazaar branch at url, first checking it.
289329
290 What is acceptable means is defined by the policy's `follow_reference`330 What is acceptable means is defined by the policy's `follow_reference`
@@ -295,11 +335,11 @@
295335
296 url = self.check_and_follow_branch_reference(url)336 url = self.check_and_follow_branch_reference(url)
297337
298 def open_branch(url):338 def open_branch(url, ignore_fallbacks):
299 dir = ControlDir.open(url, probers=self.probers)339 dir = self._open_dir(url)
300 return dir.open_branch()340 return dir.open_branch(ignore_fallbacks=ignore_fallbacks)
301 return self.run_with_transform_fallback_location_hook_installed(341 return self.run_with_transform_fallback_location_hook_installed(
302 open_branch, url)342 open_branch, url, ignore_fallbacks)
303343
304344
305def open_only_scheme(allowed_scheme, url):345def open_only_scheme(allowed_scheme, url):

Subscribers

People subscribed via source and target branches