Changeset View
Changeset View
Standalone View
Standalone View
swh/web/browse/views/revision.py
# Copyright (C) 2017-2020 The Software Heritage developers | # Copyright (C) 2017-2020 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU Affero General Public License version 3, or any later version | # License: GNU Affero General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
import hashlib | import hashlib | ||||
import json | import json | ||||
import textwrap | import textwrap | ||||
from django.http import HttpResponse | from django.http import HttpResponse | ||||
from django.shortcuts import render | from django.shortcuts import render | ||||
from django.template.defaultfilters import filesizeformat | from django.template.defaultfilters import filesizeformat | ||||
from django.utils.html import escape | |||||
from django.utils.safestring import mark_safe | from django.utils.safestring import mark_safe | ||||
from swh.model.identifiers import persistent_identifier | from swh.model.identifiers import persistent_identifier, REVISION | ||||
from swh.web.browse.browseurls import browse_route | from swh.web.browse.browseurls import browse_route | ||||
from swh.web.browse.snapshot_context import get_snapshot_context | from swh.web.browse.snapshot_context import get_snapshot_context | ||||
from swh.web.browse.utils import ( | from swh.web.browse.utils import ( | ||||
gen_link, | gen_link, | ||||
gen_revision_link, | gen_revision_link, | ||||
gen_revision_url, | gen_revision_url, | ||||
get_revision_log_url, | get_revision_log_url, | ||||
get_directory_entries, | get_directory_entries, | ||||
gen_directory_link, | gen_directory_link, | ||||
request_content, | request_content, | ||||
prepare_content_for_display, | prepare_content_for_display, | ||||
content_display_max_size, | content_display_max_size, | ||||
gen_snapshot_link, | gen_snapshot_link, | ||||
get_readme_to_display, | get_readme_to_display, | ||||
get_swh_persistent_ids, | get_swh_persistent_ids, | ||||
format_log_entries, | format_log_entries, | ||||
gen_person_mail_link, | gen_person_mail_link, | ||||
) | ) | ||||
from swh.web.common import service | from swh.web.common import service | ||||
from swh.web.common.exc import NotFoundExc, handle_view_exception | from swh.web.common.exc import NotFoundExc, handle_view_exception | ||||
from swh.web.common.typing import RevisionMetadata | |||||
from swh.web.common.utils import ( | from swh.web.common.utils import ( | ||||
reverse, | reverse, | ||||
format_utc_iso_date, | format_utc_iso_date, | ||||
gen_path_info, | gen_path_info, | ||||
swh_object_icons, | swh_object_icons, | ||||
) | ) | ||||
▲ Show 20 Lines • Show All 261 Lines • ▼ Show 20 Lines | try: | ||||
if not origin_url: | if not origin_url: | ||||
origin_url = request.GET.get("origin", None) | origin_url = request.GET.get("origin", None) | ||||
timestamp = request.GET.get("timestamp", None) | timestamp = request.GET.get("timestamp", None) | ||||
visit_id = request.GET.get("visit_id", None) | visit_id = request.GET.get("visit_id", None) | ||||
snapshot_id = request.GET.get("snapshot_id", None) | snapshot_id = request.GET.get("snapshot_id", None) | ||||
path = request.GET.get("path", None) | path = request.GET.get("path", None) | ||||
dir_id = None | dir_id = None | ||||
dirs, files = None, None | dirs, files = None, None | ||||
content_data = None | content_data = {} | ||||
if origin_url: | if origin_url: | ||||
try: | try: | ||||
snapshot_context = get_snapshot_context( | snapshot_context = get_snapshot_context( | ||||
origin_url=origin_url, timestamp=timestamp, visit_id=visit_id | origin_url=origin_url, timestamp=timestamp, visit_id=visit_id | ||||
) | ) | ||||
except NotFoundExc: | except NotFoundExc: | ||||
raw_rev_url = reverse( | raw_rev_url = reverse( | ||||
"browse-revision", url_args={"sha1_git": sha1_git} | "browse-revision", url_args={"sha1_git": sha1_git} | ||||
Show All 23 Lines | try: | ||||
dir_id = revision["directory"] | dir_id = revision["directory"] | ||||
if dir_id: | if dir_id: | ||||
path = "" if path is None else (path + "/") | path = "" if path is None else (path + "/") | ||||
dirs, files = get_directory_entries(dir_id) | dirs, files = get_directory_entries(dir_id) | ||||
except Exception as exc: | except Exception as exc: | ||||
return handle_view_exception(request, exc) | return handle_view_exception(request, exc) | ||||
revision_data = {} | revision_metadata = RevisionMetadata( | ||||
object_type=REVISION, | |||||
revision_data["author"] = "None" | revision=sha1_git, | ||||
if revision["author"]: | revision_url=gen_revision_link(sha1_git), | ||||
author_link = gen_person_mail_link(revision["author"]) | author=revision["author"]["fullname"] if revision["author"] else "None", | ||||
revision_data["author"] = author_link | author_url=gen_person_mail_link(revision["author"]) | ||||
revision_data["committer"] = "None" | if revision["author"] | ||||
if revision["committer"]: | else "None", | ||||
committer_link = gen_person_mail_link(revision["committer"]) | committer=revision["committer"]["fullname"] | ||||
revision_data["committer"] = committer_link | if revision["committer"] | ||||
revision_data["committer date"] = format_utc_iso_date(revision["committer_date"]) | else "None", | ||||
revision_data["date"] = format_utc_iso_date(revision["date"]) | committer_url=gen_person_mail_link(revision["committer"]) | ||||
revision_data["directory"] = revision["directory"] | if revision["committer"] | ||||
if snapshot_context: | else "None", | ||||
revision_data["snapshot"] = snapshot_id | committer_date=format_utc_iso_date(revision["committer_date"]), | ||||
browse_snapshot_link = gen_snapshot_link(snapshot_id) | date=format_utc_iso_date(revision["date"]), | ||||
revision_data["context-independent snapshot"] = browse_snapshot_link | directory=revision["directory"], | ||||
directory_url=gen_directory_link(revision["directory"]), | |||||
revision_data["context-independent directory"] = gen_directory_link( | merge=revision["merge"], | ||||
revision["directory"] | metadata=json.dumps( | ||||
) | |||||
revision_data["revision"] = sha1_git | |||||
revision_data["merge"] = revision["merge"] | |||||
revision_data["metadata"] = escape( | |||||
json.dumps( | |||||
revision["metadata"], sort_keys=True, indent=4, separators=(",", ": ") | revision["metadata"], sort_keys=True, indent=4, separators=(",", ": ") | ||||
), | |||||
parents=revision["parents"], | |||||
synthetic=revision["synthetic"], | |||||
type=revision["type"], | |||||
snapshot=snapshot_id, | |||||
snapshot_url=gen_snapshot_link(snapshot_id) if snapshot_id else None, | |||||
origin_url=origin_url, | |||||
) | ) | ||||
) | |||||
if origin_info: | |||||
revision_data["origin url"] = gen_link(origin_info["url"], origin_info["url"]) | |||||
revision_data["context-independent revision"] = gen_revision_link(sha1_git) | |||||
parents = "" | |||||
for p in revision["parents"]: | |||||
parent_link = gen_revision_link( | |||||
p, link_text=None, link_attrs=None, snapshot_context=snapshot_context | |||||
) | |||||
parents += parent_link + "<br/>" | |||||
revision_data["parents"] = mark_safe(parents) | |||||
revision_data["synthetic"] = revision["synthetic"] | |||||
revision_data["type"] = revision["type"] | |||||
message_lines = ["None"] | message_lines = ["None"] | ||||
if revision["message"]: | if revision["message"]: | ||||
message_lines = revision["message"].split("\n") | message_lines = revision["message"].split("\n") | ||||
parents = [] | parents = [] | ||||
for p in revision["parents"]: | for p in revision["parents"]: | ||||
parent_url = gen_revision_url(p, snapshot_context) | parent_url = gen_revision_url(p, snapshot_context) | ||||
Show All 38 Lines | vault_cooking = { | ||||
"revision_context": True, | "revision_context": True, | ||||
"revision_id": sha1_git, | "revision_id": sha1_git, | ||||
} | } | ||||
swh_objects = [{"type": "revision", "id": sha1_git}] | swh_objects = [{"type": "revision", "id": sha1_git}] | ||||
content = None | content = None | ||||
content_size = None | content_size = None | ||||
filename = None | |||||
mimetype = None | mimetype = None | ||||
language = None | language = None | ||||
readme_name = None | readme_name = None | ||||
readme_url = None | readme_url = None | ||||
readme_html = None | readme_html = None | ||||
readmes = {} | readmes = {} | ||||
error_code = 200 | error_code = 200 | ||||
error_message = "" | error_message = "" | ||||
error_description = "" | error_description = "" | ||||
if content_data: | if content_data: | ||||
breadcrumbs[-1]["url"] = None | breadcrumbs[-1]["url"] = None | ||||
content_size = content_data["length"] | content_size = content_data["length"] | ||||
mimetype = content_data["mimetype"] | mimetype = content_data["mimetype"] | ||||
if content_data["raw_data"]: | if content_data["raw_data"]: | ||||
content_display_data = prepare_content_for_display( | content_display_data = prepare_content_for_display( | ||||
content_data["raw_data"], content_data["mimetype"], path | content_data["raw_data"], content_data["mimetype"], path | ||||
) | ) | ||||
content = content_display_data["content_data"] | content = content_display_data["content_data"] | ||||
language = content_display_data["language"] | language = content_display_data["language"] | ||||
mimetype = content_display_data["mimetype"] | mimetype = content_display_data["mimetype"] | ||||
query_params = {} | query_params = {} | ||||
if path: | if path: | ||||
filename = path_info[-1]["name"] | filename = path_info[-1]["name"] | ||||
query_params["filename"] = path_info[-1]["name"] | query_params["filename"] = filename | ||||
revision_data["filename"] = filename | |||||
top_right_link = { | top_right_link = { | ||||
"url": reverse( | "url": reverse( | ||||
"browse-content-raw", | "browse-content-raw", | ||||
url_args={"query_string": query_string}, | url_args={"query_string": query_string}, | ||||
query_params=query_params, | query_params=query_params, | ||||
), | ), | ||||
"icon": swh_object_icons["content"], | "icon": swh_object_icons["content"], | ||||
▲ Show 20 Lines • Show All 70 Lines • ▼ Show 20 Lines | def revision_browse(request, sha1_git): | ||||
return render( | return render( | ||||
request, | request, | ||||
"browse/revision.html", | "browse/revision.html", | ||||
{ | { | ||||
"heading": heading, | "heading": heading, | ||||
"swh_object_id": swh_ids[0]["swh_id"], | "swh_object_id": swh_ids[0]["swh_id"], | ||||
"swh_object_name": "Revision", | "swh_object_name": "Revision", | ||||
"swh_object_metadata": revision_data, | "swh_object_metadata": revision_metadata, | ||||
"message_header": message_lines[0], | "message_header": message_lines[0], | ||||
"message_body": "\n".join(message_lines[1:]), | "message_body": "\n".join(message_lines[1:]), | ||||
"parents": parents, | "parents": parents, | ||||
"snapshot_context": snapshot_context, | "snapshot_context": snapshot_context, | ||||
"dirs": dirs, | "dirs": dirs, | ||||
"files": files, | "files": files, | ||||
"content": content, | "content": content, | ||||
"content_size": content_size, | "content_size": content_size, | ||||
"max_content_size": content_display_max_size, | "max_content_size": content_display_max_size, | ||||
"filename": filename, | |||||
"encoding": content_data.get("encoding"), | |||||
"mimetype": mimetype, | "mimetype": mimetype, | ||||
"language": language, | "language": language, | ||||
"readme_name": readme_name, | "readme_name": readme_name, | ||||
"readme_url": readme_url, | "readme_url": readme_url, | ||||
"readme_html": readme_html, | "readme_html": readme_html, | ||||
"breadcrumbs": breadcrumbs, | "breadcrumbs": breadcrumbs, | ||||
"top_right_link": top_right_link, | "top_right_link": top_right_link, | ||||
"vault_cooking": vault_cooking, | "vault_cooking": vault_cooking, | ||||
Show All 9 Lines |