raw
1use axum::{
2 extract::Path,
3 http::StatusCode,
4 response::{IntoResponse as _, Response},
5};
6use git2::Commit;
7
8use crate::utils::{
9 Error, Result, error::Context as _, extractor::repo_name_checks, filters, git::Repository,
10 response::Html, spawn_blocking,
11};
12
13#[derive(askama::Template)]
14#[template(path = "repo.html")]
15struct RepoHomeTemplate<'a> {
16 repo: &'a Repository,
17 commits: Vec<Commit<'a>>,
18 readme_text: String,
19}
20
21#[tracing::instrument(skip_all)]
22pub async fn get(Path(repo_name): Path<String>) -> Response {
23 spawn_blocking(move || inner(&repo_name).into_response()).await
24}
25
26#[tracing::instrument(skip_all)]
27fn inner(repo_name: &str) -> Result {
28 repo_name_checks(repo_name)?;
29
30 let Some(repo) = Repository::open(repo_name).context("opening repository")? else {
31 return Err(Error::new(StatusCode::NOT_FOUND, "repo does not exist"));
32 };
33
34 let readme_text = repo.readme();
35
36 let r = "HEAD";
38 let Some(commits) = repo.commits(r, 3)? else {
39 return Err(Error::new(StatusCode::NOT_FOUND, "crepo does not exist"));
40 };
41
42 Ok(Html(RepoHomeTemplate {
43 repo: &repo,
44 commits,
45 readme_text,
46 })
47 .into_response())
48}
49