Получить заголовок запроса на получение из командной строки
Я пишу шаг непрерывной интеграции, который проверяет заголовки наших запросов извлечения на правильные теги и форматирование, прежде чем разрешить их объединение.
Для этого мне нужно повторить заголовок запроса на извлечение, когда ему дали номер PR. Есть ли способ сделать это просто в командной строке?
3 ответа
С новым официальным интерфейсом командной строки Github ( интерфейс командной строки):
gh pr view 3 --repo OWNER/REPO | head -n 1
где:
3
это PR номерgh pr view [options]
отображает заголовок (первая строка), текст и другую информацию о PRhead -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'