From 49654f1d302fab1b7fd2c257f87c150346ca2663 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Tue, 11 Feb 2025 13:33:03 +0800 Subject: [PATCH] repo_log: Add a log --- git_misc.go | 31 ++++++++++++++++++++++--------- handle_repo_index.go | 2 +- handle_repo_log.go | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 1 + templates/repo_log.html.tmpl | 41 +++++++++++++++++++++++++++++++++++++++++ diff --git a/git_misc.go b/git_misc.go index db3982bdd2f0b718c0c84c7e6287d372446a50bf..a5bcc9e29b09e3bf012d50d73c4aadd73629925e 100644 --- a/git_misc.go +++ b/git_misc.go @@ -39,7 +39,7 @@ } 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 @@ return nil, err } 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 0f38fc267852032e9b427f071a91e7a261166d62..a5a6dc5bf0f36ea749c2aa8ec2725ccc6d0b92d4 100644 --- a/handle_repo_index.go +++ b/handle_repo_index.go @@ -21,7 +21,7 @@ return } 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 0000000000000000000000000000000000000000..88b1f060f91db3aeecb429a00dd558e65e738200 --- /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 + } +} diff --git a/main.go b/main.go index e9578cc129e1eb7518d82d5ce2710ae8254341f7..e8456fb9a20182358a3ffd70830616439bb0c5d8 100644 --- a/main.go +++ b/main.go @@ -38,6 +38,7 @@ http.HandleFunc("/g/{group_name}/repos/{$}", handle_group_repos) 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 0000000000000000000000000000000000000000..67f28a877afcb1222bdea1e3680c3e6f98483915 --- /dev/null +++ b/templates/repo_log.html.tmpl @@ -0,0 +1,41 @@ +{{- define "repo_log" -}} + + + + {{ template "head_common" . }} + Log of {{ .group_name }}/repos/{{ .repo_name }} – Lindenii Forge + + + + + + + + + + + + + + + + {{- range .commits }} + + + + + + + {{- end }} + +
Commits on {{ .ref }}
IDTitleAuthorTime
{{ .Hash.String }}{{ .Message | first_line }} + + + {{ .Author.When.Format "2006-01-02 15:04:05 -0700" }} +
+ + + +{{- end -}} -- 2.48.1