Changes
6 changed files (+91/-91)
-
-
@@ -11,14 +11,14 @@ import ("github.com/pocka/legit/git/service" ) func (d *deps) InfoRefs(w http.ResponseWriter, r *http.Request) { func (d *deps) infoRefs(w http.ResponseWriter, r *http.Request) { name := r.PathValue("name") name = filepath.Clean(name) repo, err := securejoin.SecureJoin(d.c.Repo.ScanPath, name) if err != nil { log.Printf("securejoin error: %v", err) d.Write404(w) d.write404(w) return }
-
@@ -37,14 +37,14 @@ func (d *deps) InfoRefs(w http.ResponseWriter, r *http.Request) {} } func (d *deps) UploadPack(w http.ResponseWriter, r *http.Request) { func (d *deps) uploadPack(w http.ResponseWriter, r *http.Request) { name := r.PathValue("name") name = filepath.Clean(name) repo, err := securejoin.SecureJoin(d.c.Repo.ScanPath, name) if err != nil { log.Printf("securejoin error: %v", err) d.Write404(w) d.write404(w) return }
-
-
-
@@ -13,10 +13,10 @@ import (// Checks for gitprotocol-http(5) specific smells; if found, passes // the request on to the git http service, else render the web frontend. func (d *deps) Multiplex(w http.ResponseWriter, r *http.Request) { func (d *deps) multiplex(w http.ResponseWriter, r *http.Request) { name := r.PathValue("name") if d.isIgnored(name) { d.Write404(w) d.write404(w) return }
-
@@ -31,11 +31,11 @@ func (d *deps) Multiplex(w http.ResponseWriter, r *http.Request) {if path == "info/refs" && r.URL.RawQuery == "service=git-upload-pack" && r.Method == "GET" { d.InfoRefs(w, r) d.infoRefs(w, r) } else if path == "git-upload-pack" && r.Method == "POST" { d.UploadPack(w, r) d.uploadPack(w, r) } else if r.Method == "GET" { d.RepoIndex(w, r) d.repoIndex(w, r) } }
-
@@ -57,18 +57,18 @@ func Handler(c *config.Config, staticDir fs.FS, templatesDir fs.FS) *http.ServeMdebug.Register(mux) mux.HandleFunc("GET /", d.Index) mux.HandleFunc("GET /static/{file}", d.ServeStatic) mux.HandleFunc("GET /{name}", d.Multiplex) mux.HandleFunc("POST /{name}", d.Multiplex) mux.HandleFunc("GET /{name}/tree/{ref}/{rest...}", d.RepoTree) mux.HandleFunc("GET /{name}/blob/{ref}/{rest...}", d.FileContent) mux.HandleFunc("GET /{name}/log/{ref}", d.Log) mux.HandleFunc("GET /{name}/archive/{file}", d.Archive) mux.HandleFunc("GET /{name}/commit/{ref}", d.Diff) mux.HandleFunc("GET /{name}/refs/{$}", d.Refs) mux.HandleFunc("GET /{name}/{rest...}", d.Multiplex) mux.HandleFunc("POST /{name}/{rest...}", d.Multiplex) mux.HandleFunc("GET /", d.index) mux.HandleFunc("GET /static/{file}", d.serveStatic) mux.HandleFunc("GET /{name}", d.multiplex) mux.HandleFunc("POST /{name}", d.multiplex) mux.HandleFunc("GET /{name}/tree/{ref}/{rest...}", d.repoTree) mux.HandleFunc("GET /{name}/blob/{ref}/{rest...}", d.fileContent) mux.HandleFunc("GET /{name}/log/{ref}", d.log) mux.HandleFunc("GET /{name}/archive/{file}", d.archive) mux.HandleFunc("GET /{name}/commit/{ref}", d.diff) mux.HandleFunc("GET /{name}/refs/{$}", d.refs) mux.HandleFunc("GET /{name}/{rest...}", d.multiplex) mux.HandleFunc("POST /{name}/{rest...}", d.multiplex) return mux }
-
-
-
@@ -12,19 +12,19 @@ import ("github.com/pocka/legit/renderer/html" ) type RepoLinkTransformer struct { type repoLinkTransformer struct { repoName string ref string } func NewRepoLinkTransformer(repoName string, ref string) *RepoLinkTransformer { return &RepoLinkTransformer{ func newRepoLinkTransformer(repoName string, ref string) *repoLinkTransformer { return &repoLinkTransformer{ repoName: repoName, ref: ref, } } func (t *RepoLinkTransformer) RewriteInternalMediaSource(src string) string { func (t *repoLinkTransformer) RewriteInternalMediaSource(src string) string { href := src if strings.IndexByte(href, '/') == 0 {
-
@@ -47,7 +47,7 @@ func (t *RepoLinkTransformer) RewriteInternalMediaSource(src string) string {return path + query } func (t *RepoLinkTransformer) RewriteInternalLink(link string) string { func (t *repoLinkTransformer) RewriteInternalLink(link string) string { href := link if strings.IndexByte(href, '/') == 0 {
-
-
-
@@ -8,7 +8,7 @@ import () func TestRewriteInternalMediaSource(t *testing.T) { r := NewRepoLinkTransformer("foo", "trunk") r := newRepoLinkTransformer("foo", "trunk") { input := "media/screenshot.png"
-
@@ -57,7 +57,7 @@ func TestRewriteInternalMediaSource(t *testing.T) {} func TestRewriteInternalLink(t *testing.T) { r := NewRepoLinkTransformer("foo", "trunk") r := newRepoLinkTransformer("foo", "trunk") { input := "CHANGELOG.md"
-
-
-
@@ -36,10 +36,10 @@ type deps struct {plaintext html.PlaintextRenderer } func (d *deps) Index(w http.ResponseWriter, r *http.Request) { func (d *deps) index(w http.ResponseWriter, r *http.Request) { dirs, err := os.ReadDir(d.c.Repo.ScanPath) if err != nil { d.Write500(w) d.write500(w) log.Printf("reading scan path: %s", err) return }
-
@@ -55,7 +55,7 @@ func (d *deps) Index(w http.ResponseWriter, r *http.Request) {path, err := securejoin.SecureJoin(d.c.Repo.ScanPath, name) if err != nil { log.Printf("securejoin error: %v", err) d.Write404(w) d.write404(w) return }
-
@@ -67,7 +67,7 @@ func (d *deps) Index(w http.ResponseWriter, r *http.Request) {c, err := gr.LastCommit() if err != nil { d.Write500(w) d.write500(w) log.Println(err) return }
-
@@ -89,47 +89,47 @@ func (d *deps) Index(w http.ResponseWriter, r *http.Request) {Repositories: summaries, } if err := d.Template().ExecuteTemplate(w, "repo-list", data); err != nil { if err := d.template().ExecuteTemplate(w, "repo-list", data); err != nil { log.Println(err) return } } func (d *deps) RepoIndex(w http.ResponseWriter, r *http.Request) { func (d *deps) repoIndex(w http.ResponseWriter, r *http.Request) { name := r.PathValue("name") if d.isIgnored(name) { d.Write404(w) d.write404(w) return } name = filepath.Clean(name) path, err := securejoin.SecureJoin(d.c.Repo.ScanPath, name) if err != nil { log.Printf("securejoin error: %v", err) d.Write404(w) d.write404(w) return } gr, err := git.Open(path, "") if err != nil { d.Write404(w) d.write404(w) return } commits, _, err := gr.Commits(git.CommitsOptions{Limit: 3}) if err != nil { d.Write500(w) d.write500(w) log.Println(err) return } mainBranch, err := gr.FindMainBranch(d.c.Repo.MainBranch) if err != nil { d.Write500(w) d.write500(w) log.Println(err) return } transformer := NewRepoLinkTransformer(name, mainBranch) transformer := newRepoLinkTransformer(name, mainBranch) var readmeContent template.HTML for _, readme := range d.c.Repo.Readme {
-
@@ -172,16 +172,16 @@ func (d *deps) RepoIndex(w http.ResponseWriter, r *http.Request) {IsGoModule: isGoModule(gr), } if err := d.Template().ExecuteTemplate(w, "repo-top", data); err != nil { if err := d.template().ExecuteTemplate(w, "repo-top", data); err != nil { log.Println(err) return } } func (d *deps) RepoTree(w http.ResponseWriter, r *http.Request) { func (d *deps) repoTree(w http.ResponseWriter, r *http.Request) { name := r.PathValue("name") if d.isIgnored(name) { d.Write404(w) d.write404(w) return } treePath := r.PathValue("rest")
-
@@ -191,18 +191,18 @@ func (d *deps) RepoTree(w http.ResponseWriter, r *http.Request) {path, err := securejoin.SecureJoin(d.c.Repo.ScanPath, name) if err != nil { log.Printf("securejoin error: %v", err) d.Write404(w) d.write404(w) return } gr, err := git.Open(path, ref) if err != nil { d.Write404(w) d.write404(w) return } files, err := gr.FileTree(treePath) if err != nil { d.Write500(w) d.write500(w) log.Println(err) return }
-
@@ -224,18 +224,18 @@ func (d *deps) RepoTree(w http.ResponseWriter, r *http.Request) {Files: files, } if err := d.Template().ExecuteTemplate(w, "repo-tree-ref", data); err != nil { if err := d.template().ExecuteTemplate(w, "repo-tree-ref", data); err != nil { log.Println(err) return } } func (d *deps) FileContent(w http.ResponseWriter, r *http.Request) { func (d *deps) fileContent(w http.ResponseWriter, r *http.Request) { raw := r.URL.Query().Has("raw") name := r.PathValue("name") if d.isIgnored(name) { d.Write404(w) d.write404(w) return } treePath := r.PathValue("rest")
-
@@ -245,25 +245,25 @@ func (d *deps) FileContent(w http.ResponseWriter, r *http.Request) {path, err := securejoin.SecureJoin(d.c.Repo.ScanPath, name) if err != nil { log.Printf("securejoin error: %v", err) d.Write404(w) d.write404(w) return } gr, err := git.Open(path, ref) if err != nil { d.Write404(w) d.write404(w) return } file, err := gr.File(treePath) if err != nil { d.Write500(w) d.write500(w) return } contents, err := file.Contents() if err != nil { d.Write500(w) d.write500(w) return }
-
@@ -298,14 +298,14 @@ func (d *deps) FileContent(w http.ResponseWriter, r *http.Request) {renderer := d.htmlRenderer(file) if renderer == nil { log.Printf("Requested HTML preview for %s/%s, but the filetype has no HTML renderer", name, treePath) d.Write404(w) d.write404(w) return } html, err := renderer.Render([]byte(contents), NewRepoLinkTransformer(name, ref)) html, err := renderer.Render([]byte(contents), newRepoLinkTransformer(name, ref)) if err != nil { log.Printf("Failed to render HTML preview: %s", err) d.Write500(w) d.write500(w) return }
-
@@ -316,7 +316,7 @@ func (d *deps) FileContent(w http.ResponseWriter, r *http.Request) {Content: template.HTML(html), } if err := d.Template().ExecuteTemplate(w, "repo-blob-ref-html-preview", data); err != nil { if err := d.template().ExecuteTemplate(w, "repo-blob-ref-html-preview", data); err != nil { log.Println(err) return }
-
@@ -324,7 +324,7 @@ func (d *deps) FileContent(w http.ResponseWriter, r *http.Request) {return default: log.Printf("Got ?preview=%s, but not preview renderer is available for the type", previewType) d.Write404(w) d.write404(w) return } }
-
@@ -332,7 +332,7 @@ func (d *deps) FileContent(w http.ResponseWriter, r *http.Request) {lc, err := countLines(strings.NewReader(contents)) if err != nil { log.Printf("Failed to count lines for %s: %s", r.URL.Path, err) d.Write500(w) d.write500(w) return }
-
@@ -368,16 +368,16 @@ func (d *deps) FileContent(w http.ResponseWriter, r *http.Request) {} } if err := d.Template().ExecuteTemplate(w, "repo-blob-ref", data); err != nil { if err := d.template().ExecuteTemplate(w, "repo-blob-ref", data); err != nil { log.Println(err) return } } func (d *deps) Archive(w http.ResponseWriter, r *http.Request) { func (d *deps) archive(w http.ResponseWriter, r *http.Request) { name := r.PathValue("name") if d.isIgnored(name) { d.Write404(w) d.write404(w) return }
-
@@ -385,7 +385,7 @@ func (d *deps) Archive(w http.ResponseWriter, r *http.Request) {// TODO: extend this to add more files compression (e.g.: xz) if !strings.HasSuffix(file, ".tar.gz") { d.Write404(w) d.write404(w) return }
-
@@ -400,13 +400,13 @@ func (d *deps) Archive(w http.ResponseWriter, r *http.Request) {path, err := securejoin.SecureJoin(d.c.Repo.ScanPath, name) if err != nil { log.Printf("securejoin error: %v", err) d.Write404(w) d.write404(w) return } gr, err := git.Open(path, ref) if err != nil { d.Write404(w) d.write404(w) return }
-
@@ -431,10 +431,10 @@ func (d *deps) Archive(w http.ResponseWriter, r *http.Request) {} } func (d *deps) Log(w http.ResponseWriter, r *http.Request) { func (d *deps) log(w http.ResponseWriter, r *http.Request) { name := r.PathValue("name") if d.isIgnored(name) { d.Write404(w) d.write404(w) return } ref := r.PathValue("ref")
-
@@ -442,13 +442,13 @@ func (d *deps) Log(w http.ResponseWriter, r *http.Request) {path, err := securejoin.SecureJoin(d.c.Repo.ScanPath, name) if err != nil { log.Printf("securejoin error: %v", err) d.Write404(w) d.write404(w) return } gr, err := git.Open(path, ref) if err != nil { d.Write404(w) d.write404(w) return }
-
@@ -466,7 +466,7 @@ func (d *deps) Log(w http.ResponseWriter, r *http.Request) {commits, page, err := gr.Commits(opts) if err != nil { d.Write500(w) d.write500(w) log.Println(err) return }
-
@@ -497,16 +497,16 @@ func (d *deps) Log(w http.ResponseWriter, r *http.Request) {NextPageHref: nextPageHref, } if err := d.Template().ExecuteTemplate(w, "repo-log-ref", data); err != nil { if err := d.template().ExecuteTemplate(w, "repo-log-ref", data); err != nil { log.Println(err) return } } func (d *deps) Diff(w http.ResponseWriter, r *http.Request) { func (d *deps) diff(w http.ResponseWriter, r *http.Request) { name := r.PathValue("name") if d.isIgnored(name) { d.Write404(w) d.write404(w) return } ref := r.PathValue("ref")
-
@@ -514,18 +514,18 @@ func (d *deps) Diff(w http.ResponseWriter, r *http.Request) {path, err := securejoin.SecureJoin(d.c.Repo.ScanPath, name) if err != nil { log.Printf("securejoin error: %v", err) d.Write404(w) d.write404(w) return } gr, err := git.Open(path, ref) if err != nil { d.Write404(w) d.write404(w) return } diff, err := gr.Diff() if err != nil { d.Write500(w) d.write500(w) log.Println(err) return }
-
@@ -543,29 +543,29 @@ func (d *deps) Diff(w http.ResponseWriter, r *http.Request) {Diff: diff, } if err := d.Template().ExecuteTemplate(w, "repo-commit", data); err != nil { if err := d.template().ExecuteTemplate(w, "repo-commit", data); err != nil { log.Println(err) return } } func (d *deps) Refs(w http.ResponseWriter, r *http.Request) { func (d *deps) refs(w http.ResponseWriter, r *http.Request) { name := r.PathValue("name") if d.isIgnored(name) { d.Write404(w) d.write404(w) return } path, err := securejoin.SecureJoin(d.c.Repo.ScanPath, name) if err != nil { log.Printf("securejoin error: %v", err) d.Write404(w) d.write404(w) return } gr, err := git.Open(path, "") if err != nil { d.Write404(w) d.write404(w) return }
-
@@ -578,13 +578,13 @@ func (d *deps) Refs(w http.ResponseWriter, r *http.Request) {branches, err := gr.Branches() if err != nil { log.Println(err) d.Write500(w) d.write500(w) return } mainBranch, err := gr.FindMainBranch(d.c.Repo.MainBranch) if err != nil { d.Write500(w) d.write500(w) log.Println(err) return }
-
@@ -601,17 +601,17 @@ func (d *deps) Refs(w http.ResponseWriter, r *http.Request) {Branches: branches, } if err := d.Template().ExecuteTemplate(w, "repo-refs", data); err != nil { if err := d.template().ExecuteTemplate(w, "repo-refs", data); err != nil { log.Println(err) return } } func (d *deps) ServeStatic(w http.ResponseWriter, r *http.Request) { func (d *deps) serveStatic(w http.ResponseWriter, r *http.Request) { name := r.PathValue("file") name = filepath.Clean(name) if !filepath.IsLocal(name) { d.Write404(w) d.write404(w) return }
-
-
-
@@ -6,7 +6,7 @@ import ("net/http" ) func (d *deps) Template() *template.Template { func (d *deps) template() *template.Template { if d.t != nil { return d.t }
-
@@ -15,24 +15,24 @@ func (d *deps) Template() *template.Template {return t } func (d *deps) Write404(w http.ResponseWriter) { func (d *deps) write404(w http.ResponseWriter) { data := error404Data{ Config: d.c, } w.WriteHeader(404) if err := d.Template().ExecuteTemplate(w, "404", data); err != nil { if err := d.template().ExecuteTemplate(w, "404", data); err != nil { log.Printf("404 template: %s", err) } } func (d *deps) Write500(w http.ResponseWriter) { func (d *deps) write500(w http.ResponseWriter) { data := error500Data{ Config: d.c, } w.WriteHeader(500) if err := d.Template().ExecuteTemplate(w, "500", data); err != nil { if err := d.template().ExecuteTemplate(w, "500", data); err != nil { log.Printf("500 template: %s", err) } }
-