a73x

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
}