diff --git a/swh/web/browse/views/origin.py b/swh/web/browse/views/origin.py --- a/swh/web/browse/views/origin.py +++ b/swh/web/browse/views/origin.py @@ -26,11 +26,11 @@ ) -@browse_route(r'origin/(?P.+)/visit/(?P.+)/directory/', - r'origin/(?P.+)/visit/(?P.+)' - '/directory/(?P.+)/', - r'origin/(?P.+)/directory/', +@browse_route(r'origin/(?P.+)/visit/(?P.+)' + r'/directory/(?P.+)/', r'origin/(?P.+)/directory/(?P.+)/', + r'origin/(?P.+)/visit/(?P.+)/directory/', + r'origin/(?P.+)/directory/', view_name='browse-origin-directory') def origin_directory_browse(request, origin_url, timestamp=None, path=None): diff --git a/swh/web/browse/views/snapshot.py b/swh/web/browse/views/snapshot.py --- a/swh/web/browse/views/snapshot.py +++ b/swh/web/browse/views/snapshot.py @@ -30,8 +30,8 @@ return redirect(browse_snapshot_url) -@browse_route(r'snapshot/(?P[0-9a-f]+)/directory/', - r'snapshot/(?P[0-9a-f]+)/directory/(?P.+)/', +@browse_route(r'snapshot/(?P[0-9a-f]+)/directory/(?P.+)/', + r'snapshot/(?P[0-9a-f]+)/directory/', view_name='browse-snapshot-directory', checksum_args=['snapshot_id']) def snapshot_directory_browse(request, snapshot_id, path=None): diff --git a/swh/web/tests/browse/views/test_origin.py b/swh/web/tests/browse/views/test_origin.py --- a/swh/web/tests/browse/views/test_origin.py +++ b/swh/web/tests/browse/views/test_origin.py @@ -6,13 +6,19 @@ import random import re +from datetime import datetime + import swh.web.browse.utils from django.utils.html import escape from hypothesis import given +from swh.model.from_disk import DentryPerms from swh.model.hashutil import hash_to_bytes +from swh.model.identifiers import ( + directory_identifier, revision_identifier, snapshot_identifier +) from swh.web.browse.utils import process_snapshot_branches from swh.web.common.exc import NotFoundExc from swh.web.common.utils import ( @@ -533,6 +539,96 @@ resp.content.decode('utf-8')) +def test_origin_browse_directory_named_directory(client, archive_data): + + # create a sample origin whose source tree consists in an empty + # directory named 'directory' + + origin = {'url': 'https://git-server-domain/repo-name'} + + dir = { + 'entries': [{ + 'name': b'directory', + 'type': 'dir', + 'target': hash_to_bytes(directory_identifier({'entries': []})), + 'perms': DentryPerms.content + }] + } + + dir_id = hash_to_bytes(directory_identifier(dir)) + dir['id'] = dir_id + + rev = { + 'author': { + 'name': b'abcd', + 'email': b'abcd@company.org', + 'fullname': b'abcd abcd' + }, + 'committer': { + 'email': b'aaaa@company.org', + 'fullname': b'aaaa aaa', + 'name': b'aaa' + }, + 'committer_date': { + 'negative_utc': False, + 'offset': 0, + 'timestamp': 1437511651 + }, + 'date': { + 'negative_utc': False, + 'offset': 0, + 'timestamp': 1437511651 + }, + 'message': b'Initial commit', + 'metadata': [], + 'parents': [], + 'synthetic': False, + 'type': 'git', + 'directory': dir_id + } + + rev_id = hash_to_bytes(revision_identifier(rev)) + rev['id'] = rev_id + + snp = { + 'branches': { + b'master': { + 'target_type': 'revision', + 'target': rev_id + }, + b'HEAD': { + 'target_type': 'alias', + 'target': b'master' + } + } + } + + snp_id = hash_to_bytes(snapshot_identifier(snp)) + snp['id'] = snp_id + + # add the sample origin content to the test archive + + archive_data.directory_add([dir]) + archive_data.revision_add([rev]) + archive_data.snapshot_add([snp]) + + archive_data.origin_add_one(origin) + origin_visit = archive_data.origin_visit_add(origin['url'], datetime.now(), + type='git') + archive_data.origin_visit_update(origin['url'], origin_visit['visit'], + snapshot=snp_id) + + # check that directory named 'directory can be browsed + + url = reverse('browse-origin-directory', + url_args={'origin_url': origin['url'], + 'path': 'directory'}) + + resp = client.get(url) + assert resp.status_code == 200 + assert_template_used('directory.html') + + def _origin_content_view_test_helper(client, origin_info, origin_visits, origin_branches, origin_releases, root_dir_sha1, content,