From 6968c148f7c8fcc6141e7e55835e3b50bf90b85e Mon Sep 17 00:00:00 2001 From: Jimmy Zelinskie Date: Thu, 18 Dec 2014 16:01:59 -0500 Subject: [PATCH] Allow redirects to specific tags --- endpoints/web.py | 8 ++++---- util/names.py | 22 +++++++++++++++++++--- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/endpoints/web.py b/endpoints/web.py index 4717f7d40..913a6905a 100644 --- a/endpoints/web.py +++ b/endpoints/web.py @@ -19,7 +19,7 @@ from util.cache import no_cache from endpoints.common import common_login, render_page_template, route_show_if, param_required from endpoints.csrf import csrf_protect, generate_csrf_token from endpoints.registry import set_cache_headers -from util.names import parse_repository_name +from util.names import parse_repository_name, parse_repository_name_and_tag from util.useremails import send_email_changed from auth import scopes @@ -224,14 +224,14 @@ def robots(): @web.route('/') @no_cache @process_oauth -@parse_repository_name -def redirect_to_repository(namespace, reponame): +@parse_repository_name_and_tag +def redirect_to_repository(namespace, reponame, tag): permission = ReadRepositoryPermission(namespace, reponame) is_public = model.repository_is_public(namespace, reponame) if permission.can() or is_public: repository_name = '/'.join([namespace, reponame]) - return redirect(url_for('web.repository', path=repository_name)) + return redirect(url_for('web.repository', path=repository_name, tag=tag)) abort(404) diff --git a/util/names.py b/util/names.py index 31546d450..67ceed982 100644 --- a/util/names.py +++ b/util/names.py @@ -4,16 +4,25 @@ from functools import wraps from uuid import uuid4 -def parse_namespace_repository(repository): +def parse_namespace_repository(repository, tag=False): parts = repository.rstrip('/').split('/', 1) if len(parts) < 2: namespace = 'library' repository = parts[0] else: (namespace, repository) = parts - repository = urllib.quote_plus(repository) - return (namespace, repository) + if tag: + parts = repository.split(':', 1) + if len(parts) < 2: + tag = None + else: + (repository, tag) = parts + + repository = urllib.quote_plus(repository) + if tag: + return (namespace, repository, tag) + return (namespace, repository) def parse_repository_name(f): @wraps(f) @@ -22,6 +31,13 @@ def parse_repository_name(f): return f(namespace, repository, *args, **kwargs) return wrapper +def parse_repository_name_and_tag(f): + @wraps(f) + def wrapper(repository, *args, **kwargs): + (namespace, repository, tag) = parse_namespace_repository(repository, tag=True) + return f(namespace, repository, tag, *args, **kwargs) + return wrapper + def format_robot_username(parent_username, robot_shortname): return '%s+%s' % (parent_username, robot_shortname)