All checks were successful
Test / Create distribution (push) Successful in 1m0s
Test / Sandbox (push) Successful in 2m45s
Test / Hakurei (push) Successful in 3m47s
Test / ShareFS (push) Successful in 3m44s
Test / Sandbox (race detector) (push) Successful in 5m14s
Test / Hakurei (race detector) (push) Successful in 6m21s
Test / Flake checks (push) Successful in 1m19s
This is cleaner with less shared state. Signed-off-by: Ophestra <cat@gensokyo.uk>
128 lines
2.6 KiB
Go
128 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"strings"
|
|
|
|
"hakurei.app/internal/pkg"
|
|
"hakurei.app/internal/rosa"
|
|
)
|
|
|
|
// commandInfo implements the info subcommand.
|
|
func commandInfo(
|
|
cm *cache,
|
|
args []string,
|
|
w io.Writer,
|
|
writeStatus bool,
|
|
reportPath string,
|
|
) (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 {
|
|
panic(_err)
|
|
}
|
|
}
|
|
mustPrint := func(a ...any) {
|
|
if _, _err := fmt.Fprint(w, a...); _err != nil {
|
|
panic(_err)
|
|
}
|
|
}
|
|
|
|
for i, name := range args {
|
|
if p, ok := rosa.ResolveName(name); !ok {
|
|
return fmt.Errorf("unknown artifact %q", name)
|
|
} else {
|
|
var suffix string
|
|
if version := rosa.Std.Version(p); version != rosa.Unversioned {
|
|
suffix += "-" + version
|
|
}
|
|
mustPrintln("name : " + name + suffix)
|
|
|
|
meta := rosa.GetMetadata(p)
|
|
mustPrintln("description : " + meta.Description)
|
|
if meta.Website != "" {
|
|
mustPrintln("website : " +
|
|
strings.TrimSuffix(meta.Website, "/"))
|
|
}
|
|
if len(meta.Dependencies) > 0 {
|
|
mustPrint("depends on :")
|
|
for _, d := range meta.Dependencies {
|
|
s := rosa.GetMetadata(d).Name
|
|
if version := rosa.Std.Version(d); version != rosa.Unversioned {
|
|
s += "-" + version
|
|
}
|
|
mustPrint(" " + s)
|
|
}
|
|
mustPrintln()
|
|
}
|
|
|
|
const statusPrefix = "status : "
|
|
if writeStatus {
|
|
if r == nil {
|
|
var f io.ReadSeekCloser
|
|
err = cm.Do(func(cache *pkg.Cache) (err error) {
|
|
f, err = cache.OpenStatus(rosa.Std.Load(p))
|
|
return
|
|
})
|
|
if err != nil {
|
|
if errors.Is(err, os.ErrNotExist) {
|
|
mustPrintln(
|
|
statusPrefix + "not yet cured",
|
|
)
|
|
} else {
|
|
return
|
|
}
|
|
} else {
|
|
mustPrint(statusPrefix)
|
|
_, err = io.Copy(w, f)
|
|
if err = errors.Join(err, f.Close()); err != nil {
|
|
return
|
|
}
|
|
}
|
|
} else if err = cm.Do(func(cache *pkg.Cache) (err error) {
|
|
status, n := r.ArtifactOf(cache.Ident(rosa.Std.Load(p)))
|
|
if status == nil {
|
|
mustPrintln(
|
|
statusPrefix + "not in report",
|
|
)
|
|
} else {
|
|
mustPrintln("size :", n)
|
|
mustPrint(statusPrefix)
|
|
if _, err = w.Write(status); err != nil {
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}); err != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
if i != len(args)-1 {
|
|
mustPrintln()
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|