Remove expensive call in build badge

We don't need to list all the tags to determine if any exist, and showing the repo is ready when it is empty is probably correct behavior anyway
This commit is contained in:
Joseph Schorr 2017-06-07 15:05:29 -04:00
parent f0dd2e348b
commit a949a44cb2
3 changed files with 20 additions and 5 deletions

View file

@ -616,3 +616,14 @@ def list_popular_public_repos(action_count_threshold, time_span, repo_kind='imag
.group_by(RepositoryActionCount.repository, Repository.name, Namespace.username)
.having(fn.Sum(RepositoryActionCount.count) >= action_count_threshold)
.tuples())
def is_empty(namespace_name, repository_name):
""" Returns if the repository referenced by the given namespace and name is empty. If the repo
doesn't exist, returns True.
"""
try:
tag.list_repository_tags(namespace_name, repository_name).limit(1).get()
return False
except RepositoryTag.DoesNotExist:
return True

View file

@ -2,7 +2,7 @@ import pytest
from peewee import IntegrityError
from data.model.repository import create_repository, purge_repository
from data.model.repository import create_repository, purge_repository, is_empty
from test.fixtures import *
def test_duplicate_repository_different_kinds(initialized_db):
@ -12,3 +12,10 @@ def test_duplicate_repository_different_kinds(initialized_db):
# Try to create an app repo with the same name, which should fail.
with pytest.raises(IntegrityError):
create_repository('devtable', 'somenewrepo', None, repo_kind='application')
def test_is_empty(initialized_db):
create_repository('devtable', 'somenewrepo', None, repo_kind='image')
assert is_empty('devtable', 'somenewrepo')
assert not is_empty('devtable', 'simple')

View file

@ -479,11 +479,8 @@ def build_status_badge(namespace_name, repo_name):
if not repo or token != repo.badge_token:
abort(404)
# Lookup the tags for the repository.
tags = model.tag.list_repository_tags(namespace_name, repo_name)
is_empty = len(list(tags)) == 0
is_empty = model.repository.is_empty(namespace_name, repo_name)
recent_build = model.build.get_recent_repository_build(namespace_name, repo_name)
if not is_empty and (not recent_build or recent_build.phase == 'complete'):
status_name = 'ready'
elif recent_build and recent_build.phase == 'error':