Repository navigation
Offer page_token only where GitLab pages by keyset, and gate R-PAGE on it - #1674
Conversation
|
Sorry @jmrplens, your pull request is larger than the review limit of 150,000 diff characters |
|
Important Review skippedToo many files! This PR contains 262 files, which is 162 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.
|
R-INPUT no longer asks whether an input carries pagination and page_token, the two keyset parameters client-go declares on ListOptions alone. The keyset half of R-PAGE asks the same question at the action's grain, from the routes the live record says it sends: page_token offered where no route can be paged by keyset is one of its findings, and a keyset route sent without it is the other. Answering it here took one declaration per field of every list GitLab pages by offset alone, which is the 360 entries taking the keyset input off those lists would have needed. The 34 per-field entries that answered pagination or page_token are removed, since the rule leaves them nothing to answer; their ordering halves stay. TestDiffPair_TheKeysetFieldsOfListOptions_AreLeftToRPAGE failed on the parent: the input pair reported page_token and pagination missing, and neither fixture declaration was stale. Refs #1165 Signed-off-by: José M. Requena Plens <mail@jmrp.io>
Refs #1165 179 actions offered pagination and page_token on a route GitLab pages by offset alone, because their inputs embedded toolutil.KeysetPaginationInput whatever their route did. GitLab ignores both there, so a caller was offered a way through the list that does not exist. Each input loses the embed, its handler passes a zero KeysetPaginationInput to ApplyListOptions, and the helpers that carried the keyset input on for an offset list (access requests, award emoji, deploy tokens, Geo, the job token allowlists, the merge request lists, the resource events, the issue and merge request link lists, the runner lists) lose the parameter. The 20 actions on keyset routes keep it. The two KeysetContinuation calls on offset routes go: the group SSH certificate list and the project upload list build their query by hand, and the continuation they applied could never be reached. project.list_user_contributed loses keyset as well. It shared userProjectFilterInput with the owned and starred lists, which GitLab pages by keyset in id order; the input now carries offset pagination alone and userProjectFilter adds the keyset half for those two, so contributedKeysetRefusal and its run-time check are deleted and the schema refuses both fields instead (upstream-bugs row 112). The keyset-not-followable declaration of GET /users/:user_id/contributed_projects answered nothing once the action stopped offering page_token, so R-PAGE reported it stale; it is removed. The id_after and id_before descriptions of the project lists no longer call themselves keyset pagination: they are filters. R-PAGE's keyset half reports three findings left after this commit, mr_review.changes_get, mr_review.diff_versions_list and issue.iteration_list_group, which the next commit takes with their ordering fields. The unit tests that asserted pagination=keyset and page_token reached an offset route now assert the ordering and offset parameters alone; the ones that only followed a keyset page on an offset route are deleted. The tool snapshots move with the schemas and are regenerated at the top of the stack. Signed-off-by: José M. Requena Plens <mail@jmrp.io>
…eir routes never read Refs #1165, #1530, #1600 mr_review.changes_get offered order_by, sort, pagination and page_token. GET /projects/:id/merge_requests/:merge_request_iid/diffs declares page, per_page and unidiff (gitlab-api-live.json, 19.5.0-ee) and pages the latest diff's files with paginated_diffs(params[:page], params[:per_page]) (lib/api/merge_requests.rb:716-722 at v19.5.0-ee), which reads no order and pages by offset alone. mr_review.diff_versions_list offered the same four on GET .../versions, which declares page and per_page and presents paginate(merge_request.merge_request_diffs.order_id_desc) (lib/api/merge_request_diffs.rb:32-35): newest first whatever is sent. Both inputs lose the four fields, the order_by guidance of the version list goes, and the gitlab_mr_review meta description, which the meta snapshots carry, names the parameters each action takes. issue.iteration_list_group offered order_by, sort, pagination and page_token on GET /groups/:id/iterations, which declares none of them. iterations_finder_params hands IterationsFinder no sort, so it orders by due date, title and id whatever is sent (ee/lib/api/iterations.rb:53-73 and ee/app/finders/iterations_finder.rb:116-123 at v19.5.0-ee), and list_iterations_for pages by offset. The input loses the four fields and the usage line no longer promises keyset sorting. R-INPUT answers the six ordering fields with three cited reasons in acceptedMissingInputs, mrChangesUnordered, mrDiffVersionsOrderedByID and groupIterationsUnordered, in the style of projectIterationsOffsetOnly; their keyset fields are R-PAGE's. TestDiffLists_OrderingAndKeysetArguments_AreNotOffered and TestDiffLists_OrderingAndKeysetArguments_AreRefusedBeforeAnyRequest failed on the parent for each of the four fields of both lists, and TestList_Schema_OffersNoOrderingOrKeysetArgument for each of the four fields of the iteration list. Signed-off-by: José M. Requena Plens <mail@jmrp.io>
The keyset half of R-PAGE reported and did not gate, because what it found against the 19.5.0 record was page_token offered on 182 actions whose routes GitLab pages by offset alone, and taking it off them was a change of the published surface. The three commits before this one made that change, so the half now reports nothing undeclared on this tree, and Summary.clean counts KeysetFindingsUndeclared: an action offering page_token where no route it sends pages by keyset, or a keyset list that does not offer it, fails the run until its input changes or a route declaration says why it cannot. A re-recorded live record that moves a route from one pager to the other is held to the same rule. TestRun_AnUndeclaredKeysetFinding_FailsTheGate failed on the parent for both undeclared shapes, which Run reported clean, and TestRun_TheRealTree_PassesItsOwnGate fails with 182 undeclared findings on main once the gate counts them. Refs #1165 Signed-off-by: José M. Requena Plens <mail@jmrp.io>
The commits before this one took pagination and page_token off every
list GitLab pages by offset alone, but the texts those lists serve kept
offering what had gone: 112 actions still said "offset or keyset
pagination" in their usage line or individual description, called their
order_by the "column to order keyset-paginated results by", told a
caller order_by "only applies when pagination='keyset'", or offered
"order_by/sort with pagination='keyset'". A model that reads that asks
for pagination=keyset, which GitLab ignores or refuses on those routes.
Each of those texts now says what the list does: the usage lines and
descriptions name offset pagination, and the order_by and sort
descriptions and guidance name the column and the direction and nothing
about a pager. They stay neutral on whether GitLab applies the ordering,
since most of those routes declare no order_by or sort; that class is
left to its own change. The doc comments of the inputs say why they
carry no keyset fields, applyKeysetOrder in projects becomes
applyListOrder, and the KeysetPaginationInput doc says to embed it only
where the route pages by keyset.
TestBuildActionCatalog_OffsetLists_ClaimNoKeysetPagination holds every
action that takes page and offers no page_token to it, sentence by
sentence, allowing a sentence that denies keyset ("GitLab does not page
this list by keyset"). On the parent it failed for 112 actions with 218
claims on each instance, and the license template spec test, which pins
that action's usage, description and guidance, failed until its
expectations moved with them.
Refs #1165
Signed-off-by: José M. Requena Plens <mail@jmrp.io>
…s left uncovered This layer touches the three packages, and each stood below 100% of statements on main, for branches no test reached rather than for code that cannot run. validatePosition in mrdiscussions and mrdraftnotes skips the line check for a file GitLab lists with an empty diff, as it does for a binary file or one too large to show. TestValidatePosition_FileWithEmptyDiff_SkipsTheLineCheck names a line no diff holds on such a file and expects no refusal. The two raw epic board helpers escaped the group into the path themselves, so the request-building error they return could not be reached. They now take the path from their handlers, as the deployments helpers do, and TestRawBoardFetch_RequestThatCannotBeBuilt_IsRefusedBeforeAnyRequest passes a path with an invalid percent-escape to both. The routes, the sites the request record names and what the handlers send are unchanged, which check-action-grants-derivation confirms. The three packages are at 100% of statements. Refs #1165 Signed-off-by: José M. Requena Plens <mail@jmrp.io>
579af4e to
acadca3
Compare
|



Refs #1165, #1530 and #1600
This is the middle layer of the second #1165 stack. The layer below it made the four project lists refuse keyset outside
idorder and took the unread ordering off the two job lists. This one takespaginationandpage_tokenoff the 182 actions whose routes GitLab pages by offset alone, makes R-PAGE's keyset half a gate so they cannot come back, and rewrites what those lists said about keyset pagination. #1530 and #1600 are part of the 182 and are answered here with their ordering fields. The top of the stack carries the site pages, the contributor pages, row 112 of the upstream bugs and the regeneration.R-INPUT leaves the keyset fields to R-PAGE
R-INPUT asked of every input whether it carries
paginationandpage_token, the two keyset parameters client-go declares ongl.ListOptionsalone. Answering that for an offset list took one declaration per field, which is about 360 entries once the keyset input leaves those lists. R-PAGE's keyset half asks the same question at the action's grain from the routes the live record says the action sends, in both directions:page-token-on-offset-routefor a list that offers it where nothing pages by keyset, andkeyset-route-without-page-tokenfor one that does not offer it where GitLab does. So R-INPUT stops asking, and the 34 per-field entries that answered either field are gone. Their ordering halves stay.The 182 offset lists
GitLab ignores
paginationandpage_tokenon these routes, or refuses them, so a caller was offered a way through the list that does not exist. 179 actions lose thetoolutil.KeysetPaginationInputembed in the first of the two commits and the three of #1530 and #1600 in the second. Each handler passes a zeroKeysetPaginationInputtoApplyListOptions, as #1573 did, and the helpers that carried the keyset input on for an offset list (access requests, award emoji, deploy tokens, Geo, the job token allowlists, the merge request lists, the resource events, the issue and merge request link lists, the runner lists) lose the parameter. The 20 actions on keyset routes keep it. The full list, with each route and the GitLab line that pages it, is at the end.The two
KeysetContinuationcalls on offset routes go.groupsshcerts/group_ssh_certs.goanduploads/uploads.gobuild their query by hand, and the continuation they applied could never be reached.project.list_user_contributedloses keyset as well. It shareduserProjectFilterInputwith the owned and starred lists, which GitLab pages by keyset inidorder. That input now carries the filters and offset pagination alone, anduserProjectFilteradds the keyset half for the two lists that use it, socontributedKeysetRefusaland its run-time check are deleted and the schema refuses both fields instead. Thekeyset-not-followabledeclaration ofGET /users/:user_id/contributed_projectsanswered nothing once the action stopped offeringpage_token, R-PAGE reported it stale, and it is removed. Theid_afterandid_beforedescriptions of the project lists no longer call themselves keyset pagination: they are filters.I did not widen the removal of
order_byandsortpast the routes #1530 and #1600 name. About 157 actions offer an ordering no route they send declares (audit-1to1-requiredcounts 156 unplacedorder_byand 143 unplacedsorthere), and that class needs each route read before either field goes, so it is a change of its own.#1530 and #1600
mr_review.changes_getofferedorder_by,sort,paginationandpage_token.GET /projects/:id/merge_requests/:merge_request_iid/diffsdeclarespage,per_pageandunidiff(gitlab-api-live.json, 19.5.0-ee) and pages the latest diff's files withpaginated_diffs(params[:page], params[:per_page])(lib/api/merge_requests.rb:716-722atv19.5.0-ee), which reads no order.mr_review.diff_versions_listoffered the same four onGET .../versions, which declarespageandper_pageand presentspaginate(merge_request.merge_request_diffs.order_id_desc)(lib/api/merge_request_diffs.rb:32-35): newest first whatever is sent. Both inputs lose the four fields, the version list'sorder_byguidance goes, and thegitlab_mr_reviewmeta description names the parameters each action takes.DiffVersionGetInputalready embedded no pagination onmain, since #1584.issue.iteration_list_groupoffered the same four onGET /groups/:id/iterations, which declares none of them.iterations_finder_paramshandsIterationsFinderno sort, so it orders by due date, title and id whatever is sent (ee/lib/api/iterations.rb:53-73andee/app/finders/iterations_finder.rb:116-123atv19.5.0-ee), andlist_iterations_forpages by offset. The input loses the four fields.R-INPUT answers the six ordering fields with three cited reasons in
acceptedMissingInputs,mrChangesUnordered,mrDiffVersionsOrderedByIDandgroupIterationsUnordered, in the style ofprojectIterationsOffsetOnly.R-PAGE's keyset half gates
It reported and did not gate, because what it found against the 19.5.0 record was the 182, and taking them off was a change of the published surface. With that change made,
Summary.cleancountsKeysetFindingsUndeclared: an action that offerspage_tokenwhere no route it sends pages by keyset, or a keyset list that does not offer it, fails the run until its input changes or a route declaration says why it cannot. A re-recorded live record that moves a route from one pager to the other is held to the same rule, which matters for the 19.6 re-pin. On this branch R-PAGE counts 20 actions offeringpage_token, all 20 on keyset routes, none on an offset route, and four lists that send a keyset route without offeringpage_token, each on a route declaredkeyset-not-followable:group.listandgroup.searchonGET /groups, which pages by keyset only for an anonymous caller, and the two service account token lists.What the lists say
Taking the fields off left the texts behind. 112 actions still said "offset or keyset pagination" in their usage line or description, called their
order_bythe "column to order keyset-paginated results by", told a callerorder_by"only applies when pagination='keyset'", or offered "order_by/sort with pagination='keyset'". A model that reads that asks forpagination=keyset. Each text now says what the list does: the usage lines and descriptions name offset pagination, and the ordering descriptions and guidance name the column and the direction and nothing about a pager. They stay neutral on whether GitLab applies the ordering, which is the class above. The inputs' doc comments say why they carry no keyset fields,applyKeysetOrderinprojectsbecomesapplyListOrder, and theKeysetPaginationInputdoc says to embed it only where the route pages by keyset.Coverage of the touched packages
groupepicboards,mrdiscussionsandmrdraftnotesstood below 100% of statements onmain, for branches no test reached.validatePositionin the two note packages skips the line check for a file GitLab lists with an empty diff, and a test now names a line no diff holds on such a file. The two raw epic board helpers escaped the group into the path themselves, so their request-building error could not be reached; they now take the path from their handlers, as the deployments helpers do, and a test passes one with an invalid percent-escape. The routes, the sites the request record names and what the handlers send are unchanged.How I tested it
Each new test failed on its parent and passes here.
TestDiffPair_TheKeysetFieldsOfListOptions_AreLeftToRPAGEreportedpage_tokenandpaginationmissing and neither fixture declaration stale.TestDiffLists_OrderingAndKeysetArguments_AreNotOfferedandTestDiffLists_OrderingAndKeysetArguments_AreRefusedBeforeAnyRequestfailed for each of the four fields of both diff lists, the second with every request reaching the mock that forbids one, andTestList_Schema_OffersNoOrderingOrKeysetArgumentfor each of the four fields of the iteration list.TestRun_AnUndeclaredKeysetFinding_FailsTheGatefailed for both undeclared shapes, whichRunreported clean, and with the gate in placeTestRun_TheRealTree_PassesItsOwnGatefails onmainwith 182 undeclared findings.TestBuildActionCatalog_OffsetLists_ClaimNoKeysetPaginationholds every action that takespageand offers nopage_tokento its texts sentence by sentence, allowing a sentence that denies keyset; on its parent it failed for 112 actions with 218 claims on each instance. The unit tests that assertedpagination=keysetandpage_tokenreached an offset route now assert the ordering and offset parameters alone, and the ones that only followed a keyset page on an offset route are deleted.audit-1to1-requiredcounts 17 unplacedpaginationand 15 unplacedpage_token, all of them on the keyset lists, where it counted 199 and 197 onmain.Every package this layer touches is at 100% of statements, 102 of them. gobco measures every condition outcome of the hand-changed packages: 94 of 94 in
mrchanges, 4 of 4 ingroupiterations, 48 of 48 ingroupsshcerts, 68 of 68 inuploads, 60 of 60 ingroupepicboards, 152 of 152 inmrdiscussions, 158 of 158 inmrdraftnotes, 1062 of 1062 incmd/audit_1to1/internal/pathsand 1404 of 1404 inprojects, and 919 of 920 incmd/audit_1to1/internal/structs, where the outcome left is the one the layer below described,len(ret.Results) == 0being false incross_call.go, which no type-checked return reaches. gremlins leaves no mutant lived or timed out in the files this layer changes by hand: 481 killed inprojects.go, 170 instructs'analyze.go, 32 inpaths'analyze.goandpagination_keyset.go, 12 in the functions ofpagination_declarations.go, 34 inmr_changes.go, 28 inuploads.go, 22 ingroup_ssh_certs.go, 14 ingroup_epic_boards.goand 2 ingroup_iterations.go. gremlins also lists 32 mutants ofpagination_declarations.goas not covered: they are the+joining the string literals of the declaration table's reasons, a package-level initializer that a coverage profile never counts, and none of them is a line this layer adds. For the roughly 100 packages whose change is the embed and the zero value, the package tests and the schemas are the evidence: those lines carry nothing a mutant can change.Every commit builds and passes
go test ./... -count=1withGITLAB_MCP_TEST_SNAPSHOT_PARITY=deferred. golangci-lint with thee2etag andgolangci-lint fmt --diffare clean on the changed packages, and these gates pass:audit-1to1(with its SDK, R-PATH, R-GRANT and requiredness steps),audit-1to1-paths,audit-1to1-required,check-action-grants-derivation,check-action-grants,audit-1to1-grants, surface quality, meta descriptions, action IDs, gateway characters, e2e static, case loops, test goroutines, test file names, documentation tool names, godoc, SDK context, Markdown escaping, dead constants, file headers, DCO and the em dash check.The tool snapshots, the tool reference,
llms-full.txt, the token footprint and the request inventory move with these schemas and are regenerated once at the top of the stack, as the deferred parity allows below it. No end-to-end run belongs to this layer: the top runs the complete CE and EE suites with scenarios for the removed shapes.The 182 actions, their routes and the GitLab 19.5.0 line that pages them
access.deploy_key_list_allGET /deploy_keyslib/api/deploy_keys.rb:48access.deploy_key_list_projectGET /projects/:id/deploy_keyslib/api/deploy_keys.rb:104access.deploy_key_list_user_projectGET /users/:user_id/project_deploy_keyslib/api/users.rb:597access.deploy_token_list_groupGET /groups/:id/deploy_tokenslib/api/deploy_tokens.rb:199access.deploy_token_list_projectGET /projects/:id/deploy_tokenslib/api/deploy_tokens.rb:87access.invite_list_groupGET /groups/:id/invitationslib/api/invitations.rb:86access.invite_list_projectGET /projects/:id/invitationslib/api/invitations.rb:86access.request_list_groupGET /groups/:id/access_requestslib/api/access_requests.rb:33access.request_list_projectGET /projects/:id/access_requestslib/api/access_requests.rb:33access.token_group_listGET /groups/:id/access_tokenslib/api/resource_access_tokens.rb:47access.token_personal_listGET /personal_access_tokenslib/api/personal_access_tokens.rb:42access.token_project_listGET /projects/:id/access_tokenslib/api/resource_access_tokens.rb:47admin.alert_metric_image_listGET /projects/:id/alert_management_alerts/:alert_iid/metric_imageslib/api/alert_management_alerts.rb:96admin.application_listGET /applicationslib/api/applications.rb:64admin.broadcast_message_listGET /broadcast_messageslib/api/admin/broadcast_messages.rb:30admin.bulk_import_entity_listGET /bulk_imports/:import_id/entitiesandGET /bulk_imports/entitieslib/api/bulk_imports.rb:172admin.bulk_import_listGET /bulk_importslib/api/bulk_imports.rb:144admin.cluster_agent_listGET /projects/:id/cluster_agentslib/api/clusters/agents.rb:32admin.cluster_agent_token_listGET /projects/:id/cluster_agents/:agent_id/tokenslib/api/clusters/agent_tokens.rb:35admin.error_tracking_listGET /projects/:id/error_tracking/client_keyslib/api/error_tracking/client_keys.rb:32admin.secure_file_listGET /projects/:id/secure_fileslib/api/ci/secure_files.rb:37admin.topic_listGET /topicslib/api/topics.rb:42branch.list_protectedGET /projects/:id/protected_brancheslib/api/protected_branches.rb:46ci_variable.group_listGET /groups/:id/variableslib/api/group_variables.rb:33ci_variable.instance_listGET /admin/ci/variableslib/api/admin/ci/variables.rb:30ci_variable.listGET /projects/:id/variableslib/api/ci/variables.rb:35dependency.listGET /projects/:id/dependenciesee/lib/api/dependencies.rb:58enterprise_user.listGET /groups/:id/enterprise_usersee/lib/api/group_enterprise_users.rb:68environment.deployment_listGET /projects/:id/deploymentslib/api/deployments.rb:84environment.deployment_merge_requestsGET /projects/:id/deployments/:deployment_id/merge_requestslib/api/deployments.rb:279environment.freeze_listGET /projects/:id/freeze_periodslib/api/freeze_periods.rb:40environment.listGET /projects/:id/environmentslib/api/environments.rb:53environment.protected_listGET /projects/:id/protected_environmentsee/lib/api/protected_environments.rb:118external_status_check.list_projectGET /projects/:id/external_status_checksee/lib/api/status_checks.rb:71external_status_check.list_project_checksGET /projects/:id/external_status_checksee/lib/api/status_checks.rb:71external_status_check.list_project_mr_checksGET /projects/:id/merge_requests/:merge_request_iid/status_checksee/lib/api/status_checks.rb:216feature_flags.feature_flag_listGET /projects/:id/feature_flagslib/api/feature_flags.rb:47feature_flags.ff_user_list_listGET /projects/:id/feature_flags_user_listslib/api/feature_flags_user_lists.rb:42geo.listGET /geo_sitesee/lib/api/geo_sites.rb:128geo.list_statusGET /geo_sites/statusee/lib/api/geo_sites.rb:152group.badge_listGET /groups/:id/badgeslib/api/badges.rb:56group.credential_list_patsGET /groups/:id/manage/personal_access_tokensee/lib/api/manage/groups.rb:87group.credential_list_ssh_keysGET /groups/:id/manage/ssh_keysee/lib/api/manage/groups.rb:258group.epic_board_listGET /groups/:id/epic_boardsee/lib/api/epic_boards.rb:54group.epic_listGET /groups/:id/epicsee/lib/api/epics.rb:137group.event_epic_label_listGET /groups/:id/epics/:eventable_id/resource_label_eventslib/api/resource_label_events.rb:15group.getGET /groups/:idlib/api/groups.rb:456group.group_billable_member_memberships_listGET /groups/:id/billable_members/:user_id/membershipsee/lib/ee/api/members.rb:228group.group_billable_members_listGET /groups/:id/billable_membersee/lib/ee/api/members.rb:162group.group_board_listGET /groups/:id/boardslib/api/group_boards.rb:37group.group_board_list_listsGET /groups/:id/boards/:board_id/listslib/api/group_boards.rb:86group.group_label_listGET /groups/:id/labelslib/api/helpers/label_helpers.rb:44group.group_milestone_issuesGET /groups/:id/milestonesandGET /groups/:id/milestones/:milestone_id/issueslib/api/milestone_responses.rb:91group.group_milestone_listGET /groups/:id/milestoneslib/api/milestone_responses.rb:52group.group_milestone_merge_requestsGET /groups/:id/milestonesandGET /groups/:id/milestones/:milestone_id/merge_requestslib/api/milestone_responses.rb:91group.group_relations_list_statusGET /groups/:id/export_relations/statuslib/api/group_export.rb:206group.group_upload_listGET /groups/:id/uploadslib/api/markdown_uploads.rb:278group.hook_listGET /groups/:id/hooksee/lib/api/group_hooks.rb:84group.invited_groupsGET /groups/:id/invited_groupslib/api/groups.rb:152group.issuesGET /groups/:id/issueslib/api/issues.rb:218group.listGET /groupslib/api/groups.rb:171group.list_provisioned_usersGET /groups/:id/provisioned_usersee/lib/ee/api/groups.rb:342group.membersGET /groups/:id/members/alllib/api/members.rb:76group.projectsGET /groups/:id/projectslib/api/groups.rb:128group.protected_branch_listGET /groups/:id/protected_branchesee/lib/api/group_protected_branches.rb:53group.protected_env_listGET /groups/:id/protected_environmentsee/lib/api/protected_environments.rb:260group.release_listGET /groups/:id/releaseslib/api/releases.rb:468group.saml_users_listGET /groups/:id/saml_usersee/lib/ee/api/groups.rb:312group.shared_projectsGET /groups/:id/projects/sharedlib/api/groups.rb:128group.shared_withGET /groups/:id/groups/sharedlib/api/groups.rb:152group.ssh_cert_listGET /groups/:id/ssh_certificatesee/lib/ee/api/groups.rb:369group.subgroupsGET /groups/:id/descendant_groupslib/api/groups.rb:152group.transfer_locationsGET /groups/:id/transfer_locationslib/api/groups.rb:152issue.discussion_listGET /projects/:id/issues/:noteable_id/discussionslib/api/discussions.rb:60issue.emoji_issue_listGET /projects/:id/issues/:issue_iid/award_emojilib/api/award_emoji.rb:69issue.emoji_issue_note_listGET /projects/:id/issues/:issue_iid/notes/:note_id/award_emojilib/api/award_emoji.rb:69issue.event_issue_iteration_listGET /projects/:id/issues/:eventable_id/resource_iteration_eventsee/lib/api/resource_iteration_events.rb:40issue.event_issue_label_listGET /projects/:id/issues/:eventable_id/resource_label_eventslib/api/resource_label_events.rb:15issue.event_issue_milestone_listGET /projects/:id/issues/:eventable_id/resource_milestone_eventslib/api/resource_milestone_events.rb:44issue.event_issue_state_listGET /projects/:id/issues/:eventable_id/resource_state_eventslib/api/resource_state_events.rb:42issue.event_issue_weight_listGET /projects/:id/issues/:eventable_id/resource_weight_eventsee/lib/api/resource_weight_events.rb:42issue.iteration_list_groupGET /groups/:id/iterationsee/lib/api/iterations.rb:56issue.list_allGET /issueslib/api/issues.rb:166issue.list_groupGET /groups/:id/issueslib/api/issues.rb:218issue.mrs_closingGET /projects/:id/issues/:issue_iid/closed_bylib/api/issues.rb:601issue.mrs_relatedGET /projects/:id/issues/:issue_iid/related_merge_requestslib/api/issues.rb:576issue.note_listGET /projects/:id/issues/:noteable_id/noteslib/api/notes.rb:87job.listGET /projects/:id/pipelines/:pipeline_id/jobslib/api/ci/pipelines.rb:216job.token_scope_list_groupsGET /projects/:id/job_token_scope/groups_allowlistlib/api/project_job_token_scope.rb:108job.token_scope_list_inboundGET /projects/:id/job_token_scope/allowlistlib/api/project_job_token_scope.rb:85merge_request.commitsGET /projects/:id/merge_requests/:merge_request_iid/commitslib/api/merge_requests.rb:574merge_request.emoji_mr_listGET /projects/:id/merge_requests/:merge_request_iid/award_emojilib/api/award_emoji.rb:69merge_request.emoji_mr_note_listGET /projects/:id/merge_requests/:merge_request_iid/notes/:note_id/award_emojilib/api/award_emoji.rb:69merge_request.event_mr_label_listGET /projects/:id/merge_requests/:eventable_id/resource_label_eventslib/api/resource_label_events.rb:15merge_request.event_mr_milestone_listGET /projects/:id/merge_requests/:eventable_id/resource_milestone_eventslib/api/resource_milestone_events.rb:44merge_request.event_mr_state_listGET /projects/:id/merge_requests/:eventable_id/resource_state_eventslib/api/resource_state_events.rb:42merge_request.issues_closedGET /projects/:id/merge_requests/:merge_request_iid/closes_issueslib/api/merge_requests.rb:1034merge_request.listGET /projects/:id/merge_requestslib/api/merge_requests.rb:109merge_request.list_globalGET /merge_requestslib/api/merge_requests.rb:109merge_request.list_groupGET /groups/:id/merge_requestslib/api/merge_requests.rb:109merge_request.related_issuesGET /projects/:id/merge_requests/:merge_request_iid/related_issueslib/api/merge_requests.rb:1061merge_train.list_branchGET /projects/:id/merge_trains/:target_branchee/lib/api/merge_trains.rb:84merge_train.list_projectGET /projects/:id/merge_trainsee/lib/api/merge_trains.rb:48mr_review.changes_getGET /projects/:id/merge_requests/:merge_request_iid/diffslib/api/merge_requests.rb:719mr_review.diff_versions_listGET /projects/:id/merge_requests/:merge_request_iid/versionslib/api/merge_request_diffs.rb:35mr_review.discussion_listGET /projects/:id/merge_requests/:noteable_id/discussionslib/api/discussions.rb:60mr_review.draft_note_listGET /projects/:id/merge_requests/:merge_request_iid/draft_noteslib/api/draft_notes.rb:140mr_review.note_listGET /projects/:id/merge_requests/:noteable_id/noteslib/api/notes.rb:87package.file_listGET /projects/:id/packages/:package_id/package_fileslib/api/package_files.rb:65package.group_listGET /groups/:id/packageslib/api/group_packages.rb:87package.listGET /projects/:id/packageslib/api/project_packages.rb:67package.protection_rule_listGET /projects/:id/packages/protection/ruleslib/api/project_packages_protection_rules.rb:31package.registry_list_groupGET /groups/:id/registry/repositorieslib/api/group_container_repositories.rb:46package.registry_list_projectGET /projects/:id/registry/repositorieslib/api/project_container_repositories.rb:50pipeline.latestGET /projects/:idandGET /projects/:id/pipelinesandGET /projects/:id/pipelines/:pipeline_idandGET /projects/:id/pipelines/latestandGET /projects/:id/repository/commits/:shalib/api/ci/pipelines.rb:90pipeline.listGET /projects/:id/pipelineslib/api/ci/pipelines.rb:90pipeline.schedule_listGET /projects/:id/pipeline_scheduleslib/api/ci/pipeline_schedules.rb:43pipeline.schedule_list_triggered_pipelinesGET /projects/:id/pipeline_schedules/:pipeline_schedule_id/pipelineslib/api/ci/pipeline_schedules.rb:107pipeline.trigger_listGET /projects/:id/triggerslib/api/ci/triggers.rb:92project.approval_rule_listGET /projects/:id/approval_rulesee/lib/api/project_approval_rules.rb:32project.badge_listGET /projects/:id/badgeslib/api/badges.rb:56project.board_listGET /projects/:id/boardslib/api/boards.rb:37project.board_list_listGET /projects/:id/boards/:board_id/listslib/api/boards.rb:116project.hook_listGET /projects/:id/hookslib/api/project_hooks.rb:92project.label_listGET /projects/:id/labelslib/api/helpers/label_helpers.rb:44project.list_groupsGET /projects/:id/groupslib/api/projects.rb:273project.list_invited_groupsGET /projects/:id/invited_groupslib/api/projects.rb:273project.list_starrersGET /projects/:id/starrerslib/api/projects.rb:896project.list_user_contributedGET /users/:user_id/contributed_projectslib/api/projects.rb:396project.list_usersGET /projects/:id/userslib/api/projects.rb:1114project.membersGET /projects/:id/members/alllib/api/members.rb:76project.milestone_issuesGET /projects/:id/milestonesandGET /projects/:id/milestones/:milestone_id/issueslib/api/milestone_responses.rb:91project.milestone_listGET /projects/:id/milestoneslib/api/milestone_responses.rb:52project.milestone_merge_requestsGET /projects/:id/milestonesandGET /projects/:id/milestones/:milestone_id/merge_requestslib/api/milestone_responses.rb:91project.mirror_listGET /projects/:id/remote_mirrorslib/api/remote_mirrors.rb:53project.pages_domain_listGET /projects/:id/pages/domainslib/api/pages_domains.rb:89project.upload_listGET /projects/:id/uploadslib/api/markdown_uploads.rb:100release.link_listGET /projects/:id/releases/:tag_name/assets/linkslib/api/release/links.rb:46release.listGET /projects/:id/releaseslib/api/releases.rb:113repository.commit_commentsGET /projects/:id/repository/commits/:sha/commentslib/api/commits.rb:465repository.commit_diffGET /projects/:id/repository/commits/:sha/difflib/api/commits.rb:444repository.commit_discussion_listGET /projects/:id/repository/commits/:noteable_id/discussionslib/api/discussions.rb:60repository.commit_refsGET /projects/:id/repository/commits/:sha/refslib/api/commits.rb:657repository.commit_statusesGET /projects/:id/repository/commits/:sha/statuseslib/api/commit_statuses.rb:70repository.contributorsGET /projects/:id/repository/contributorslib/api/repositories.rb:388runner.controller_listGET /runner_controllersee/lib/api/ci/runner_controllers.rb:36runner.controller_token_listGET /runner_controllers/:runner_controller_id/tokensee/lib/api/ci/runner_controller_tokens.rb:41runner.listGET /runnerslib/api/ci/runners.rb:160runner.list_allGET /runners/alllib/api/ci/runners.rb:182runner.list_groupGET /groups/:id/runnerslib/api/ci/runners.rb:488runner.list_projectGET /projects/:id/runnerslib/api/ci/runners.rb:414snippet.discussion_listGET /projects/:id/snippets/:noteable_id/discussionslib/api/discussions.rb:60snippet.emoji_snippet_listGET /projects/:id/snippets/:snippet_id/award_emojilib/api/award_emoji.rb:69snippet.emoji_snippet_note_listGET /projects/:id/snippets/:snippet_id/notes/:note_id/award_emojilib/api/award_emoji.rb:69snippet.exploreGET /snippets/publiclib/api/snippets.rb:75snippet.listGET /snippetslib/api/snippets.rb:50snippet.list_allGET /snippets/alllib/api/snippets.rb:105snippet.note_listGET /projects/:id/snippets/:noteable_id/noteslib/api/notes.rb:87snippet.project_listGET /projects/:id/snippetslib/api/project_snippets.rb:53storage_move.retrieve_all_groupGET /group_repository_storage_movesee/lib/api/group_repository_storage_moves.rb:26storage_move.retrieve_all_projectGET /project_repository_storage_moveslib/api/project_repository_storage_moves.rb:36storage_move.retrieve_all_snippetGET /snippet_repository_storage_moveslib/api/snippet_repository_storage_moves.rb:27storage_move.retrieve_groupGET /groups/:id/repository_storage_movesee/lib/api/group_repository_storage_moves.rb:86storage_move.retrieve_projectGET /projects/:id/repository_storage_moveslib/api/project_repository_storage_moves.rb:99storage_move.retrieve_snippetGET /snippets/:id/repository_storage_moveslib/api/snippet_repository_storage_moves.rb:100tag.list_protectedGET /projects/:id/protected_tagslib/api/protected_tags.rb:36template.ci_yml_listGET /templates/gitlab_ci_ymlslib/api/templates.rb:92template.dockerfile_listGET /templates/dockerfileslib/api/templates.rb:92template.gitignore_listGET /templates/gitignoreslib/api/templates.rb:92template.license_listGET /templates/licenseslib/api/templates.rb:49template.project_template_listGET /projects/:id/templates/:typelib/api/project_templates.rb:49user.activitiesGET /user/activitieslib/api/users.rb:1790user.contribution_eventsGET /projects/:idandGET /users/:id/eventslib/api/helpers/events_helpers.rb:21user.emails_for_userGET /users/:id/emailslib/api/users.rb:876user.event_list_contributionsGET /eventsandGET /projects/:idlib/api/helpers/events_helpers.rb:21user.event_list_projectGET /projects/:idandGET /projects/:id/eventslib/api/helpers/events_helpers.rb:21user.list_impersonation_tokensGET /users/:user_id/impersonation_tokenslib/api/users.rb:1219user.membershipsGET /users/:user_id/membershipslib/api/users.rb:1154user.namespace_listGET /namespaceslib/api/namespaces.rb:59user.ssh_keysGET /user/keyslib/api/users.rb:1410user.ssh_keys_for_userGET /users/:user_id/keyslib/api/users.rb:650user.todo_listGET /todoslib/api/todos.rb:116