git-pr

created pr with 3.1 on 2024-07-19T14:53:23Z · by c8ef7d19
added 3.2 on 2024-07-19T14:55:48Z · by c8ef7d19
1: 3b99dc0 < -: ------- feat: static assets
2: 8919af5 ! 1: 66cafc6 feat: static assets folder
3: 7346122 ! 2: 5e76ed3 fix(cli): access control for removing patchsets
4: d8792d5 < -: ------- feat: static folder
pr_reviewed on 2024-07-19T15:42:29Z · by 964fa508
changed status to reviewed on 2024-07-19T15:42:29Z · by 964fa508
added 3.4 on 2024-07-19T17:43:47Z · by c8ef7d19
1: cc56ea1 = 1: 0467f9e feat: static assets folder
2: ef749a4 = 2: da1730f review: typo and future enhancement comment
-: ------- > 3: c038404 refactor: per-file override for static folder
changed status to accepted on 2024-07-19T18:27:53Z · by 964fa508
cmds
checkout latest patchset:
ssh pr.pico.sh print 3 | git am -3
checkout any patchset in a patch request:
ssh pr.pico.sh print 3.[rev] | git am -3
add changes to patch request:
git format-patch main --stdout | ssh pr.pico.sh pr add 3
set PR to open (enables RSS notifications):
ssh pr.pico.sh pr open 3
set PR to draft (stops RSS notifications):
ssh pr.pico.sh pr draft 3
+27 -15 web.go #
......@@ -28,7 +28,7 @@ import (
2828 var tmplFS embed.FS
2929
3030 //go:embed static/*
31-var staticFS embed.FS
31+var embedStaticFS embed.FS
3232
3333 type WebCtx struct {
3434 Pr *PrCmd
......@@ -625,7 +625,7 @@ func chromaStyleHandler(w http.ResponseWriter, r *http.Request) {
625625 }
626626 }
627627
628-func serveFile(staticfs fs.FS) func(w http.ResponseWriter, r *http.Request) {
628+func serveFile(userfs fs.FS, embedfs fs.FS) func(w http.ResponseWriter, r *http.Request) {
629629 return func(w http.ResponseWriter, r *http.Request) {
630630 web, err := getWebCtx(r)
631631 if err != nil {
......@@ -635,13 +635,26 @@ func serveFile(staticfs fs.FS) func(w http.ResponseWriter, r *http.Request) {
635635 logger := web.Logger
636636
637637 file := r.PathValue("file")
638- logger.Info("serving file", "file", file, "fs", staticfs)
639- reader, err := staticfs.Open(file)
638+
639+ logger.Info("serving file", "file", file)
640+ // merging both embedded fs and whatever user provides
641+ var reader fs.File
642+ if userfs == nil {
643+ reader, err = embedfs.Open(file)
644+ } else {
645+ reader, err = userfs.Open(file)
646+ if err != nil {
647+ // serve embeded static folder
648+ reader, err = embedfs.Open(file)
649+ }
650+ }
651+
640652 if err != nil {
641653 logger.Error(err.Error())
642654 http.Error(w, "file not found", 404)
643655 return
644656 }
657+
645658 contents, err := io.ReadAll(reader)
646659 if err != nil {
647660 logger.Error(err.Error())
......@@ -663,23 +676,20 @@ func serveFile(staticfs fs.FS) func(w http.ResponseWriter, r *http.Request) {
663676 }
664677 }
665678
666-// review(jolheiser):
667-// Perhaps in the future this could be extended to support per-file. For example, I may want to override CSS vars without providing an entire static assets.
668-// embeded -> embedded
669-func getFileSystem(logger *slog.Logger, ffs embed.FS, datadir string, dirName string) (fs.FS, error) {
679+func getUserDefinedFS(datadir, dirName string) fs.FS {
670680 dir := filepath.Join(datadir, dirName)
671681 _, err := os.Stat(dir)
672- if err == nil {
673- logger.Info("found folder in data_dir", "dir", dir)
674- return os.DirFS(dir), nil
682+ if err != nil {
683+ return nil
675684 }
685+ return os.DirFS(dir)
686+}
676687
677- logger.Info("using embeded folder", "dir", dir)
688+func getEmbedFS(ffs embed.FS, dirName string) (fs.FS, error) {
678689 fsys, err := fs.Sub(ffs, dirName)
679690 if err != nil {
680691 return nil, err
681692 }
682-
683693 return fsys, nil
684694 }
685695
......@@ -724,11 +734,13 @@ func StartWebServer(cfg *GitCfg) {
724734 http.HandleFunc("GET /", ctxMdw(ctx, repoListHandler))
725735 http.HandleFunc("GET /syntax.css", ctxMdw(ctx, chromaStyleHandler))
726736 http.HandleFunc("GET /rss", ctxMdw(ctx, rssHandler))
727- filesys, err := getFileSystem(cfg.Logger, staticFS, cfg.DataDir, "static")
737+ embedFS, err := getEmbedFS(embedStaticFS, "static")
728738 if err != nil {
729739 panic(err)
730740 }
731- http.HandleFunc("GET /static/{file}", ctxMdw(ctx, serveFile(filesys)))
741+ userFS := getUserDefinedFS(cfg.DataDir, "static")
742+
743+ http.HandleFunc("GET /static/{file}", ctxMdw(ctx, serveFile(userFS, embedFS)))
732744
733745 cfg.Logger.Info("starting web server", "addr", addr)
734746 err = http.ListenAndServe(addr, nil)
Back to top