Implement fetching readme from git repos

This commit is contained in:
Drew DeVault 2020-03-24 11:22:33 -04:00
parent a50a47f7e6
commit f8a9b84bc5
3 changed files with 121 additions and 40 deletions

View File

@ -10,6 +10,19 @@ from srht.validation import Validation
projects = Blueprint("projects", __name__)
origin = get_origin("hub.sr.ht")
@projects.route("/<owner>/<project_name>")
def project_GET(owner, project_name):
owner, project = get_project(owner, project_name, ProjectAccess.read)
summary = None
if project.summary_repo_id is not None:
repo = project.summary_repo
assert repo.repo_type != RepoType.hg # TODO
summary = git.get_readme(owner, repo.name)
return render_template("project-summary.html", view="summary",
owner=owner, project=project, summary=summary)
@projects.route("/projects/create")
@loginrequired
def create_GET():
@ -46,12 +59,6 @@ def create_POST():
owner=current_user.canonical_name,
project_name=project.name))
@projects.route("/<owner>/<project_name>")
def project_GET(owner, project_name):
owner, project = get_project(owner, project_name, ProjectAccess.read)
return render_template("project-summary.html", view="summary",
owner=owner, project=project)
@projects.route("/<owner>/<project_name>/sources/new")
@loginrequired
def project_sources_new_GET(owner, project_name):
@ -129,3 +136,18 @@ def project_git_new_POST(owner, project_name):
return redirect(url_for("projects.project_GET",
owner=owner.canonical_name, project_name=project.name))
@projects.route("/<owner>/<project_name>/sources/set-summary/<int:repo_id>",
methods=["POST"])
@loginrequired
def project_set_summary_repo(owner, project_name, repo_id):
owner, project = get_project(owner, project_name, ProjectAccess.write)
repo = (SourceRepo.query
.filter(SourceRepo.id == repo_id)
.filter(SourceRepo.project_id == project.id)).one_or_none()
if not repo:
abort(404)
project.summary_repo_id = repo.id
db.session.commit()
return redirect(url_for("projects.project_GET",
owner=owner.canonical_name, project_name=project.name))

View File

@ -15,6 +15,15 @@ class GitService:
raise Exception(r.json())
return r.json()
def get_readme(self, user, repo_name):
# TODO: Cache?
# TODO: Use default branch
r = requests.get(f"{_gitsrht}/api/repos/{repo_name}/blob/master/README.md",
headers=get_authorization(user))
if r.status_code != 200:
raise Exception(r.text)
return r.text
def ensure_user_webhooks(self, user, config):
ensure_webhooks(user, f"{_gitsrht}/api/user/webhooks", config)

View File

@ -16,15 +16,17 @@
<li class="nav-item">
{{link("#", "summary")}}
</li>
{% if any(project.source_repos) %}
<li class="nav-item">
{{link("#", "sources")}}
</li>
{% endif %}
{# TODO
<li class="nav-item">
<a
class="nav-link" href="#"
>website&nbsp;{{icon('external-link-alt')}}</a>
</li>
<li class="nav-item">
{{link("#", "source")}}
</li>
<li class="nav-item">
{{link("#", "documentation")}}
</li>
@ -50,47 +52,26 @@
</div>
{% endif %}
<div class="container">
{# TODO
<div class="row">
<div class="col-md-12">
<div class="event-list project-events">
<div class="event">
<a href="#">a7358194</a> <code>gen_temporary: fix (unlikely) buffer overflow</code>
<p><a href="#">Drew DeVault</a> pushed to <a href="#">~sircmpwn/scdoc</a> git</p>
<small class="text-muted">12 hours ago</small>
</div>
<div class="event">
<a href="#">#360</a> Support for Gmail tabs
<p>Comment from <a href="#">~j-james</a> on <a href="#">~sircmpwn/scdoc</a> todo</p>
<small class="text-muted">14 hours ago</small>
</div>
<div class="view-more">
<a
href="#"
class="btn btn-link"
>View project feed&nbsp;{{icon("caret-right")}}</a>
</div>
</div>
</div>
</div>
#}
<div class="row">
<div class="col-md-12 event-list">
<div class="event">
<h3>
New project checklist
<small style="font-size: 0.9rem;">
<a class="text-muted" href="#">&times; dismiss</a>
<small style="font-size: 0.9rem;" class="pull-right">
<a class="text-muted" href="#">dismiss</a>
</small>
</h3>
<ul class="checklist">
{#
<li>
{% if any(project.source_repos) %}
{{icon('check', cls='text-success')}}
Add source code repositories
</li>
#}
<li>
<br />
<small class="text-muted">
You can see the list of your source repositories by clicking
"sources" on the project navigation.
</small>
{% else %}
{{icon('plus-square', cls='text-info')}}
<a
href="{{url_for("projects.project_sources_new_GET",
@ -101,6 +82,7 @@
Git and Mercurial repositories help you share this project's
source code with your collaborators.
</small>
{% endif %}
</li>
<li>
{{icon('plus-square', cls='text-info')}}
@ -124,6 +106,35 @@
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="event-list project-events">
<div class="event">
<a href="#">~sircmpwn/scdoc</a>
<p>New git repository</p>
<small class="text-muted">1 hour ago</small>
</div>
{#
<div class="event">
<a href="#">a7358194</a> <code>gen_temporary: fix (unlikely) buffer overflow</code>
<p><a href="#">Drew DeVault</a> pushed to <a href="#">~sircmpwn/scdoc</a> git</p>
<small class="text-muted">12 hours ago</small>
</div>
<div class="event">
<a href="#">#360</a> Support for Gmail tabs
<p>Comment from <a href="#">~j-james</a> on <a href="#">~sircmpwn/scdoc</a> todo</p>
<small class="text-muted">14 hours ago</small>
</div>
#}
<div class="view-more">
<a
href="#"
class="btn btn-link"
>View project feed&nbsp;{{icon("caret-right")}}</a>
</div>
</div>
</div>
</div>
{% if not current_user or current_user != owner %}
{# TODO #}
<div class="row">
@ -136,9 +147,48 @@
</div>
{% endif %}
<div class="row">
{% if project.summary_repo_id != None %}
<div class="col-md-10">
{# TODO: Project summary #}
{{summary | extended_md}}
</div>
{% elif current_user and current_user.id == project.owner_id %}
<div class="col-md-8 offset-md-2">
{% if any(project.source_repos) %}
<div class="alert alert-success">
You have added {{len(project.source_repos)}} source
repositor{{"ies" if len(project.source_repos) > 1 else "y"}}
to this project. Would you like to display the README.md file on this
page?
</div>
<div class="event-list select-resource">
{% for repo in project.source_repos %}
<form
class="event"
method="POST"
action="{{url_for("projects.project_set_summary_repo",
owner=project.owner.canonical_name,
project_name=project.name,
repo_id=repo.id)}}"
>
{{csrf_token()}}
<h3>
<button
type="submit"
class="pull-right btn btn-primary btn-lg"
>Use README.md&nbsp;{{ icon("caret-right") }}</button>
<a
href="{{get_origin("git.sr.ht",
external=True)}}/{{ repo.owner.canonical_name }}/{{repo.name}}"
target="_blank"
rel="noopener"
>{{ repo.name }}</a>
</h3>
</div>
{% endfor %}
</div>
{% endif %}
</div>
{% endif %}
</div>
</div>
{% endblock %}