diff --git a/swh/web/api/views/snapshot.py b/swh/web/api/views/snapshot.py --- a/swh/web/api/views/snapshot.py +++ b/swh/web/api/views/snapshot.py @@ -3,6 +3,10 @@ # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information +from django.http import HttpResponse + +from swh.model.git_objects import snapshot_git_object +from swh.model.model import Snapshot from swh.web.api.apidoc import api_doc, format_docstring from swh.web.api.apiurls import api_route from swh.web.api.utils import enrich_snapshot @@ -102,3 +106,51 @@ ) return response + + +@api_route( + r"/snapshot/(?P[0-9a-f]+)/git", + "api-1-snapshot-git-object", + checksum_args=["snapshot_id"], +) +@api_doc("/snapshot/git") +@format_docstring() +def api_snapshot_git_object(request, snapshot_id): + """ + .. http:get:: /api/1/snapshot/(snapshot_id)/git + + + **Example:** + + .. parsed-literal:: + + :swh_web_api:`snapshot/6a3a2cf0b2b90ce7ae1cf0a221ed68035b686f5a/git` + """ + + snapshot_content_max_size = get_config()["snapshot_content_max_size"] + + branches_from = request.GET.get("branches_from", "") + branches_count = int(request.GET.get("branches_count", snapshot_content_max_size)) + target_types = request.GET.get("target_types", None) + target_types = target_types.split(",") if target_types else None + + data = api_lookup( + archive.lookup_snapshot, + snapshot_id, + branches_from, + branches_count, + target_types, + branch_name_exclude_prefix=None, + notfound_msg="Snapshot with id {} not found.".format(snapshot_id), + enrich_fn=enrich_snapshot, + request=request, + ) + snapshot = Snapshot.from_dict(data) + results = snapshot_git_object(snapshot) + + response = HttpResponse(results, content_type="application/octet-stream") + response["Content-disposition"] = ( + "attachment;filename=snapshot_%s_raw" % snapshot_id + ) + + return response