From a1cf12e46010ad2c4c707a7294685649f0df581b Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Fri, 17 Jun 2016 13:52:27 -0400 Subject: [PATCH] Add a sitemap.txt for popular public repos and reference it from the robots.txt --- conf/init/copy_config_files.sh | 2 +- data/model/repository.py | 12 ++++++ endpoints/web.py | 20 ++++++++-- initdb.py | 13 +++++-- static/sitemap.xml | 43 --------------------- {static => templates}/robots.txt | 0 templates/sitemap.xml | 58 +++++++++++++++++++++++++++++ test/data/test.db | Bin 1175552 -> 1175552 bytes test/test_endpoints.py | 6 +++ test/test_repomodel.py | 37 ++++++++++++++++++ workers/repositoryactioncounter.py | 7 ++++ 11 files changed, 146 insertions(+), 52 deletions(-) delete mode 100644 static/sitemap.xml rename {static => templates}/robots.txt (100%) create mode 100644 templates/sitemap.xml create mode 100644 test/test_repomodel.py diff --git a/conf/init/copy_config_files.sh b/conf/init/copy_config_files.sh index 8849a97cf..ceeebdb37 100755 --- a/conf/init/copy_config_files.sh +++ b/conf/init/copy_config_files.sh @@ -2,7 +2,7 @@ if [ -e /conf/stack/robots.txt ] then - cp /conf/stack/robots.txt /static/robots.txt + cp /conf/stack/robots.txt /templates/robots.txt fi if [ -e /conf/stack/favicon.ico ] diff --git a/data/model/repository.py b/data/model/repository.py index 9ce184381..a5e0b2e89 100644 --- a/data/model/repository.py +++ b/data/model/repository.py @@ -405,3 +405,15 @@ def confirm_email_authorization_for_repo(code): return found +def list_popular_public_repos(action_count_threshold, time_span): + cutoff = datetime.now() - time_span + return (Repository + .select(Namespace.username, Repository.name) + .join(Namespace, on=(Repository.namespace_user == Namespace.id)) + .switch(Repository) + .join(RepositoryActionCount) + .where(RepositoryActionCount.date >= cutoff, + Repository.visibility == get_public_repo_visibility()) + .group_by(RepositoryActionCount.repository) + .having(fn.Sum(RepositoryActionCount.count) >= action_count_threshold) + .tuples()) diff --git a/endpoints/web.py b/endpoints/web.py index 952d77b57..bb8c1a0a2 100644 --- a/endpoints/web.py +++ b/endpoints/web.py @@ -2,15 +2,17 @@ import json import logging from urlparse import urlparse +from datetime import timedelta from cachetools import lru_cache -from flask import (abort, redirect, request, url_for, make_response, Response, +from flask import (abort, redirect, request, url_for, make_response, Response, render_template, Blueprint, send_from_directory, jsonify, send_file) from flask.ext.login import current_user import features -from app import app, billing as stripe, build_logs, avatar, signer, log_archive, config_provider +from app import (app, billing as stripe, build_logs, avatar, signer, log_archive, config_provider, + get_app_url) from auth import scopes from auth.auth import require_session_login, process_oauth, has_basic_auth, process_auth_or_cookie from auth.permissions import (AdministerOrganizationPermission, ReadRepositoryPermission, @@ -282,9 +284,19 @@ def disclaimer(): @web.route('/robots.txt', methods=['GET']) -@no_cache def robots(): - return send_from_directory('static', 'robots.txt') + robots_txt = make_response(render_template('robots.txt', baseurl=get_app_url())) + robots_txt.headers['Content-Type'] = 'text/plain' + return robots_txt + + +@web.route('/sitemap.xml', methods=['GET']) +def sitemap(): + popular_repo_tuples = model.repository.list_popular_public_repos(50, timedelta(weeks=1)) + xml = make_response(render_template('sitemap.xml', public_repos=popular_repo_tuples, + baseurl=get_app_url())) + xml.headers['Content-Type'] = 'application/xml' + return xml @web.route('/buildlogs/', methods=['GET']) diff --git a/initdb.py b/initdb.py index e8006e536..0e6fab37a 100644 --- a/initdb.py +++ b/initdb.py @@ -6,7 +6,7 @@ import calendar import os import argparse -from datetime import datetime, timedelta +from datetime import datetime, timedelta, date from peewee import (SqliteDatabase, create_model_tables, drop_model_tables, savepoint_sqlite, savepoint) from itertools import count @@ -506,9 +506,9 @@ def populate_database(minimal=False, with_storage=False): (1, [(1, [], 'v5.0'), (1, [], 'v6.0')], None)], None)) - __generate_repository(with_storage, new_user_2, 'publicrepo', - 'Public repository pullable by the world.', True, - [], (10, [], 'latest')) + publicrepo = __generate_repository(with_storage, new_user_2, 'publicrepo', + 'Public repository pullable by the world.', True, + [], (10, [], 'latest')) __generate_repository(with_storage, outside_org, 'coolrepo', 'Some cool repo.', False, @@ -653,6 +653,7 @@ def populate_database(minimal=False, with_storage=False): week_ago = today - timedelta(6) six_ago = today - timedelta(5) four_ago = today - timedelta(4) + yesterday = datetime.combine(date.today(), datetime.min.time()) - timedelta(hours=6) __generate_service_key('kid1', 'somesamplekey', new_user_1, today, ServiceKeyApprovalType.SUPERUSER) @@ -740,6 +741,10 @@ def populate_database(minimal=False, with_storage=False): timestamp=today, metadata={'token_code': 'somecode', 'repo': 'orgrepo'}) + model.log.log_action('pull_repo', new_user_2.username, repository=publicrepo, + timestamp=yesterday, + metadata={'token_code': 'somecode', 'repo': 'publicrepo'}) + model.log.log_action('build_dockerfile', new_user_1.username, repository=building, timestamp=today, metadata={'repo': 'building', 'namespace': new_user_1.username, diff --git a/static/sitemap.xml b/static/sitemap.xml deleted file mode 100644 index edd8399ab..000000000 --- a/static/sitemap.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - https://quay.io/ - hourly - 0.8 - - - https://quay.io/plans/ - monthly - - - https://quay.io/organizations/ - weekly - - - https://quay.io/repository/ - always - - - https://quay.io/contact/ - monthly - - - https://quay.io/about/ - monthly - - - https://quay.io/security/ - monthly - 0.4 - - - https://quay.io/tos - monthly - 0.4 - - - https://quay.io/privacy - monthly - 0.4 - - diff --git a/static/robots.txt b/templates/robots.txt similarity index 100% rename from static/robots.txt rename to templates/robots.txt diff --git a/templates/sitemap.xml b/templates/sitemap.xml new file mode 100644 index 000000000..ca5061a13 --- /dev/null +++ b/templates/sitemap.xml @@ -0,0 +1,58 @@ + + + + {{ baseurl }}/ + hourly + 0.8 + + + {{ baseurl }}/plans/ + monthly + + + {{ baseurl }}/tour/ + weekly + + + {{ baseurl }}/tour/organizations + weekly + + + {{ baseurl }}/tour/features + weekly + + + {{ baseurl }}/tour/enterprise + weekly + + + {{ baseurl }}/contact/ + monthly + + + {{ baseurl }}/about/ + monthly + + + {{ baseurl }}/security/ + monthly + 0.4 + + + {{ baseurl }}/tos + monthly + 0.4 + + + {{ baseurl }}/privacy + monthly + 0.4 + + {% for namespace, reponame in public_repos -%} + + {{ baseurl }}/repository/{{ namespace }}/{{ reponame }} + daily + 0.3 + + {%- endfor %} + diff --git a/test/data/test.db b/test/data/test.db index 5e87c469fd6a004e7b2f63c54505a70477b03694..6ceefdff8dd40df39f592b120e4bedc5629fbcff 100644 GIT binary patch delta 63881 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 YAS4{HO;dHR6)V&dkTv?%&1m%h0-ia3I{*Lx delta 62922 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 Cy0;<# diff --git a/test/test_endpoints.py b/test/test_endpoints.py index 461ec8ad2..d8430375b 100644 --- a/test/test_endpoints.py +++ b/test/test_endpoints.py @@ -111,6 +111,12 @@ class WebEndpointTestCase(EndpointTestCase): def test_index(self): self.getResponse('web.index') + def test_robots(self): + self.getResponse('web.robots') + + def test_sitemap(self): + self.getResponse('web.sitemap') + def test_repo_view(self): self.getResponse('web.repository', path='devtable/simple') diff --git a/test/test_repomodel.py b/test/test_repomodel.py new file mode 100644 index 000000000..419bfc644 --- /dev/null +++ b/test/test_repomodel.py @@ -0,0 +1,37 @@ +import unittest +from datetime import timedelta + +from app import app +from initdb import setup_database_for_testing, finished_database_for_testing +from data import model + + +PUBLIC_USERNAME = 'public' +PUBLIC_REPONAME = 'publicrepo' + + +class TestRepoModel(unittest.TestCase): + def setUp(self): + setup_database_for_testing(self) + + self.app = app.test_client() + self.ctx = app.test_request_context() + self.ctx.__enter__() + + def tearDown(self): + finished_database_for_testing(self) + self.ctx.__exit__(True, None, None) + + def test_popular_repo_list(self): + # Our repository action count table should have 1 event for the only public + # repo. + onlypublic = model.repository.list_popular_public_repos(0, timedelta(weeks=1)) + self.assertEquals(len(onlypublic), 1) + self.assertEquals(onlypublic[0], (PUBLIC_USERNAME, PUBLIC_REPONAME)) + + self.assertEquals(len(model.repository.list_popular_public_repos(1, timedelta(weeks=1))), 1) + self.assertEquals(len(model.repository.list_popular_public_repos(50, timedelta(weeks=1))), 0) + + +if __name__ == '__main__': + unittest.main() diff --git a/workers/repositoryactioncounter.py b/workers/repositoryactioncounter.py index 34c2bf0b0..d1e951059 100644 --- a/workers/repositoryactioncounter.py +++ b/workers/repositoryactioncounter.py @@ -10,6 +10,10 @@ POLL_PERIOD_SECONDS = 10 logger = logging.getLogger(__name__) def count_repository_actions(): + """ Aggregates repository actions from the LogEntry table and writes them to + the RepositoryActionCount table. Returns the number of repositories for + which actions were logged. Returns 0 when there is no more work. + """ try: # Get a random repository to count. today = date.today() @@ -32,11 +36,14 @@ def count_repository_actions(): # Create the row. try: RepositoryActionCount.create(repository=to_count, date=yesterday, count=actions) + return 1 except: logger.exception('Exception when writing count') except Repository.DoesNotExist: logger.debug('No further repositories to count') + return 0 + class RepositoryActionCountWorker(Worker): def __init__(self):