Allow redirects to specific tags
This commit is contained in:
parent
4012e1b327
commit
6968c148f7
2 changed files with 23 additions and 7 deletions
|
@ -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.common import common_login, render_page_template, route_show_if, param_required
|
||||||
from endpoints.csrf import csrf_protect, generate_csrf_token
|
from endpoints.csrf import csrf_protect, generate_csrf_token
|
||||||
from endpoints.registry import set_cache_headers
|
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 util.useremails import send_email_changed
|
||||||
from auth import scopes
|
from auth import scopes
|
||||||
|
|
||||||
|
@ -224,14 +224,14 @@ def robots():
|
||||||
@web.route('/<path:repository>')
|
@web.route('/<path:repository>')
|
||||||
@no_cache
|
@no_cache
|
||||||
@process_oauth
|
@process_oauth
|
||||||
@parse_repository_name
|
@parse_repository_name_and_tag
|
||||||
def redirect_to_repository(namespace, reponame):
|
def redirect_to_repository(namespace, reponame, tag):
|
||||||
permission = ReadRepositoryPermission(namespace, reponame)
|
permission = ReadRepositoryPermission(namespace, reponame)
|
||||||
is_public = model.repository_is_public(namespace, reponame)
|
is_public = model.repository_is_public(namespace, reponame)
|
||||||
|
|
||||||
if permission.can() or is_public:
|
if permission.can() or is_public:
|
||||||
repository_name = '/'.join([namespace, reponame])
|
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)
|
abort(404)
|
||||||
|
|
||||||
|
|
|
@ -4,16 +4,25 @@ from functools import wraps
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
|
|
||||||
def parse_namespace_repository(repository):
|
def parse_namespace_repository(repository, tag=False):
|
||||||
parts = repository.rstrip('/').split('/', 1)
|
parts = repository.rstrip('/').split('/', 1)
|
||||||
if len(parts) < 2:
|
if len(parts) < 2:
|
||||||
namespace = 'library'
|
namespace = 'library'
|
||||||
repository = parts[0]
|
repository = parts[0]
|
||||||
else:
|
else:
|
||||||
(namespace, repository) = parts
|
(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):
|
def parse_repository_name(f):
|
||||||
@wraps(f)
|
@wraps(f)
|
||||||
|
@ -22,6 +31,13 @@ def parse_repository_name(f):
|
||||||
return f(namespace, repository, *args, **kwargs)
|
return f(namespace, repository, *args, **kwargs)
|
||||||
return wrapper
|
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):
|
def format_robot_username(parent_username, robot_shortname):
|
||||||
return '%s+%s' % (parent_username, robot_shortname)
|
return '%s+%s' % (parent_username, robot_shortname)
|
||||||
|
|
Reference in a new issue