Получить заголовок запроса на получение из командной строки

Я пишу шаг непрерывной интеграции, который проверяет заголовки наших запросов извлечения на правильные теги и форматирование, прежде чем разрешить их объединение.

Для этого мне нужно повторить заголовок запроса на извлечение, когда ему дали номер PR. Есть ли способ сделать это просто в командной строке?

3 ответа

С новым официальным интерфейсом командной строки Github ( интерфейс командной строки):

gh pr view 3 --repo OWNER/REPO | head -n 1

где:

  • 3 это PR номер
  • gh pr view [options] отображает заголовок (первая строка), текст и другую информацию о PR
  • head -n 1 сохраняет только первую строку gh pr view вывод, чтобы получить только заголовок

См. Дополнительные сведения, параметры и инструкции по установке.

Основываясь на ответе @Simon-Warta, вы можете сделать следующее:

git clone https://github.com/user_org/project.git
pushd project
for pr in $(git log --pretty="%s" --merges | grep pull | sed -e "s/.*#\([0-9]\+\).*/\1/g" | sort -rn | uniq); do
  curl https://api.github.com/repos/user_org/project/pulls/${pr} 2>/dev/null | jq '.title';
done
popd

Тебе понадобиться curl а также jq доступно на вашей машине, но это не должно быть сложно, если у вас есть разумный дистрибутив Linux.

Спасибо Кевину Крайзеру. Моя версия его решения без jq и только текущие коммиты из последнего тега.

TL;DR

вместо

curl https://api.github.com/repos/user_org/project/pulls/${pr} 2>/dev/null | jq '.title';

использовать

curl https://api.github.com/repos/user_org/project/pulls/${pr} | grep title | cut -d'"' -f4

Для примера репозитория CocoaHeadsRu:

git clone https://github.com/cocoaheadsru/application.git  // clone the repository
cd application           // go to the application folder
touch getTitles.sh       // create file getTitles.sh
chmod a+x getTitles.sh   // make the file executable
vi getTitles.sh          // open the file in the vim text editor

добавьте следующий код в getTitles.sh:

for pr in $(git log $(git describe --tags --abbrev=0)..HEAD --pretty="%s" --merges | cut -d' ' -f4 | cut -d'#' -f2 | tr '\n' ' ')
do
    curl https://api.github.com/repos/cocoaheadsru/application/pulls/${pr} | grep title | cut -d'"' -f4
done

сохранить в код и выйти в Vim

:wq

Теперь мы можем создать файл примечаний к выпуску с помощью нашего скрипта:

./getTitles.sh > ReleaseNotes.txt
cat ReleaseNotes.txt

// [qXUdCQay] Changed app build number, deleted MARKETING_VERSION and CU…
// Feature/kn vl5 eaw/add bluetooth always key
// [CQoos82f] Updated Realm, increment app version
// upgraded travis configuration
// Открытие места проведения митапа в 2ГИС
// Автокапитализация и технические улучшения
// Интеграция Travis-CI
// Postpone fetchEvents for main view after view appearing

Описание кода скрипта:

1

git describe --tags --abbrev=0                  // get the last tag
git log $(git describe --tags --abbrev=0)..HEAD // get all commit from last tag to HEAD
[--//--] --pretty="%s"                          // all commits in one line
[--//--] --merges                               // merged commits only

2

разбить на строку на части, используя пробел и получить 4 - е значение

ex Merge pull request #347 от antonsergeev88 / swipeToPop_crash

[--//--] cut -d' ' -f4      // get '#347'

3

разбить на строку на части, используя символ "#" и получить 2 - ое значение

пример #347

[--//--] cut -d'#' -f2      // get '347'

4

tr '\n' ' '                 // replaced '/n' with a space character

получаем что-то вроде 355 354 353 352 350 349 348 347

5

В цикле с использованием github api:

curl https://api.github.com/repos/cocoaheadsru/application/pulls/347

мы получаем все pull-запросы в json-формате. Один из них:

{
  "url": "https://api.github.com/repos/cocoaheadsru/application/pulls/347",
  "id": 215781239,
  "number": 347,
  "state": "closed",
  ...
  "title": "Postpone fetchEvents for main view after view appearing",
  ...
  "user": {...},
  "merged_at": "2018-09-30T17:26:47Z",
  "merge_commit_sha": "553d8ea6f189882a22d424d0770785b53ddc4ab4",
  "commits": 1,
  ...
}

6

используя grep

[--//--] | grep title

получить в строку со словом названием:

"title": "Postpone fetchEvents for main view after view appearing",

7

используя вырезать:

[--//--] | cut -d'"' -f4

наконец, мы получаем только значение заголовка:

Postpone fetchEvents for main view after view appearing

Для запросов на использование

https://api.github.com/repos/randombit/botan/pulls/359

Для исправлений в запросе на поиск найдите Subject: в .patch URL:

https://github.com/randombit/botan/pull/359.patch

Обратите внимание, что вы можете делать только 60 запросов в час и IP на Github API.

Если вы используете github:

Найдите раздел для вашего пульта Github в .git/config файл. Это выглядит так:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@github.com:a.git

Теперь добавьте строку fetch = +refs/pull/*/head:refs/remotes/origin/pr/* в этот раздел. Очевидно, измените URL-адрес github, чтобы он соответствовал URL вашего проекта. В конечном итоге это выглядит так:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@github.com:a.git
    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

Теперь загрузите все запросы на извлечение:

$ git fetch origin
From github.com:ja
* [new ref]         refs/pull/1000/head -> origin/pr/1000
* [new ref]         refs/pull/1002/head -> origin/pr/1002
* [new ref]         refs/pull/1004/head -> origin/pr/1004
* [new ref]         refs/pull/1009/head -> origin/pr/1009

Чтобы проверить конкретный пул-запрос:

$ git checkout pr/999
Branch pr/999 set up to track remote branch pr/999 from origin.
Switched to a new branch 'pr/999'
Другие вопросы по тегам