diff --git a/cmd/nixbuild/main.go b/cmd/nixbuild/main.go index 6741c75..e0764f6 100644 --- a/cmd/nixbuild/main.go +++ b/cmd/nixbuild/main.go @@ -118,6 +118,32 @@ func main() { }). Flag(&resolveFlagOut, "o", command.StringFlag("store-paths"), "Path to write collected store paths") + c.Command("stat", "Compute the instantiated deduplication stat of an installable", func(args []string) error { + var installable string + if err := formatInstallable("instantiated", &installable, flagNixOS, args); err != nil { + return err + } + + log.Println("initialising evaluator") + var collective []string + if eval, err := nixbuild.NewInstantiatedEvaluator(ctx, installable); err != nil { + return commandHandlerError(fmt.Sprintf("cannot initialise evaluator: %v", err)) + } else { + log.Println("collecting paths") + collective = slices.Collect(eval.Instantiated()) + if err := eval.Err(); err != nil { + return commandHandlerError(fmt.Sprintf("cannot collect: %v", err)) + } + } + + l := len(collective) + slices.Sort(collective) + collective = slices.Compact(collective) + log.Printf("`%s`: %d paths instantiated, %d duplicate, dedup %.1f%%", + installable, l, l-len(collective), float64(l-len(collective))/float64(l)*100) + return nil + }) + c.Command("instantiated", "Evaluate an installable and output all derivations instantiated during evaluation", func(args []string) error { var installable string if err := formatInstallable("instantiated", &installable, flagNixOS, args); err != nil {