From 7fe27b5e42ba2563a5c362c993bfa1949220876d Mon Sep 17 00:00:00 2001 From: Oleksandr Redko Date: Wed, 10 Jun 2026 22:09:10 +0300 Subject: [PATCH] fix: Comparing durations in the `AbuseRateLimitError.Is` --- github/github.go | 9 ++++++++- github/github_test.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/github/github.go b/github/github.go index 289abcc49fe..b00b5507305 100644 --- a/github/github.go +++ b/github/github.go @@ -1652,10 +1652,17 @@ func (r *AbuseRateLimitError) Is(target error) bool { } return r.Message == v.Message && - r.RetryAfter == v.RetryAfter && + equalDurationPtr(r.RetryAfter, v.RetryAfter) && compareHTTPResponse(r.Response, v.Response) } +func equalDurationPtr(a, b *time.Duration) bool { + if a == nil || b == nil { + return a == b + } + return *a == *b +} + // RedirectionError represents a response that returned a redirect status code: // // 301 (Moved Permanently) diff --git a/github/github_test.go b/github/github_test.go index b16ac1ffd87..63ecb887128 100644 --- a/github/github_test.go +++ b/github/github_test.go @@ -3865,6 +3865,37 @@ func TestAbuseRateLimitError_Is(t *testing.T) { err: err, otherError: errors.New("github"), }, + "errors are same - RetryAfter equal value but distinct pointers": { + wantSame: true, + err: err, + otherError: &AbuseRateLimitError{ + Response: &http.Response{}, + Message: "Github", + RetryAfter: &t1, + }, + }, + "errors are same - RetryAfter both nil": { + wantSame: true, + err: &AbuseRateLimitError{ + Response: &http.Response{}, + Message: "Github", + RetryAfter: nil, + }, + otherError: &AbuseRateLimitError{ + Response: &http.Response{}, + Message: "Github", + RetryAfter: nil, + }, + }, + "errors differ - one RetryAfter nil, other non-nil": { + wantSame: false, + err: err, + otherError: &AbuseRateLimitError{ + Response: &http.Response{}, + Message: "Github", + RetryAfter: nil, + }, + }, } for name, tc := range testcases {