|
1 | 1 | using DepRadar.Cli; |
2 | 2 |
|
3 | 3 | // CI-friendly entry point: dispatch the verb and return a process exit code. |
4 | | -// `depradar scan <target>` is the only verb today; --help prints usage. |
5 | 4 | using var cts = new CancellationTokenSource(); |
6 | 5 | Console.CancelKeyPress += (_, e) => |
7 | 6 | { |
|
15 | 14 | return args.Length == 0 ? ExitCodes.Usage : ExitCodes.Ok; |
16 | 15 | } |
17 | 16 |
|
18 | | -return args[0] switch |
| 17 | +// A dead registry/OSV after the resilience pipeline gave up is an OPERATIONAL failure, |
| 18 | +// not a policy verdict — report it cleanly (no stack trace) with its own exit code so |
| 19 | +// CI can retry instead of failing the gate. |
| 20 | +try |
19 | 21 | { |
20 | | - "scan" => await ScanCommand.RunAsync(args[1..], cts.Token), |
21 | | - "diff" => await DiffCommand.RunAsync(args[1..], cts.Token), |
22 | | - "fix" => await FixCommand.RunAsync(args[1..], cts.Token), |
23 | | - "npm" => await NpmCommand.RunAsync(args[1..], cts.Token), |
24 | | - "pypi" => await PyPiCommand.RunAsync(args[1..], cts.Token), |
25 | | - "cargo" => await CargoCommand.RunAsync(args[1..], cts.Token), |
26 | | - "go" => await GoCommand.RunAsync(args[1..], cts.Token), |
27 | | - var unknown => Fail(unknown), |
28 | | -}; |
| 22 | + return args[0] switch |
| 23 | + { |
| 24 | + "scan" => await ScanCommand.RunAsync(args[1..], cts.Token), |
| 25 | + "diff" => await DiffCommand.RunAsync(args[1..], cts.Token), |
| 26 | + "fix" => await FixCommand.RunAsync(args[1..], cts.Token), |
| 27 | + "npm" => await NpmCommand.RunAsync(args[1..], cts.Token), |
| 28 | + "pypi" => await PyPiCommand.RunAsync(args[1..], cts.Token), |
| 29 | + "cargo" => await CargoCommand.RunAsync(args[1..], cts.Token), |
| 30 | + "go" => await GoCommand.RunAsync(args[1..], cts.Token), |
| 31 | + var unknown => Fail(unknown), |
| 32 | + }; |
| 33 | +} |
| 34 | +catch (OperationCanceledException) when (cts.IsCancellationRequested) |
| 35 | +{ |
| 36 | + Console.Error.WriteLine("Cancelled."); |
| 37 | + return ExitCodes.Unavailable; |
| 38 | +} |
| 39 | +catch (Exception exception) when (exception is HttpRequestException or TaskCanceledException or TimeoutException) |
| 40 | +{ |
| 41 | + Console.Error.WriteLine($"error: an external service is unreachable — {exception.Message}"); |
| 42 | + Console.Error.WriteLine("Check your network (or the registry/OSV status) and try again."); |
| 43 | + return ExitCodes.Unavailable; |
| 44 | +} |
29 | 45 |
|
30 | 46 | static int Fail(string verb) |
31 | 47 | { |
|
0 commit comments