web frontend for git (tangled's grandpa)
7
fork

Configure Feed

Select the types of activity you want to include in your feed.

routes: render readme

+53 -19
+5
config.yaml
··· 1 1 git: 2 2 scanPath: /home/icy/code/tmp 3 + readme: 4 + - readme 5 + - README 6 + - readme.md 7 + - README.md 3 8 template: 4 9 dir: ./templates 5 10 meta:
+2 -1
config/config.go
··· 9 9 10 10 type Config struct { 11 11 Git struct { 12 - ScanPath string `yaml:"scanPath"` 12 + ScanPath string `yaml:"scanPath"` 13 + Readme []string `yaml:"readme"` 13 14 } `yaml:"git"` 14 15 Template struct { 15 16 Dir string `yaml:"dir"`
+8
routes/handler.go
··· 1 1 package routes 2 2 3 3 import ( 4 + "net/http" 5 + 4 6 "github.com/alexedwards/flow" 5 7 "icyphox.sh/legit/config" 6 8 ) ··· 8 10 func Handlers(c *config.Config) *flow.Mux { 9 11 mux := flow.New() 10 12 d := deps{c} 13 + 14 + mux.NotFound = http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { 15 + d.Write404(w) 16 + }) 17 + 18 + mux.HandleFunc("/", d.Index, "GET") 11 19 mux.HandleFunc("/:name", d.RepoIndex, "GET") 12 20 mux.HandleFunc("/:name/tree/:ref/...", d.RepoTree, "GET") 13 21 mux.HandleFunc("/:name/blob/:ref/...", d.FileContent, "GET")
+26 -9
routes/routes.go
··· 15 15 c *config.Config 16 16 } 17 17 18 + func (d *deps) Index(w http.ResponseWriter, r *http.Request) { 19 + 20 + } 21 + 18 22 func (d *deps) RepoIndex(w http.ResponseWriter, r *http.Request) { 19 23 name := flow.Param(r.Context(), "name") 20 24 name = filepath.Clean(name) ··· 22 26 path := filepath.Join(d.c.Git.ScanPath, name+".git") 23 27 gr, err := git.Open(path, "") 24 28 if err != nil { 25 - Write404(w, *d.c) 29 + d.Write404(w) 26 30 return 27 31 } 28 32 29 33 files, err := gr.FileTree("") 30 34 if err != nil { 31 - Write500(w, *d.c) 35 + d.Write500(w) 32 36 log.Println(err) 33 37 return 34 38 } 35 39 40 + var readmeContent string 41 + for _, readme := range d.c.Git.Readme { 42 + readmeContent, _ = gr.FileContent(readme) 43 + if readmeContent != "" { 44 + break 45 + } 46 + } 47 + 48 + if readmeContent == "" { 49 + log.Printf("no readme found for %s", name) 50 + } 51 + 36 52 data := make(map[string]any) 37 53 data["name"] = name 38 54 // TODO: make this configurable 39 55 data["ref"] = "master" 56 + data["readme"] = readmeContent 40 57 41 58 d.listFiles(files, data, w) 42 59 return ··· 52 69 path := filepath.Join(d.c.Git.ScanPath, name+".git") 53 70 gr, err := git.Open(path, ref) 54 71 if err != nil { 55 - Write404(w, *d.c) 72 + d.Write404(w) 56 73 return 57 74 } 58 75 59 76 files, err := gr.FileTree(treePath) 60 77 if err != nil { 61 - Write500(w, *d.c) 78 + d.Write500(w) 62 79 log.Println(err) 63 80 return 64 81 } ··· 82 99 path := filepath.Join(d.c.Git.ScanPath, name+".git") 83 100 gr, err := git.Open(path, ref) 84 101 if err != nil { 85 - Write404(w, *d.c) 102 + d.Write404(w) 86 103 return 87 104 } 88 105 ··· 102 119 path := filepath.Join(d.c.Git.ScanPath, name+".git") 103 120 gr, err := git.Open(path, ref) 104 121 if err != nil { 105 - Write404(w, *d.c) 122 + d.Write404(w) 106 123 return 107 124 } 108 125 109 126 commits, err := gr.Commits() 110 127 if err != nil { 111 - Write500(w, *d.c) 128 + d.Write500(w) 112 129 log.Println(err) 113 130 return 114 131 } ··· 135 152 path := filepath.Join(d.c.Git.ScanPath, name+".git") 136 153 gr, err := git.Open(path, ref) 137 154 if err != nil { 138 - Write404(w, *d.c) 155 + d.Write404(w) 139 156 return 140 157 } 141 158 142 159 diff, err := gr.Diff() 143 160 if err != nil { 144 - Write500(w, *d.c) 161 + d.Write500(w) 145 162 log.Println(err) 146 163 return 147 164 }
+12 -9
routes/template.go
··· 6 6 "net/http" 7 7 "path/filepath" 8 8 9 - "icyphox.sh/legit/config" 10 9 "icyphox.sh/legit/git" 11 10 ) 12 11 13 - func Write404(w http.ResponseWriter, c config.Config) { 12 + func (d *deps) Write404(w http.ResponseWriter) { 13 + tpath := filepath.Join(d.c.Template.Dir, "*") 14 + t := template.Must(template.ParseGlob(tpath)) 14 15 w.WriteHeader(404) 15 - tpath := filepath.Join(c.Template.Dir, "404.html") 16 - t := template.Must(template.ParseFiles(tpath)) 17 - t.Execute(w, nil) 16 + if err := t.ExecuteTemplate(w, "404", nil); err != nil { 17 + log.Printf("404 template: %s", err) 18 + } 18 19 } 19 20 20 - func Write500(w http.ResponseWriter, c config.Config) { 21 + func (d *deps) Write500(w http.ResponseWriter) { 22 + tpath := filepath.Join(d.c.Template.Dir, "*") 23 + t := template.Must(template.ParseGlob(tpath)) 21 24 w.WriteHeader(500) 22 - tpath := filepath.Join(c.Template.Dir, "500.html") 23 - t := template.Must(template.ParseFiles(tpath)) 24 - t.Execute(w, nil) 25 + if err := t.ExecuteTemplate(w, "500", nil); err != nil { 26 + log.Printf("500 template: %s", err) 27 + } 25 28 } 26 29 27 30 func (d *deps) listFiles(files []git.NiceTree, data map[string]any, w http.ResponseWriter) {