aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--git_misc.go31
-rw-r--r--handle_repo_index.go2
-rw-r--r--handle_repo_log.go50
-rw-r--r--main.go1
-rw-r--r--templates/repo_log.html.tmpl41
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
+ }
+}
diff --git a/main.go b/main.go
index e9578cc..e8456fb 100644
--- a/main.go
+++ b/main.go
@@ -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 }} &ndash; 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 -}}