routes: refs view

This commit is contained in:
Anirudh Oppiliappan 2022-12-12 21:58:47 +05:30
parent 01f27147ba
commit 7a6ff3565e
No known key found for this signature in database
GPG key ID: 8A93F96F78C5D4C4
4 changed files with 104 additions and 0 deletions

View file

@ -78,3 +78,35 @@ func (g *GitRepo) FileContent(path string) (string, error) {
return file.Contents() return file.Contents()
} }
func (g *GitRepo) Tags() ([]*object.Tag, error) {
ti, err := g.r.TagObjects()
if err != nil {
return nil, fmt.Errorf("tag objects: %w", err)
}
tags := []*object.Tag{}
_ = ti.ForEach(func(t *object.Tag) error {
tags = append(tags, t)
return nil
})
return tags, nil
}
func (g *GitRepo) Branches() ([]*plumbing.Reference, error) {
bi, err := g.r.Branches()
if err != nil {
return nil, fmt.Errorf("branchs: %w", err)
}
branches := []*plumbing.Reference{}
_ = bi.ForEach(func(ref *plumbing.Reference) error {
branches = append(branches, ref)
return nil
})
return branches, nil
}

View file

@ -21,5 +21,6 @@ func Handlers(c *config.Config) *flow.Mux {
mux.HandleFunc("/:name/blob/:ref/...", d.FileContent, "GET") mux.HandleFunc("/:name/blob/:ref/...", d.FileContent, "GET")
mux.HandleFunc("/:name/log/:ref", d.Log, "GET") mux.HandleFunc("/:name/log/:ref", d.Log, "GET")
mux.HandleFunc("/:name/commit/:ref", d.Diff, "GET") mux.HandleFunc("/:name/commit/:ref", d.Diff, "GET")
mux.HandleFunc("/:name/refs", d.Refs, "GET")
return mux return mux
} }

View file

@ -216,3 +216,42 @@ func (d *deps) Diff(w http.ResponseWriter, r *http.Request) {
return return
} }
} }
func (d *deps) Refs(w http.ResponseWriter, r *http.Request) {
name := flow.Param(r.Context(), "name")
path := filepath.Join(d.c.Git.ScanPath, name)
gr, err := git.Open(path, "")
if err != nil {
d.Write404(w)
return
}
tags, err := gr.Tags()
if err != nil {
// Non-fatal, we *should* have at least one branch to show.
log.Println(err)
}
branches, err := gr.Branches()
if err != nil {
log.Println(err)
d.Write500(w)
return
}
tpath := filepath.Join(d.c.Template.Dir, "*")
t := template.Must(template.ParseGlob(tpath))
data := make(map[string]interface{})
data["meta"] = d.c.Meta
data["name"] = name
data["branches"] = branches
data["tags"] = tags
if err := t.ExecuteTemplate(w, "refs", data); err != nil {
log.Println(err)
return
}
}

32
templates/refs.html Normal file
View file

@ -0,0 +1,32 @@
{{ define "refs" }}
<html>
{{ template "head" . }}
<header>
<h1>{{ .meta.Title }}</h1>
<h2>{{ .meta.Description }}</h2>
</header>
<body>
{{ template "nav" . }}
<main>
<h3>branches</h3>
{{ $name := .name }}
{{ range .branches }}
<p>
<strong>{{ .Name.Short }}</strong>
<a href="/{{ $name }}/tree/{{ .Name.Short }}/">browse</a>
<a href="/{{ $name }}/log/{{ .Name.Short }}">log</a>
</p>
{{ end }}
{{ if .tags }}
{{ range .tags }}
<p>{{ .Name }}</p>
{{ if .Message }}
<p>{{ .Message }}</p>
{{ end }}
{{ end }}
{{ end }}
</main>
</body>
</html>
{{ end }}