diff --git a/tools/bump/area.go b/tools/bump/area.go index b328680a..80ff2a55 100644 --- a/tools/bump/area.go +++ b/tools/bump/area.go @@ -82,13 +82,23 @@ func allAreas() []area { areas = append(areas, imageAreas()...) areas = append(areas, actionAreas()...) - return append(areas, area{ + areas = append(areas, area{ Name: "generate", Needs: []string{"gomod", "tools:oapi-codegen"}, Apply: applyGenerate, Gate: gateGenerate, Message: func(change) string { return "all: regenerate generated files" }, }) + + // Last, so it also covers whatever the generators emitted. nixpkgs decides + // which prettier and gofumpt the tree is formatted with, so a lock bump can + // reformat files no other area went near. + return append(areas, area{ + Name: "fmt", + Needs: []string{"flake"}, + Apply: applyFormat, + Message: func(change) string { return "all: apply the formatters from the new toolchain" }, + }) } // runAreas applies each area in order, committing the ones that hold and diff --git a/tools/bump/generate.go b/tools/bump/generate.go index 6eafad95..6ae95216 100644 --- a/tools/bump/generate.go +++ b/tools/bump/generate.go @@ -129,3 +129,27 @@ func gateGenerate(ctx context.Context, r *repo) error { return nil } + +// applyFormat re-runs the repository formatters. A toolchain bump can change +// what "formatted" means: a newer prettier out of nixpkgs reformats files no +// bump touched, and the formatting check then fails on a tree the bot never +// edited. Running last means it also tidies whatever the generators emitted. +func applyFormat(ctx context.Context, r *repo) (change, error) { + if _, err := r.nixRun(ctx, "make", "fmt"); err != nil { //nolint:noinlineerr + return change{}, err + } + + touched, err := changedFiles(ctx, r) + if err != nil { + return change{}, err + } + + if len(touched) == 0 { + return change{Empty: true}, nil + } + + return change{ + Summary: fmt.Sprintf("%d file(s) reformatted", len(touched)), + Detail: touched, + }, nil +}