diff --git a/github/client.go b/github/client.go index 23a945e..2a4569e 100644 --- a/github/client.go +++ b/github/client.go @@ -199,7 +199,7 @@ func (c *Client) doRequest(ctx context.Context, method, reqURL string, accept st timer := time.NewTimer(delay) select { case <-timer.C: - // Timer already fired; Stop() is a no-op here. + // Backoff elapsed, proceed with retry. case <-ctx.Done(): timer.Stop() return nil, ctx.Err() @@ -259,8 +259,8 @@ func (c *Client) doRequest(ctx context.Context, method, reqURL string, accept st if attempt < len(backoff) { backoff[attempt] = delay } - } else if t, err := http.ParseTime(ra); err == nil { - delay := time.Until(t) + } else if retryAt, err := http.ParseTime(ra); err == nil { + delay := time.Until(retryAt) if delay < 0 { delay = 0 } diff --git a/github/files.go b/github/files.go index aeebe20..25fd697 100644 --- a/github/files.go +++ b/github/files.go @@ -48,6 +48,8 @@ func (c *Client) ListContents(ctx context.Context, owner, repo, path string) ([] if err2 := json.Unmarshal(body, &single); err2 != nil { return nil, fmt.Errorf("parse contents JSON: %w", err2) } + // Guard against empty objects ({}) or unexpected shapes that + // unmarshal successfully but carry no useful data. if single.Name == "" && single.Path == "" && single.Type == "" { return nil, fmt.Errorf("parse contents JSON: unexpected response format") } diff --git a/github/pr.go b/github/pr.go index 3e984c2..c088f2b 100644 --- a/github/pr.go +++ b/github/pr.go @@ -194,7 +194,7 @@ func (c *Client) GetCommitStatuses(ctx context.Context, owner, repo, sha string) for _, cr := range checkResp.CheckRuns { result = append(result, vcs.CommitStatus{ Context: cr.Name, - Status: mapCheckRunStatus(cr.Conclusion, cr.Status), + Status: mapCheckRunStatus(cr.Conclusion), Description: derefString(cr.Conclusion), TargetURL: cr.HTMLURL, }) @@ -208,10 +208,9 @@ func (c *Client) GetCommitStatuses(ctx context.Context, owner, repo, sha string) } // mapCheckRunStatus maps a check run conclusion to a vcs.CommitStatus status string. -// The second parameter (check run status field, e.g. "completed", "in_progress") is -// unused because conclusion alone determines the mapped state: nil conclusion means -// the run is still in progress (pending), regardless of the status field value. -func mapCheckRunStatus(conclusion *string, _ string) string { +// Conclusion alone determines the mapped state: nil conclusion means the run is +// still in progress (pending), regardless of the status field value. +func mapCheckRunStatus(conclusion *string) string { if conclusion == nil { // Still running or queued return "pending"