all repos — legit @ 239d5b2dfafacfc338f31bee8ff63ad9301809cf

legit - simple git web interface in go (fork)

add raw file routes, link to raw files on file view, add relative link processing to readme code
Iris Lightshard nilix@nilfm.cc
PGP Signature
-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEkFh6dA+k/6CXFXU4O3+8IhROY5gFAmPbRDwACgkQO3+8IhRO
Y5jTEQ//SHhx76QaaDSCf4XLutmtEsGEjQt3c7cka7XhEwbpAjls4UozMcVSgJ2Z
/4F4eElFZ82YYD3k8qJCXMUhXNRIojFf0+skginKbdNgvBpO21qCupUtN278F+5G
BvpHvp92dC0EodE4PFq0GFK7eY2nVG86Rsx+FZi+Bh7pE83DNwkCGwsxHaitmJh6
cPLqfFfdSpzvBl/NOEXCgPQtwGy+bDpPMbJzvpeTi0+3gE7XshscQYeg8er1EOPF
RoitWu3rXiNGB0hon+OInDgUSHJ2an/kD2LJ0M/RT+vuWR6hucsBFLwe1yHo32wW
hwIsv7dXokbcgN5N8BPt1Pfnpt2XYN5mk9b/Z3fAOoxEAAHpo/ZJmOUopHNwGcfS
sgMW7ZbIVQcZ0N7aBi7odwDfRIVbXqJMmQIl+b+/mSG3ax6/BeneSD/mr70h3KyU
M6TUvGre9+BMApRza+7pw7IVzaQoHE2G1rShUszCtYNPNuddONlSeER0wf0JKner
vrHhF9OqB0KyThb9YwiCQjkJ8wfH9a9cov39bvDcfxA0U3INIs8NdolVP0hNc/EX
D7F1UxB7uc3DCQ9aJYYvdf2pkd2tKirLKQ4XJcdtxcgnFb6ICh3U3itaHuISO5E/
pb0EfbFMfbgvsWQRw7XiSWHQY3H6pfH3xPqkecBhBvyscU22r78=
=uUox
-----END PGP SIGNATURE-----
commit

239d5b2dfafacfc338f31bee8ff63ad9301809cf

parent

80ba8a576b5adaed426580a26318bf540f44feb2

6 files changed, 47 insertions(+), 14 deletions(-)

jump to
M git/git.gogit/git.go

@@ -76,7 +76,7 @@ }

