all repos — elgit @ ac6ca71f01885b3fff692b4b9ee36ed33965d396

fork of legit: web frontend for git, written in go

routes: file content view
Anirudh Oppiliappan x@icyphox.sh
Sun, 11 Dec 2022 14:18:39 +0530
commit

ac6ca71f01885b3fff692b4b9ee36ed33965d396

parent

ab30497e169cd3bfcd122e668c3cdde6bd48305b

4 files changed, 70 insertions(+), 18 deletions(-)

jump to
M routes/handler.goroutes/handler.go
@@ -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
 }
M routes/routes.goroutes/routes.go
@@ -1,7 +1,6 @@ package routes
 
 import (
-	"html/template"
 	"log"
 	"net/http"
 	"path/filepath"
@@ -42,11 +41,11 @@ log.Println(err) 		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 @@ log.Println(err) 		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
 }
M routes/template.goroutes/template.go
@@ -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 @@ t := template.Must(template.ParseFiles(tpath)) 	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
 	}
 }
A templates/file.html
@@ -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 }}