What: - delete oracle package and plugin exports - remove oracle from tool update and skill sync pipelines - remove oracle mentions from README Why: - oracle is no longer part of the bundled toolchain - keep package/update surface aligned with active bundled plugins only Tests: - go test ./... (pass) - nix flake check --no-build (pass)
94 lines
2.4 KiB
Go
94 lines
2.4 KiB
Go
package internal
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"os/exec"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
type PrefetchResult struct {
|
|
Hash string `json:"hash"`
|
|
}
|
|
|
|
type PrefetchGitHubResult struct {
|
|
Hash string `json:"hash"`
|
|
}
|
|
|
|
func PrefetchHash(url string) (string, error) {
|
|
cmd := exec.Command("nix", "store", "prefetch-file", "--json", url)
|
|
var stdout bytes.Buffer
|
|
var stderr bytes.Buffer
|
|
cmd.Stdout = &stdout
|
|
cmd.Stderr = &stderr
|
|
if err := cmd.Run(); err != nil {
|
|
return "", fmt.Errorf("prefetch failed: %v\nstdout:\n%s\nstderr:\n%s", err, stdout.String(), stderr.String())
|
|
}
|
|
var res PrefetchResult
|
|
if err := json.Unmarshal(stdout.Bytes(), &res); err != nil {
|
|
return "", fmt.Errorf("prefetch json parse failed: %v\nstdout:\n%s\nstderr:\n%s", err, stdout.String(), stderr.String())
|
|
}
|
|
if res.Hash == "" {
|
|
return "", fmt.Errorf("empty hash for %s", url)
|
|
}
|
|
return res.Hash, nil
|
|
}
|
|
|
|
func PrefetchGitHub(owner, repo, rev string) (string, error) {
|
|
cmd := exec.Command("nix", "run", "nixpkgs#nix-prefetch-github", "--", "--json", "--quiet", owner, repo, "--rev", rev)
|
|
var out bytes.Buffer
|
|
cmd.Stdout = &out
|
|
cmd.Stderr = &out
|
|
if err := cmd.Run(); err != nil {
|
|
return "", fmt.Errorf("prefetch github failed: %v: %s", err, out.String())
|
|
}
|
|
raw := out.String()
|
|
start := strings.Index(raw, "{")
|
|
end := strings.LastIndex(raw, "}")
|
|
if start == -1 || end == -1 || end <= start {
|
|
return "", fmt.Errorf("prefetch github returned non-json: %s", raw)
|
|
}
|
|
payload := raw[start : end+1]
|
|
var res PrefetchGitHubResult
|
|
if err := json.Unmarshal([]byte(payload), &res); err != nil {
|
|
return "", err
|
|
}
|
|
if res.Hash == "" {
|
|
return "", fmt.Errorf("empty hash for %s/%s@%s", owner, repo, rev)
|
|
}
|
|
return res.Hash, nil
|
|
}
|
|
|
|
func NixBuildSummarize() (string, error) {
|
|
return NixBuildSummarizeSystem("")
|
|
}
|
|
|
|
func NixBuildSummarizeSystem(system string) (string, error) {
|
|
args := []string{"build", ".#summarize"}
|
|
if system != "" {
|
|
args = append(args, "--system", system)
|
|
}
|
|
cmd := exec.Command("nix", args...)
|
|
var out bytes.Buffer
|
|
cmd.Stdout = &out
|
|
cmd.Stderr = &out
|
|
err := cmd.Run()
|
|
return out.String(), err
|
|
}
|
|
|
|
func ExtractGotHash(log string) string {
|
|
// Nix typically prints something like:
|
|
// got: sha256-....
|
|
// but sometimes wraps/indents. Keep this forgiving.
|
|
re := regexp.MustCompile(`(?i)got:\s*"?(sha256-[A-Za-z0-9+/=]+)"?`)
|
|
for _, line := range strings.Split(log, "\n") {
|
|
match := re.FindStringSubmatch(line)
|
|
if len(match) > 1 {
|
|
return match[1]
|
|
}
|
|
}
|
|
return ""
|
|
}
|