From a0c1641e2fec1771da9719989a1a31881302d3ce Mon Sep 17 00:00:00 2001 From: Ophestra Date: Sat, 2 May 2026 05:05:56 +0900 Subject: [PATCH] cmd/mbf: integrate pkgserver into command info Signed-off-by: Ophestra --- .gitignore | 2 +- cmd/mbf/info.go | 15 +--- cmd/mbf/info_test.go | 23 ++++-- .../internal/pkgserver/api.go | 0 .../internal/pkgserver/api_test.go | 0 .../internal/pkgserver/index.go | 0 .../internal/pkgserver/index_test.go | 0 .../internal/pkgserver/search.go | 0 .../internal/pkgserver/ui/index.html | 0 .../internal/pkgserver/ui/index.ts | 0 .../internal/pkgserver/ui/style.css | 0 .../internal/pkgserver/ui/tsconfig.json | 0 .../internal/pkgserver/ui/ui.go | 0 .../internal/pkgserver/ui/ui_full.go | 0 .../internal/pkgserver/ui/ui_stub.go | 0 cmd/mbf/main.go | 51 +++++++++++- cmd/pkgserver/main.go | 82 ------------------- 17 files changed, 69 insertions(+), 104 deletions(-) rename cmd/{pkgserver => mbf}/internal/pkgserver/api.go (100%) rename cmd/{pkgserver => mbf}/internal/pkgserver/api_test.go (100%) rename cmd/{pkgserver => mbf}/internal/pkgserver/index.go (100%) rename cmd/{pkgserver => mbf}/internal/pkgserver/index_test.go (100%) rename cmd/{pkgserver => mbf}/internal/pkgserver/search.go (100%) rename cmd/{pkgserver => mbf}/internal/pkgserver/ui/index.html (100%) rename cmd/{pkgserver => mbf}/internal/pkgserver/ui/index.ts (100%) rename cmd/{pkgserver => mbf}/internal/pkgserver/ui/style.css (100%) rename cmd/{pkgserver => mbf}/internal/pkgserver/ui/tsconfig.json (100%) rename cmd/{pkgserver => mbf}/internal/pkgserver/ui/ui.go (100%) rename cmd/{pkgserver => mbf}/internal/pkgserver/ui/ui_full.go (100%) rename cmd/{pkgserver => mbf}/internal/pkgserver/ui/ui_stub.go (100%) delete mode 100644 cmd/pkgserver/main.go diff --git a/.gitignore b/.gitignore index d586aa09..96094d86 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ # go generate /cmd/hakurei/LICENSE -/cmd/pkgserver/internal/pkgserver/ui/static +/cmd/mbf/internal/pkgserver/ui/static /internal/pkg/testdata/testtool /internal/rosa/hakurei_current.tar.gz diff --git a/cmd/mbf/info.go b/cmd/mbf/info.go index f421ce66..15357301 100644 --- a/cmd/mbf/info.go +++ b/cmd/mbf/info.go @@ -17,25 +17,12 @@ func commandInfo( args []string, w io.Writer, writeStatus bool, - reportPath string, + r *rosa.Report, ) (err error) { if len(args) == 0 { return errors.New("info requires at least 1 argument") } - var r *rosa.Report - if reportPath != "" { - if r, err = rosa.OpenReport(reportPath); err != nil { - return err - } - defer func() { - if closeErr := r.Close(); err == nil { - err = closeErr - } - }() - defer r.HandleAccess(&err)() - } - // recovered by HandleAccess mustPrintln := func(a ...any) { if _, _err := fmt.Fprintln(w, a...); _err != nil { diff --git a/cmd/mbf/info_test.go b/cmd/mbf/info_test.go index 16e94364..a7219e9c 100644 --- a/cmd/mbf/info_test.go +++ b/cmd/mbf/info_test.go @@ -95,7 +95,7 @@ status : not in report var ( cm *cache buf strings.Builder - rp string + r *rosa.Report ) if tc.status != nil || tc.report != "" { @@ -108,14 +108,25 @@ status : not in report } if tc.report != "" { - rp = filepath.Join(t.TempDir(), "report") - if err := os.WriteFile( - rp, + pathname := filepath.Join(t.TempDir(), "report") + err := os.WriteFile( + pathname, unsafe.Slice(unsafe.StringData(tc.report), len(tc.report)), 0400, - ); err != nil { + ) + if err != nil { t.Fatal(err) } + + r, err = rosa.OpenReport(pathname) + if err != nil { + t.Fatal(err) + } + defer func() { + if err = r.Close(); err != nil { + t.Fatal(err) + } + }() } if tc.status != nil { @@ -157,7 +168,7 @@ status : not in report tc.args, &buf, cm != nil, - rp, + r, ); !reflect.DeepEqual(err, wantErr) { t.Fatalf("commandInfo: error = %v, want %v", err, wantErr) } diff --git a/cmd/pkgserver/internal/pkgserver/api.go b/cmd/mbf/internal/pkgserver/api.go similarity index 100% rename from cmd/pkgserver/internal/pkgserver/api.go rename to cmd/mbf/internal/pkgserver/api.go diff --git a/cmd/pkgserver/internal/pkgserver/api_test.go b/cmd/mbf/internal/pkgserver/api_test.go similarity index 100% rename from cmd/pkgserver/internal/pkgserver/api_test.go rename to cmd/mbf/internal/pkgserver/api_test.go diff --git a/cmd/pkgserver/internal/pkgserver/index.go b/cmd/mbf/internal/pkgserver/index.go similarity index 100% rename from cmd/pkgserver/internal/pkgserver/index.go rename to cmd/mbf/internal/pkgserver/index.go diff --git a/cmd/pkgserver/internal/pkgserver/index_test.go b/cmd/mbf/internal/pkgserver/index_test.go similarity index 100% rename from cmd/pkgserver/internal/pkgserver/index_test.go rename to cmd/mbf/internal/pkgserver/index_test.go diff --git a/cmd/pkgserver/internal/pkgserver/search.go b/cmd/mbf/internal/pkgserver/search.go similarity index 100% rename from cmd/pkgserver/internal/pkgserver/search.go rename to cmd/mbf/internal/pkgserver/search.go diff --git a/cmd/pkgserver/internal/pkgserver/ui/index.html b/cmd/mbf/internal/pkgserver/ui/index.html similarity index 100% rename from cmd/pkgserver/internal/pkgserver/ui/index.html rename to cmd/mbf/internal/pkgserver/ui/index.html diff --git a/cmd/pkgserver/internal/pkgserver/ui/index.ts b/cmd/mbf/internal/pkgserver/ui/index.ts similarity index 100% rename from cmd/pkgserver/internal/pkgserver/ui/index.ts rename to cmd/mbf/internal/pkgserver/ui/index.ts diff --git a/cmd/pkgserver/internal/pkgserver/ui/style.css b/cmd/mbf/internal/pkgserver/ui/style.css similarity index 100% rename from cmd/pkgserver/internal/pkgserver/ui/style.css rename to cmd/mbf/internal/pkgserver/ui/style.css diff --git a/cmd/pkgserver/internal/pkgserver/ui/tsconfig.json b/cmd/mbf/internal/pkgserver/ui/tsconfig.json similarity index 100% rename from cmd/pkgserver/internal/pkgserver/ui/tsconfig.json rename to cmd/mbf/internal/pkgserver/ui/tsconfig.json diff --git a/cmd/pkgserver/internal/pkgserver/ui/ui.go b/cmd/mbf/internal/pkgserver/ui/ui.go similarity index 100% rename from cmd/pkgserver/internal/pkgserver/ui/ui.go rename to cmd/mbf/internal/pkgserver/ui/ui.go diff --git a/cmd/pkgserver/internal/pkgserver/ui/ui_full.go b/cmd/mbf/internal/pkgserver/ui/ui_full.go similarity index 100% rename from cmd/pkgserver/internal/pkgserver/ui/ui_full.go rename to cmd/mbf/internal/pkgserver/ui/ui_full.go diff --git a/cmd/pkgserver/internal/pkgserver/ui/ui_stub.go b/cmd/mbf/internal/pkgserver/ui/ui_stub.go similarity index 100% rename from cmd/pkgserver/internal/pkgserver/ui/ui_stub.go rename to cmd/mbf/internal/pkgserver/ui/ui_stub.go diff --git a/cmd/mbf/main.go b/cmd/mbf/main.go index 0d44bdbc..291e91ef 100644 --- a/cmd/mbf/main.go +++ b/cmd/mbf/main.go @@ -20,6 +20,7 @@ import ( "io" "log" "net" + "net/http" "os" "os/signal" "path/filepath" @@ -41,6 +42,9 @@ import ( "hakurei.app/internal/pkg" "hakurei.app/internal/rosa" "hakurei.app/message" + + "hakurei.app/cmd/mbf/internal/pkgserver" + "hakurei.app/cmd/mbf/internal/pkgserver/ui" ) func main() { @@ -180,6 +184,7 @@ func main() { { var ( + flagBind string flagStatus bool flagReport string ) @@ -187,8 +192,52 @@ func main() { "info", "Display out-of-band metadata of an artifact", func(args []string) (err error) { - return commandInfo(&cm, args, os.Stdout, flagStatus, flagReport) + const shutdownTimeout = 15 * time.Second + + var r *rosa.Report + if flagReport != "" { + if r, err = rosa.OpenReport(flagReport); err != nil { + return err + } + defer func() { + if closeErr := r.Close(); err == nil { + err = closeErr + } + }() + defer r.HandleAccess(&err)() + } + + if flagBind == "" { + return commandInfo(&cm, args, os.Stdout, flagStatus, r) + } + + var mux http.ServeMux + ui.Register(&mux) + if err = pkgserver.Register(ctx, &mux, r); err != nil { + return + } + + server := http.Server{Addr: flagBind, Handler: &mux} + go func() { + <-ctx.Done() + cc, cancel := context.WithTimeout(context.Background(), shutdownTimeout) + defer cancel() + if _err := server.Shutdown(cc); _err != nil { + log.Fatal(_err) + } + }() + + msg.Verbosef("listening on %q", flagBind) + err = server.ListenAndServe() + if errors.Is(err, http.ErrServerClosed) { + err = nil + } + return }, + ).Flag( + &flagBind, + "bind", command.StringFlag(""), + "TCP address for the server to listen on", ).Flag( &flagStatus, "status", command.BoolFlag(false), diff --git a/cmd/pkgserver/main.go b/cmd/pkgserver/main.go deleted file mode 100644 index 62ba15ab..00000000 --- a/cmd/pkgserver/main.go +++ /dev/null @@ -1,82 +0,0 @@ -package main - -import ( - "context" - "errors" - "log" - "net/http" - "os" - "os/signal" - "syscall" - "time" - - "hakurei.app/command" - "hakurei.app/internal/rosa" - - "hakurei.app/cmd/pkgserver/internal/pkgserver" - "hakurei.app/cmd/pkgserver/internal/pkgserver/ui" -) - -const shutdownTimeout = 15 * time.Second - -func main() { - log.SetFlags(0) - log.SetPrefix("pkgserver: ") - - var ( - flagAddr string - ) - - ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP) - defer stop() - - c := command.New(os.Stderr, log.Printf, "pkgserver", func(args []string) error { - var ( - report *rosa.Report - ) - switch len(args) { - case 0: - break - - case 1: - var err error - rosa.DropCaches(rosa.OptLLVMNoLTO) - report, err = rosa.OpenReport(args[0]) - if err != nil { - return err - } - - default: - return errors.New("pkgserver requires 1 argument") - } - - var mux http.ServeMux - ui.Register(&mux) - if err := pkgserver.Register(ctx, &mux, report); err != nil { - return err - } - server := http.Server{ - Addr: flagAddr, - Handler: &mux, - } - go func() { - <-ctx.Done() - c, cancel := context.WithTimeout(context.Background(), shutdownTimeout) - defer cancel() - if err := server.Shutdown(c); err != nil { - log.Fatal(err) - } - }() - return server.ListenAndServe() - }).Flag( - &flagAddr, - "addr", command.StringFlag(":8067"), - "TCP network address to listen on", - ) - c.MustParse(os.Args[1:], func(err error) { - if errors.Is(err, http.ErrServerClosed) { - os.Exit(0) - } - log.Fatal(err) - }) -}