routes: file content view
This commit is contained in:
parent
ab30497e16
commit
ac6ca71f01
|
@ -9,6 +9,7 @@ func Handlers(c *config.Config) *flow.Mux {
|
|||
mux := flow.New()
|
||||
d := deps{c}
|
||||
mux.HandleFunc("/:name", d.RepoIndex, "GET")
|
||||
mux.HandleFunc("/:name/tree/:ref/...", d.RepoFiles, "GET")
|
||||
mux.HandleFunc("/:name/tree/:ref/...", d.RepoTree, "GET")
|
||||
mux.HandleFunc("/:name/blob/:ref/...", d.FileContent, "GET")
|
||||
return mux
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package routes
|
||||
|
||||
import (
|
||||
"html/template"
|
||||
"log"
|
||||
"net/http"
|
||||
"path/filepath"
|
||||
|
@ -42,11 +41,11 @@ func (d *deps) RepoIndex(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
d.renderFiles(files, w)
|
||||
d.listFiles(files, w)
|
||||
return
|
||||
}
|
||||
|
||||
func (d *deps) RepoFiles(w http.ResponseWriter, r *http.Request) {
|
||||
func (d *deps) RepoTree(w http.ResponseWriter, r *http.Request) {
|
||||
name := flow.Param(r.Context(), "name")
|
||||
treePath := flow.Param(r.Context(), "...")
|
||||
ref := flow.Param(r.Context(), "ref")
|
||||
|
@ -74,21 +73,32 @@ func (d *deps) RepoFiles(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
d.renderFiles(files, w)
|
||||
d.listFiles(files, w)
|
||||
return
|
||||
}
|
||||
|
||||
func (d *deps) renderFiles(files []git.NiceTree, w http.ResponseWriter) {
|
||||
tpath := filepath.Join(d.c.Template.Dir, "*")
|
||||
t := template.Must(template.ParseGlob(tpath))
|
||||
func (d *deps) FileContent(w http.ResponseWriter, r *http.Request) {
|
||||
name := flow.Param(r.Context(), "name")
|
||||
treePath := flow.Param(r.Context(), "...")
|
||||
ref := flow.Param(r.Context(), "ref")
|
||||
|
||||
data := make(map[string]interface{})
|
||||
data["files"] = files
|
||||
data["meta"] = d.c.Meta
|
||||
name = filepath.Clean(name)
|
||||
// TODO: remove .git
|
||||
path := filepath.Join(d.c.Git.ScanPath, name+".git")
|
||||
repo, err := gogit.PlainOpen(path)
|
||||
if err != nil {
|
||||
Write404(w, *d.c)
|
||||
return
|
||||
}
|
||||
|
||||
if err := t.ExecuteTemplate(w, "repo", data); err != nil {
|
||||
hash, err := repo.ResolveRevision(plumbing.Revision(ref))
|
||||
if err != nil {
|
||||
Write500(w, *d.c)
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
contents, err := git.FileContentAtRef(repo, *hash, treePath)
|
||||
d.showFile(contents, w)
|
||||
return
|
||||
}
|
||||
|
|
|
@ -2,11 +2,12 @@ package routes
|
|||
|
||||
import (
|
||||
"html/template"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"icyphox.sh/legit/config"
|
||||
"icyphox.sh/legit/git"
|
||||
)
|
||||
|
||||
func Write404(w http.ResponseWriter, c config.Config) {
|
||||
|
@ -23,10 +24,32 @@ func Write500(w http.ResponseWriter, c config.Config) {
|
|||
t.Execute(w, nil)
|
||||
}
|
||||
|
||||
func funcMap() template.FuncMap {
|
||||
return template.FuncMap{
|
||||
"prettyMode": func(mode uint32) string {
|
||||
return os.FileMode(mode).String()
|
||||
},
|
||||
func (d *deps) listFiles(files []git.NiceTree, w http.ResponseWriter) {
|
||||
tpath := filepath.Join(d.c.Template.Dir, "*")
|
||||
t := template.Must(template.ParseGlob(tpath))
|
||||
|
||||
data := make(map[string]interface{})
|
||||
data["files"] = files
|
||||
data["meta"] = d.c.Meta
|
||||
|
||||
if err := t.ExecuteTemplate(w, "repo", data); err != nil {
|
||||
Write500(w, *d.c)
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func (d *deps) showFile(content string, w http.ResponseWriter) {
|
||||
tpath := filepath.Join(d.c.Template.Dir, "*")
|
||||
t := template.Must(template.ParseGlob(tpath))
|
||||
|
||||
data := make(map[string]interface{})
|
||||
data["content"] = content
|
||||
data["meta"] = d.c.Meta
|
||||
|
||||
if err := t.ExecuteTemplate(w, "file", data); err != nil {
|
||||
Write500(w, *d.c)
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
{{ define "file" }}
|
||||
<html>
|
||||
{{ template "head" . }}
|
||||
|
||||
<header>
|
||||
<h1>{{ .meta.Title }}</h1>
|
||||
<h2>{{ .meta.Description }}</h2>
|
||||
</header>
|
||||
<body>
|
||||
{{ template "nav" . }}
|
||||
<main>
|
||||
<pre>
|
||||
{{ .content }}
|
||||
</pre>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
{{ end }}
|
Loading…
Reference in New Issue