package owners import ( "context" "flag" "fmt" "os" "path/filepath" "github.com/peterbourgon/ff/v3" "github.com/peterbourgon/ff/v3/ffcli" "gopkg.in/yaml.v2" repoowners "edge-infra.dev/pkg/f8n/devinfra/repo/owners" ) type update struct { *owners } func newUpdate(o *owners) *ffcli.Command { u := &update{owners: o} fs := flag.NewFlagSet("hack owners update", flag.ExitOnError) u.owners.RegisterFlags(fs) return &ffcli.Command{ Name: "update", FlagSet: fs, Exec: u.Exec, Options: []ff.Option{ ff.WithEnvVarNoPrefix(), }, } } func (u *update) Exec(_ context.Context, _ []string) error { data, err := u.generatePBotCfg() if err != nil { return err } return u.createFile(data) } func (u *update) generatePBotCfg() ([]byte, error) { keys, ownersFiles, err := u.collectOwners() if err != nil { return nil, fmt.Errorf("failed to collect OWNERS files: %w", err) } root, err := u.loadOwnersFile(filepath.Join(u.Paths.RepoRoot, u.rootRulesFile)) if err != nil { return nil, err } pbotConfig, err := repoowners.GeneratePolicyBotConfig( keys, ownersFiles, root.Rules, ) if err != nil { return nil, fmt.Errorf("failed to generate policy-bot config: %w", err) } return yaml.Marshal(pbotConfig) } func (u *update) createFile(d []byte) error { if err := os.WriteFile(u.policyBotFile, d, 0644); err != nil { return fmt.Errorf("failed to write %s: %w", u.policyBotFile, err) } return nil }