(args []string)
| 167 | } |
| 168 | |
| 169 | func executeBlastRadiusSubcommand(args []string) int { |
| 170 | limits := defaultBlastRadiusLimits() |
| 171 | fs := flag.NewFlagSet("blast-radius", flag.ContinueOnError) |
| 172 | fs.SetOutput(os.Stderr) |
| 173 | |
| 174 | // Format flags resolve last-wins: passing more than one simply uses the |
| 175 | // last one on the command line (matching the original shell wrapper). |
| 176 | format := blastRadiusFormatMarkdown |
| 177 | chooseFormat := func(f blastRadiusFormat) func(string) error { |
| 178 | return func(string) error { |
| 179 | format = f |
| 180 | return nil |
| 181 | } |
| 182 | } |
| 183 | var help bool |
| 184 | ref := fs.String("ref", "main", "Branch/ref to compare against") |
| 185 | fs.BoolFunc("json", "Emit a single JSON object", chooseFormat(blastRadiusFormatJSON)) |
| 186 | fs.BoolFunc("markdown", "Emit Markdown output", chooseFormat(blastRadiusFormatMarkdown)) |
| 187 | fs.BoolFunc("md", "Emit Markdown output", chooseFormat(blastRadiusFormatMarkdown)) |
| 188 | fs.BoolFunc("text", "Emit plain text output", chooseFormat(blastRadiusFormatText)) |
| 189 | fs.BoolVar(&help, "help", false, "Show blast-radius help") |
| 190 | fs.BoolVar(&help, "h", false, "Show blast-radius help") |
| 191 | fs.IntVar(&limits.MaxTotalChars, "max-total-chars", limits.MaxTotalChars, "Hard cap for markdown/text output") |
| 192 | fs.IntVar(&limits.MaxChangedFiles, "max-changed-files", limits.MaxChangedFiles, "Maximum changed files to include") |
| 193 | fs.IntVar(&limits.MaxAffected, "max-affected", limits.MaxAffected, "Maximum affected files outside diff") |
| 194 | fs.IntVar(&limits.MaxContext, "max-context", limits.MaxContext, "Maximum dependency context entries outside diff") |
| 195 | fs.IntVar(&limits.MaxSnippets, "max-snippets", limits.MaxSnippets, "Maximum impact snippets") |
| 196 | fs.IntVar(&limits.MaxSnippetsPerChanged, "max-snippets-per-changed", limits.MaxSnippetsPerChanged, "Maximum snippets per changed file") |
| 197 | fs.IntVar(&limits.SnippetRadius, "snippet-radius", limits.SnippetRadius, "Lines of context around each snippet match") |
| 198 | fs.IntVar(&limits.MaxSnippetChars, "max-snippet-chars", limits.MaxSnippetChars, "Maximum characters per snippet") |
| 199 | fs.IntVar(&limits.MaxDiffChars, "max-diff-chars", limits.MaxDiffChars, "Maximum diff section characters") |
| 200 | fs.IntVar(&limits.MaxDepsChars, "max-deps-chars", limits.MaxDepsChars, "Maximum dependency section characters") |
| 201 | fs.IntVar(&limits.MaxImportersChars, "max-importers-chars", limits.MaxImportersChars, "Maximum importer section characters") |
| 202 | fs.IntVar(&limits.MaxImporterFiles, "max-importer-files", limits.MaxImporterFiles, "Maximum changed files to render importer sections for") |
| 203 | fs.IntVar(&limits.MaxImportersPerFile, "max-importers-per-file", limits.MaxImportersPerFile, "Maximum importer/import list entries per file in JSON") |
| 204 | fs.Usage = func() { |
| 205 | printBlastRadiusUsage(fs) |
| 206 | } |
| 207 | |
| 208 | root, err := parseBlastRadiusArgs(fs, args) |
| 209 | if err != nil { |
| 210 | if errors.Is(err, flag.ErrHelp) { |
| 211 | return 0 |
| 212 | } |
| 213 | return 2 |
| 214 | } |
| 215 | |
| 216 | if help { |
| 217 | fs.Usage() |
| 218 | return 0 |
| 219 | } |
| 220 | |
| 221 | limits = clampBlastRadiusLimits(limits) |
| 222 | absRoot, cleanup, err := resolveBlastRadiusRoot(root) |
| 223 | if err != nil { |
| 224 | fmt.Fprintf(os.Stderr, "Error preparing root: %v\n", err) |
| 225 | return 1 |
| 226 | } |
no test coverage detected