feat: Add Issue Dependencies API support#4130
feat: Add Issue Dependencies API support#4130tommaso-moro wants to merge 7 commits intogoogle:masterfrom
Conversation
Add four new methods to IssuesService for the Issue Dependencies REST API (apiVersion 2026-03-10): - ListBlockedBy: list dependencies blocking an issue - AddBlockedBy: add a blocking dependency to an issue - RemoveBlockedBy: remove a blocking dependency - ListBlocking: list issues that an issue is blocking Includes IssueDependencyRequest type, full test coverage with testBadOptions, testNewRequestAndDoFailure, testURLParseError, and testJSONMarshal helpers.
Run go generate to add: - GetIssueID accessor for IssueDependencyRequest - ListBlockedBy and ListBlocking iterators with tests
|
Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA). View this failed invocation of the CLA check for more information. For the most up to date status, view the checks section at the bottom of the pull request. |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #4130 +/- ##
==========================================
+ Coverage 93.74% 93.76% +0.02%
==========================================
Files 211 212 +1
Lines 19685 19765 +80
==========================================
+ Hits 18453 18533 +80
Misses 1034 1034
Partials 198 198 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
gmlewis
left a comment
There was a problem hiding this comment.
Thank you, @tommaso-moro!
LGTM.
Awaiting second LGTM+Approval from any other contributor to this repo before merging.
cc: @stevehipwell - @alexandear - @zyfy29 - @Not-Dhananjay-Mishra - @munlicode
|
@Not-Dhananjay-Mishra thank you for the review! I have addressed the points you raised and updated this branch. |
| IssueFieldID *int64 `json:"issue_field_id,omitempty"` | ||
| NodeID *string `json:"node_id,omitempty"` | ||
| DataType *string `json:"data_type,omitempty"` | ||
| Value interface{} `json:"value,omitempty"` |
There was a problem hiding this comment.
This should be caught by a linter:
| Value interface{} `json:"value,omitempty"` | |
| Value any `json:"value,omitempty"` |
|
|
||
| // IssueDependencyRequest represents a request to add a dependency to an issue. | ||
| type IssueDependencyRequest struct { | ||
| IssueID *int64 `json:"issue_id"` |
There was a problem hiding this comment.
| IssueID *int64 `json:"issue_id"` | |
| IssueID int64 `json:"issue_id"` |
| // GitHub API docs: https://docs.github.com/rest/issues/issue-dependencies#list-dependencies-an-issue-is-blocked-by | ||
| // | ||
| //meta:operation GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by | ||
| func (s *IssuesService) ListBlockedBy(ctx context.Context, owner, repo string, number int, opts *ListOptions) ([]*Issue, *Response, error) { |
There was a problem hiding this comment.
| func (s *IssuesService) ListBlockedBy(ctx context.Context, owner, repo string, number int, opts *ListOptions) ([]*Issue, *Response, error) { | |
| func (s *IssuesService) ListBlockedBy(ctx context.Context, owner, repo string, issueNumber int, opts *ListOptions) ([]*Issue, *Response, error) { |
because
| // GitHub API docs: https://docs.github.com/rest/issues/issue-dependencies#add-a-dependency-an-issue-is-blocked-by | ||
| // | ||
| //meta:operation POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by | ||
| func (s *IssuesService) AddBlockedBy(ctx context.Context, owner, repo string, number int, issueDepReq IssueDependencyRequest) (*Issue, *Response, error) { |
There was a problem hiding this comment.
| func (s *IssuesService) AddBlockedBy(ctx context.Context, owner, repo string, number int, issueDepReq IssueDependencyRequest) (*Issue, *Response, error) { | |
| func (s *IssuesService) AddBlockedBy(ctx context.Context, owner, repo string, issueNumber int, issueDepReq IssueDependencyRequest) (*Issue, *Response, error) { |
| // GitHub API docs: https://docs.github.com/rest/issues/issue-dependencies#remove-dependency-an-issue-is-blocked-by | ||
| // | ||
| //meta:operation DELETE /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by/{issue_id} | ||
| func (s *IssuesService) RemoveBlockedBy(ctx context.Context, owner, repo string, number int, issueID int64) (*Issue, *Response, error) { |
There was a problem hiding this comment.
There was a problem hiding this comment.
@gmlewis should we change the type of issueNumber to int64? Because both issue_id and issue_number in the spec is integer.
There was a problem hiding this comment.
@gmlewis should we change the type of
issueNumbertoint64? Because bothissue_idandissue_numberin the spec isinteger.
Yes indeed... thank you for catching that, as well as these other issues, @alexandear! I appreciate it!
| // GitHub API docs: https://docs.github.com/rest/issues/issue-dependencies#list-dependencies-an-issue-is-blocking | ||
| // | ||
| //meta:operation GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocking | ||
| func (s *IssuesService) ListBlocking(ctx context.Context, owner, repo string, number int, opts *ListOptions) ([]*Issue, *Response, error) { |
There was a problem hiding this comment.
| func (s *IssuesService) ListBlocking(ctx context.Context, owner, repo string, number int, opts *ListOptions) ([]*Issue, *Response, error) { | |
| func (s *IssuesService) ListBlocking(ctx context.Context, owner, repo string, issueNumber int, opts *ListOptions) ([]*Issue, *Response, error) { |
| var v IssueDependencyRequest | ||
| assertNilError(t, json.NewDecoder(r.Body).Decode(&v)) | ||
|
|
||
| testMethod(t, r, "POST") | ||
| if !cmp.Equal(v, input) { | ||
| t.Errorf("Request body = %+v, want %+v", v, input) | ||
| } |
There was a problem hiding this comment.
| var v IssueDependencyRequest | |
| assertNilError(t, json.NewDecoder(r.Body).Decode(&v)) | |
| testMethod(t, r, "POST") | |
| if !cmp.Equal(v, input) { | |
| t.Errorf("Request body = %+v, want %+v", v, input) | |
| } | |
| testMethod(t, r, "POST") | |
| testBody(t, r, `{"issue_id":42}` + "\n") |

closes: #4129
Add Issue Dependencies API support
Add support for the Issue Dependencies REST API.
Changes
New file
github/issues_dependencies.goadds four methods toIssuesService:ListBlockedByGET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_byAddBlockedByPOST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_byRemoveBlockedByDELETE /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by/{issue_id}ListBlockingGET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blockingAlso adds
IssueDependencyRequesttype used byAddBlockedBy.Testing
Full test coverage in
github/issues_dependencies_test.go(12 tests) using standard helpers:testBadOptions,testNewRequestAndDoFailure,testURLParseError,testJSONMarshal.Auto-generated files updated via
go generate: accessors, accessor tests, iterators, and iterator tests.All scripts pass:
script/fmt.sh,script/test.sh,script/lint.sh.