internal/shape/golist.go
Ref: Size: 985 B History
package shape
import (
"bytes"
"encoding/json"
"fmt"
"os"
"os/exec"
)
// goList returns the raw package list for the module via `go list -json` over
// its internal/... and cmd/... packages. GOOS is pinned to linux: the stack is
// Linux-only (netlink, cloud-hypervisor), so pinning keeps output identical
// regardless of the contributor's OS. `go list` only resolves build
// constraints here — it does not compile — so this is safe cross-platform.
func goList() ([]rawPackage, error) {
cmd := exec.Command("go", "list", "-json",
module+"/internal/...", module+"/cmd/...")
cmd.Env = append(os.Environ(), "GOOS=linux")
out, err := cmd.Output()
if err != nil {
return nil, fmt.Errorf("go list: %w", err)
}
var pkgs []rawPackage
dec := json.NewDecoder(bytes.NewReader(out))
for dec.More() {
var p rawPackage
if err := dec.Decode(&p); err != nil {
return nil, fmt.Errorf("decode go list output: %w", err)
}
pkgs = append(pkgs, p)
}
return pkgs, nil
}