git-pr
created pr with
3.1
added 3.2
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
changed status to
reviewed
added 3.4
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
cmds
checkout latest patchset:
ssh pr.pico.sh print 3 | git am -3checkout any patchset in a patch request:
ssh pr.pico.sh print 3.[rev] | git am -3add changes to patch request:
git format-patch main --stdout | ssh pr.pico.sh pr add 3set PR to open (enables RSS notifications):
ssh pr.pico.sh pr open 3set PR to draft (stops RSS notifications):
ssh pr.pico.sh pr draft 3
Patchset
3.4
refactor: per-file override for static folder
Eric Bower
2024-07-19T17:43:12ZSemantic diff summary
2 added,
2 modified,
1 signature changed,
1 removed
across 1 analyzed file
+27
-15
web.go
#
| ... | ... | @@ -625,7 +625,7 @@ func chromaStyleHandler(w http.ResponseWriter, r *http.Request) { | |
| 625 | 625 | } | |
| 626 | 626 | } | |
| 627 | 627 | ||
| 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) { | |
| 629 | 629 | return func(w http.ResponseWriter, r *http.Request) { | |
| 630 | 630 | web, err := getWebCtx(r) | |
| 631 | 631 | if err != nil { |
| ... | ... | @@ -635,13 +635,26 @@ func serveFile(staticfs fs.FS) func(w http.ResponseWriter, r *http.Request) { | |
| 635 | 635 | logger := web.Logger | |
| 636 | 636 | ||
| 637 | 637 | 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 | + | ||
| 640 | 652 | if err != nil { | |
| 641 | 653 | logger.Error(err.Error()) | |
| 642 | 654 | http.Error(w, "file not found", 404) | |
| 643 | 655 | return | |
| 644 | 656 | } | |
| 657 | + | ||
| 645 | 658 | contents, err := io.ReadAll(reader) | |
| 646 | 659 | if err != nil { | |
| 647 | 660 | logger.Error(err.Error()) |
| ... | ... | @@ -663,23 +676,20 @@ func serveFile(staticfs fs.FS) func(w http.ResponseWriter, r *http.Request) { | |
| 663 | 676 | } | |
| 664 | 677 | } | |
| 665 | 678 | ||
| 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 { | |
| 670 | 680 | dir := filepath.Join(datadir, dirName) | |
| 671 | 681 | _, 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 | |
| 675 | 684 | } | |
| 685 | + | return os.DirFS(dir) | |
| 686 | + | } | |
| 676 | 687 | ||
| 677 | - | logger.Info("using embeded folder", "dir", dir) | |
| 688 | + | func getEmbedFS(ffs embed.FS, dirName string) (fs.FS, error) { | |
| 678 | 689 | fsys, err := fs.Sub(ffs, dirName) | |
| 679 | 690 | if err != nil { | |
| 680 | 691 | return nil, err | |
| 681 | 692 | } | |
| 682 | - | ||
| 683 | 693 | return fsys, nil | |
| 684 | 694 | } | |
| 685 | 695 |
| ... | ... | @@ -724,11 +734,13 @@ func StartWebServer(cfg *GitCfg) { | |
| 724 | 734 | http.HandleFunc("GET /", ctxMdw(ctx, repoListHandler)) | |
| 725 | 735 | http.HandleFunc("GET /syntax.css", ctxMdw(ctx, chromaStyleHandler)) | |
| 726 | 736 | http.HandleFunc("GET /rss", ctxMdw(ctx, rssHandler)) | |
| 727 | - | filesys, err := getFileSystem(cfg.Logger, staticFS, cfg.DataDir, "static") | |
| 737 | + | embedFS, err := getEmbedFS(embedStaticFS, "static") | |
| 728 | 738 | if err != nil { | |
| 729 | 739 | panic(err) | |
| 730 | 740 | } | |
| 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))) | |
| 732 | 744 | ||
| 733 | 745 | cfg.Logger.Info("starting web server", "addr", addr) | |
| 734 | 746 | err = http.ListenAndServe(addr, nil) |