diff options
author | Runxi Yu <me@runxiyu.org> | 2025-02-11 13:33:03 +0800 |
---|---|---|
committer | Runxi Yu <me@runxiyu.org> | 2025-02-11 13:34:54 +0800 |
commit | 49654f1d302fab1b7fd2c257f87c150346ca2663 (patch) | |
tree | 2bd067d2253507e5a2a29106fcd235c02119f35f | |
parent | repo_{raw,tree}: Redirect if visiting file but path_spec ends with slash (diff) | |
download | forge-49654f1d302fab1b7fd2c257f87c150346ca2663.tar.gz forge-49654f1d302fab1b7fd2c257f87c150346ca2663.tar.zst forge-49654f1d302fab1b7fd2c257f87c150346ca2663.zip |
repo_log: Add a log
-rw-r--r-- | git_misc.go | 31 | ||||
-rw-r--r-- | handle_repo_index.go | 2 | ||||
-rw-r--r-- | handle_repo_log.go | 50 | ||||
-rw-r--r-- | main.go | 1 | ||||
-rw-r--r-- | templates/repo_log.html.tmpl | 41 |
5 files changed, 115 insertions, 10 deletions
diff --git a/git_misc.go b/git_misc.go index db3982b..a5bcc9e 100644 --- a/git_misc.go +++ b/git_misc.go @@ -39,7 +39,7 @@ func build_display_git_tree(tree *object.Tree) []display_git_tree_entry_t { var err_get_recent_commits = errors.New("Error getting recent commits:") -func get_recent_commits(repo *git.Repository, head_hash plumbing.Hash) (recent_commits []*object.Commit, err error) { +func get_recent_commits(repo *git.Repository, head_hash plumbing.Hash, n int) (recent_commits []*object.Commit, err error) { commit_iter, err := repo.Log(&git.LogOptions{From: head_hash}) if err != nil { err = misc.Wrap_one_error(err_get_recent_commits, err) @@ -47,15 +47,28 @@ func get_recent_commits(repo *git.Repository, head_hash plumbing.Hash) (recent_c } recent_commits = make([]*object.Commit, 0) defer commit_iter.Close() - for range 3 { - this_recent_commit, err := commit_iter.Next() - if errors.Is(err, io.EOF) { - return recent_commits, nil - } else if err != nil { - err = misc.Wrap_one_error(err_get_recent_commits, err) - return nil, err + if n < 0 { + for { + this_recent_commit, err := commit_iter.Next() + if errors.Is(err, io.EOF) { + return recent_commits, nil + } else if err != nil { + err = misc.Wrap_one_error(err_get_recent_commits, err) + return nil, err + } + recent_commits = append(recent_commits, this_recent_commit) + } + } else { + for range n { + this_recent_commit, err := commit_iter.Next() + if errors.Is(err, io.EOF) { + return recent_commits, nil + } else if err != nil { + err = misc.Wrap_one_error(err_get_recent_commits, err) + return nil, err + } + recent_commits = append(recent_commits, this_recent_commit) } - recent_commits = append(recent_commits, this_recent_commit) } return } diff --git a/handle_repo_index.go b/handle_repo_index.go index 0f38fc2..a5a6dc5 100644 --- a/handle_repo_index.go +++ b/handle_repo_index.go @@ -21,7 +21,7 @@ func handle_repo_index(w http.ResponseWriter, r *http.Request) { } data["ref"] = head.Name().Short() head_hash := head.Hash() - recent_commits, err := get_recent_commits(repo, head_hash) + recent_commits, err := get_recent_commits(repo, head_hash, 3) if err != nil { _, _ = w.Write([]byte("Error getting recent commits: " + err.Error())) return diff --git a/handle_repo_log.go b/handle_repo_log.go new file mode 100644 index 0000000..88b1f06 --- /dev/null +++ b/handle_repo_log.go @@ -0,0 +1,50 @@ +package main + +import ( + "net/http" + + "github.com/go-git/go-git/v5/plumbing" +) + +func handle_repo_log(w http.ResponseWriter, r *http.Request) { + data := make(map[string]any) + // TODO: Sanitize path values + group_name, repo_name, ref_name := r.PathValue("group_name"), r.PathValue("repo_name"), r.PathValue("ref") + data["group_name"], data["repo_name"], data["ref"] = group_name, repo_name, ref_name + repo, err := open_git_repo(group_name, repo_name) + if err != nil { + _, _ = w.Write([]byte("Error opening repo: " + err.Error())) + return + } + ref, err := repo.Reference(plumbing.NewBranchReferenceName(ref_name), true) + if err != nil { + _, _ = w.Write([]byte("Error getting repo reference: " + err.Error())) + return + } + ref_hash := ref.Hash() + recent_commits, err := get_recent_commits(repo, ref_hash, -1) + if err != nil { + _, _ = w.Write([]byte("Error getting recent commits: " + err.Error())) + return + } + data["commits"] = recent_commits + commit_object, err := repo.CommitObject(ref_hash) + if err != nil { + _, _ = w.Write([]byte("Error getting commit object: " + err.Error())) + return + } + tree, err := commit_object.Tree() + if err != nil { + _, _ = w.Write([]byte("Error getting file tree: " + err.Error())) + return + } + + data["readme"] = render_readme_at_tree(tree) + data["files"] = build_display_git_tree(tree) + + err = templates.ExecuteTemplate(w, "repo_log", data) + if err != nil { + _, _ = w.Write([]byte("Error rendering template: " + err.Error())) + return + } +} @@ -38,6 +38,7 @@ func main() { http.HandleFunc("/g/{group_name}/repos/{repo_name}/{$}", handle_repo_index) http.HandleFunc("/g/{group_name}/repos/{repo_name}/tree/{ref}/{rest...}", handle_repo_tree) http.HandleFunc("/g/{group_name}/repos/{repo_name}/raw/{ref}/{rest...}", handle_repo_raw) + http.HandleFunc("/g/{group_name}/repos/{repo_name}/log/{ref}/", handle_repo_log) listener, err := net.Listen(config.HTTP.Net, config.HTTP.Addr) if err != nil { diff --git a/templates/repo_log.html.tmpl b/templates/repo_log.html.tmpl new file mode 100644 index 0000000..67f28a8 --- /dev/null +++ b/templates/repo_log.html.tmpl @@ -0,0 +1,41 @@ +{{- define "repo_log" -}} +<!DOCTYPE html> +<html lang="en"> + <head> + {{ template "head_common" . }} + <title>Log of {{ .group_name }}/repos/{{ .repo_name }} – Lindenii Forge</title> + </head> + <body class="repo-index"> + <table id="recent-commits"> + <thead> + <tr class="title-row"> + <th colspan="4">Commits on {{ .ref }}</th> + </tr> + <tr> + <th scope="col">ID</th> + <th scope="col">Title</th> + <th scope="col">Author</th> + <th scope="col">Time</th> + </tr> + </thead> + <tbody> + {{- range .commits }} + <tr> + <td class="commit-id">{{ .Hash.String }}</td> + <td class="commit-title">{{ .Message | first_line }}</td> + <td class="commit-author"> + <a class="email-name" href="mailto:{{ .Author.Email }}">{{ .Author.Name }}</a> + </td> + <td class="commit-time"> + {{ .Author.When.Format "2006-01-02 15:04:05 -0700" }} + </td> + </tr> + {{- end }} + </tbody> + </table> + <footer> + {{ template "footer" . }} + </footer> + </body> +</html> +{{- end -}} |