fix(pr): report checks like gh, exit 8 while they are pending

tea pr checks printed relative links, "Error: pull request checks have
not all succeeded" with exit 1 for checks that were only pending, and
nothing at all without checks. It now heads the table with a colored
verdict and "0 failing, 1 successful, and 2 pending checks", prints a
status icon and absolute links, and exits 8 while checks are pending
and 1 when one failed, without an Error line (D21). clierr.Quiet
carries such an exit code past main without a message. Without checks
it says "no checks reported for pull request alice/x#8".

--watch redraws the summary in place on a terminal, and an expired
--timeout reads "timed out after 3s waiting for 2 pending checks". The
pull request argument is optional, and --web opens the pull request.

Signed-off-by: bircni <bircni@icloud.com>
This commit is contained in:
bircni committed 2026-10-11 23:54:47 +02:00
1 parent 7930f80865
commit 2c5e005bcf
6 files changed
+239 -36

No files matched your search

+17 -1
View File
@@ -14,9 +14,25 @@ const (
Usage = 2
Canceled = 3
Authentication = 4
Interrupted = 130
// Pending reports checks that have not finished, like gh pr checks.
Pending = 8
Interrupted = 130
)
// errReported is the message of Quiet errors.
var errReported = errors.New("the command reported the outcome")
// Quiet exits with code without an error message, for an outcome the command already reported,
// such as failing checks.
func Quiet(code int) error {
return &Error{Code: code, Err: errReported}
}
// IsQuiet reports whether err is a Quiet exit code.
func IsQuiet(err error) bool {
return errors.Is(err, errReported)
}
// Error associates an operation error with a public CLI exit code.
type Error struct {
Code int
+2
View File
@@ -27,6 +27,8 @@ func TestExitCodeDistinguishesCancellationAndInterruption(t *testing.T) {
{fmt.Errorf("draft preserved: %w", context.DeadlineExceeded), Canceled},
{Wrap(Interrupted, context.Canceled), Interrupted},
{errors.Join(errors.New("partial failure"), context.Canceled), Canceled},
{Quiet(Pending), Pending},
{fmt.Errorf("checks: %w", Quiet(Failure)), Failure},
} {
assert.Equal(t, test.code, ExitCode(test.err), "%v", test.err)
}