return c, nil } -func (g *GitRepo) FileContent(path string) (string, error) { +func (g *GitRepo) FileContent(path string, showBinary bool) (string, error) { c, err := g.r.CommitObject(g.h) if err != nil { return "", fmt.Errorf("commit object: %w", err)

@@ -94,7 +94,7 @@ }

isbin, _ := file.IsBinary() - if !isbin { + if showBinary || !isbin { return file.Contents() } else { return "Not displaying binary file", nil
M routes/handler.goroutes/handler.go

@@ -41,6 +41,7 @@ mux.HandleFunc("/", d.Index, "GET")

mux.HandleFunc("/static/:file", d.ServeStatic, "GET") mux.HandleFunc("/:name", d.Multiplex, "GET", "POST") mux.HandleFunc("/:name/tree/:ref/...", d.RepoTree, "GET") + mux.HandleFunc("/:name/blob/raw/:ref/...", d.ServeStaticInRepo, "GET") mux.HandleFunc("/:name/blob/:ref/...", d.FileContent, "GET") mux.HandleFunc("/:name/log/:ref", d.Log, "GET") mux.HandleFunc("/:name/commit/:ref", d.Diff, "GET")
M routes/routes.goroutes/routes.go

@@ -1,6 +1,7 @@

package routes import ( + "bytes" "fmt" "html/template" "log"

@@ -97,6 +98,13 @@ d.Write404(w)

return } + mainBranch, err := gr.FindMainBranch(d.c.Repo.MainBranch) + if err != nil { + d.Write500(w) + log.Println(err) + return + } + commits, err := gr.Commits() if err != nil { d.Write500(w)

@@ -107,7 +115,7 @@

var readmeContent template.HTML for _, readme := range d.c.Repo.Readme { ext := filepath.Ext(readme) - content, _ := gr.FileContent(readme) + content, _ := gr.FileContent(readme, false) if len(content) > 0 { switch ext { case ".md", ".mkd", ".markdown":

@@ -116,7 +124,7 @@ []byte(content),

blackfriday.WithExtensions(blackfriday.CommonExtensions), ) html := bluemonday.UGCPolicy().SanitizeBytes(unsafe) - readmeContent = template.HTML(html) + readmeContent = template.HTML(transformRelativeURLs(string(html), name, mainBranch)) default: readmeContent = template.HTML( fmt.Sprintf(`<pre>%s</pre>`, content),

@@ -128,13 +136,6 @@ }

if readmeContent == "" { log.Printf("no readme found for %s", name) - } - - mainBranch, err := gr.FindMainBranch(d.c.Repo.MainBranch) - if err != nil { - d.Write500(w) - log.Println(err) - return } tpath := filepath.Join(d.c.Dirs.Templates, "*")

@@ -212,12 +213,13 @@ d.Write404(w)

return } - contents, err := gr.FileContent(treePath) + contents, err := gr.FileContent(treePath, false) data := make(map[string]any) data["name"] = name data["ref"] = ref data["desc"] = getDescription(path) data["path"] = treePath + data["raw"] = fmt.Sprintf("/%s/blob/raw/%s/%s", name, ref, treePath) d.showFile(contents, data, w) return

@@ -344,6 +346,26 @@ if err := t.ExecuteTemplate(w, "refs", data); err != nil {

log.Println(err) return } +} + +func (d *deps) ServeStaticInRepo(w http.ResponseWriter, r *http.Request) { + f := flow.Param(r.Context(), "...") + p := flow.Param(r.Context(), "name") + ref := flow.Param(r.Context(), "ref") + + repoPath := filepath.Clean(filepath.Join(d.c.Repo.ScanPath, p)) + gr, err := git.Open(repoPath, ref) + if err != nil { + d.Write500(w) + return + } + + contents, err := gr.FileContent(f, true) + if err != nil { + d.Write500(w) + return + } + http.ServeContent(w, r, filepath.Base(f), time.Unix(0, 0), bytes.NewReader([]byte(contents))) } func (d *deps) ServeStatic(w http.ResponseWriter, r *http.Request) {
M routes/util.goroutes/util.go

@@ -1,14 +1,16 @@

package routes import ( + "fmt" "os" "path/filepath" + "strings" "git.icyphox.sh/legit/git" ) func isGoModule(gr *git.GitRepo) bool { - _, err := gr.FileContent("go.mod") + _, err := gr.FileContent("go.mod", false) return err == nil }

@@ -20,6 +22,13 @@ } else {

desc = "" } return +} + +func transformRelativeURLs(html, repoName, mainBranch string) string { + return strings.ReplaceAll( + html, + "=\"./", + fmt.Sprintf("=\"/%s/blob/raw/%s/", repoName, mainBranch)) } func (d *deps) isIgnored(name string) bool {
M static/style.cssstatic/style.css

@@ -253,6 +253,7 @@ background: var(--light-gray);

display: table; padding: 0.5rem width: 100%; + margin-top: 0.5rem; } .file-content {
M templates/file.htmltemplates/file.html

@@ -7,7 +7,7 @@ {{ template "repoheader" . }}

<body> {{ template "nav" . }} <main> - <p>{{ .path }}</p> + <p>{{ .path }} (<a href="{{ .raw }}">raw</a>)</p> <table class="file-wrapper"> <tbody><tr> <td class="line-numbers">