Я хотел бы знать, есть ли в Github API функция, которая возвращает статус запроса на вытягивание, независимо от того, принят он или отклонен. Существует ли такая функция?
Как узнать, одобрен или отклонен запрос на извлечение с помощью API в github?
Ответы (6)
Вы можете получить один PR и проверить это свойства state
и merged
. Если он объединен, он принят. Если он закрыт и не объединен, он может быть отклонен.
На самом деле он может быть не отклонен, а закрыт создателем. Я не уверен, можно ли проверить, был ли он закрыт другим пользователем (отклонено) или его создателем (отклонено).
state
, однако это может быть только open
или closed
. Не принято, не отклонено или что-то среднее между ними. /e: только что увидел ваше редактирование, это был бы хороший способ узнать, было ли оно принято или отклонено.
- person nbokmans; 24.05.2017
Я тоже был в тупике от этой проблемы. Мне было трудно найти соответствующую информацию в документах.
Вариант А
Тактика, которую я выбрал, заключается в использовании выдает конечную точку поиска с квалификатором review
в параметре q
.
Итак, в моем случае, когда я хочу увидеть все назначенные мне PR, которые еще не были проверены, я бы нажал эту конечную точку: https://github.com/api/v3/search/issues?q=is:open+is:pr+review-requested:jordan-bonitatis+review:none
Другие квалификаторы review
включают approved
и changes_requested
, как описано здесь: https://docs.github.com/en/github/searching-for-information-on-github/searching-issues-and-pull-requests#поиск-по-пулл-запросу-обзор-статус-и-рецензент
Вариант Б
Если вы хотите увидеть статус обзора для данного PR, вместо того, чтобы получать список, отфильтрованный по статусу, как в моем примере выше, вы можете нажать конечная точка проверки запросов на вытягивание: /repos/:owner/:repo/pulls/:number/reviews
Это вернет список обзоров для PR, каждый из которых имеет ключ state
.
Обратите внимание, что у данного PR может быть несколько обзоров с конфликтующими состояниями. Например, если teamMemberA одобрил это, но teamMemberB запросил изменения. Вам придется пройтись по всему списку и решить, как вы хотите его обрабатывать, основываясь на всех состояниях.
У меня было похожее требование - знать, одобрен ли PR или нет, прежде чем слить его в мастер. Я добавил правило в репозиторий, чтобы гарантировать, что каждый PR должен быть одобрен до слияния. Затем при использовании API для получения подробной информации о ветке было одно поле, в котором указывалось, была ли ветвь чистой для слияния или заблокированной. Я использовал это как способ управлять вещами в своем приложении.
mergeable_state
Теперь это возможно с помощью GraphQL.
В частности, если перечисление mergeStateStatus
равно BLOCKED
, то запрос на включение не был одобрен и для любого другого статуса это было бы одобрено.
Это перечисление присутствует в объекте PullRequest. Обратите внимание, что на момент публикации это функция предварительного просмотра и поэтому должен иметь соответствующий заголовок для работы. Он также не будет работать с GraphQL Explorer, пока он находится в предварительный просмотр.
В зависимости от конфигурации репо вы можете получить ответ так или иначе. В приведенных ниже примерах используется GraphQL API.
Случай 1: Перед слиянием требуются PR-обзоры
Вы можете запросить reviewDecision
в поле pullRequest
для данного репозитория.
reviewDecision
имеет тип PullRequestReviewDecision, перечисление со значениями APPROVED
, CHANGES_REQUESTED
и REVIEW_REQUIRED
.
Пример запроса:
{
repository(name: "gatsby", owner: "gatsbyjs") {
pullRequest(number: 30371) {
title
reviewDecision
url
}
}
}
Ответ:
{
"data": {
"repository": {
"pullRequest": {
"title": "chore(gatsby): don't terminate dev server if graphql wasn't imported from gatsby",
"reviewDecision": "APPROVED",
"url": "https://github.com/gatsbyjs/gatsby/pull/30371"
}
}
}
}
Случай 2. Перед слиянием не требуется PR-проверка
Если в настройках репозитория не указано, что проверки необходимы, reviewDecision
будет равно null
независимо от утверждений.
В этом случае вы можете перебирать отзывы и проверять состояния. state
имеет тип PullRequestReviewState, перечисление со значениями APPROVED
, CHANGES_REQUESTED
, COMMENTED
, DISMISSED
и PENDING
.
Пример запроса:
{
repository(name: "create-react-app", owner: "facebook") {
pullRequest(number: 10003) {
title
reviewDecision
url
reviews(first: 100) {
nodes {
state
author {
login
}
}
}
}
}
}
Ответ:
{
"data": {
"repository": {
"pullRequest": {
"title": "Update postcss packages",
"reviewDecision": null,
"url": "https://github.com/facebook/create-react-app/pull/10003",
"reviews": {
"nodes": [
{
"state": "APPROVED",
"author": {
"login": "jasonwilliams"
}
}
]
}
}
}
}
}
Возможна фильтрация отзывов для одобрения: reviews(first: 100, states: APPROVED)
.
Обратите внимание, что два отзыва будут возвращены, если рецензент даст свое согласие и впоследствии запросит изменения.
Проверка PR state
(типа PullRequestState) может ввести в заблуждение: пользователь с правами администратора мог обойти обязательный процесс проверки для объединения изменений.
В официальной документации Github API указано, что есть запрос GET, который вы можете сделать, поле merged_at, если оно уже было объединено. Изменить: есть также объединенное поле.
Фрагмент: ...
"merge_commit_sha": "e5bd3914e2e596debea16f433f57875b5b90bcd6",
"merged": false,
"mergeable": true,
"merged_by": {
"login": "octocat",
"id": 1,
"avatar_url": "https://github.com/images/error/octocat_happy.gif",
"gravatar_id": "",
"url": "https://api.github.com/users/octocat",
"html_url": "https://github.com/octocat",
"followers_url": "https://api.github.com/users/octocat/followers",
"following_url": "https://api.github.com/users/octocat/following{/other_user}",
"gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
"starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
"organizations_url": "https://api.github.com/users/octocat/orgs",
"repos_url": "https://api.github.com/users/octocat/repos",
"events_url": "https://api.github.com/users/octocat/events{/privacy}",
"received_events_url": "https://api.github.com/users/octocat/received_events",
"type": "User",
"site_admin": false
},