Initial commit
This commit is contained in:
126
commands/address-review-comments/get-review-comments.sh
Normal file
126
commands/address-review-comments/get-review-comments.sh
Normal file
@@ -0,0 +1,126 @@
|
||||
#!/bin/sh
|
||||
|
||||
# resolve-review.sh
|
||||
# 指定した PR の未解決レビューコメントを GraphQL で取得し、
|
||||
# resolve-review 系 slash command 用に 1 行 1 JSON オブジェクトとして標準出力に返すヘルパースクリプト。
|
||||
|
||||
set -eu
|
||||
|
||||
if [ "$#" -eq 0 ]; then
|
||||
printf 'Usage: %s <PR number or PR URL>\n' "$(basename "$0")" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
readonly INPUT="$1"
|
||||
|
||||
OWNER="${OWNER:-}"
|
||||
REPO="${REPO:-}"
|
||||
|
||||
ensure_repo_context() {
|
||||
if [ -n "$OWNER" ] && [ -n "$REPO" ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
repo_payload="$(gh repo view --json owner,name --jq '.owner.login + " " + .name' 2>/dev/null || true)"
|
||||
if [ -z "$repo_payload" ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
repo_owner=${repo_payload%% *}
|
||||
repo_name=${repo_payload##* }
|
||||
|
||||
if [ -z "$OWNER" ] && [ -n "$repo_owner" ]; then
|
||||
OWNER="$repo_owner"
|
||||
fi
|
||||
|
||||
if [ -z "$REPO" ] && [ -n "$repo_name" ]; then
|
||||
REPO="$repo_name"
|
||||
fi
|
||||
}
|
||||
|
||||
ensure_repo_context
|
||||
|
||||
PR=""
|
||||
|
||||
case "$INPUT" in
|
||||
http://*|https://*)
|
||||
parsed="$(printf '%s' "$INPUT" | sed -E 's#^https?://github\\.com/([^/]+)/([^/]+)/pull/([0-9]+).*$#\1 \2 \3#')"
|
||||
if [ -n "$parsed" ]; then
|
||||
IFS=' ' read -r parsed_owner parsed_repo parsed_number <<EOF
|
||||
$parsed
|
||||
EOF
|
||||
if [ -z "$OWNER" ]; then
|
||||
OWNER="$parsed_owner"
|
||||
fi
|
||||
if [ -z "$REPO" ]; then
|
||||
REPO="$parsed_repo"
|
||||
fi
|
||||
if [ -z "$PR" ]; then
|
||||
PR="$parsed_number"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$PR" ]; then
|
||||
PR="$(gh pr view "$INPUT" --json number -q .number 2>/dev/null || true)"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
PR="$INPUT"
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -z "$OWNER" ] || [ -z "$REPO" ]; then
|
||||
printf 'owner/repo を特定できませんでした。OWNER/REPO を環境変数で指定してください\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$PR" ]; then
|
||||
printf 'PR を特定できませんでした。PR番号またはURLを指定してください\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
gh api graphql \
|
||||
-F owner="$OWNER" -F repo="$REPO" -F pr="$PR" \
|
||||
-f query='
|
||||
query($owner:String!, $repo:String!, $pr:Int!){
|
||||
repository(owner:$owner, name:$repo){
|
||||
pullRequest(number:$pr){
|
||||
reviewThreads(first: 100){
|
||||
nodes{
|
||||
isResolved
|
||||
isOutdated
|
||||
resolvedBy { login }
|
||||
comments(first: 100){
|
||||
nodes{
|
||||
databaseId
|
||||
author { login }
|
||||
path
|
||||
body
|
||||
line
|
||||
originalLine
|
||||
createdAt
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}' \
|
||||
--jq '
|
||||
.data.repository.pullRequest.reviewThreads.nodes[]
|
||||
| select(.isResolved | not)
|
||||
| . as $t
|
||||
| $t.comments.nodes[]
|
||||
| {
|
||||
resolved: $t.isResolved,
|
||||
outdated: $t.isOutdated,
|
||||
resolvedBy: ($t.resolvedBy.login // null),
|
||||
id: .databaseId,
|
||||
user: .author.login,
|
||||
path: .path,
|
||||
line: (.line // .originalLine),
|
||||
body: .body,
|
||||
createdAt
|
||||
}'
|
||||
|
||||
|
||||
76
commands/address-review-comments/reply-review-comment.sh
Normal file
76
commands/address-review-comments/reply-review-comment.sh
Normal file
@@ -0,0 +1,76 @@
|
||||
#!/bin/sh
|
||||
|
||||
# PR のレビューコメントスレッドに GitHub REST API で返信するヘルパースクリプト。
|
||||
# resolve-review-run.sh から呼び出され、元コメント ID からスレッドのルートコメントを特定して返信を投稿する。
|
||||
|
||||
set -eu
|
||||
|
||||
usage() {
|
||||
printf 'Usage: %s <comment-id> <reply message>\n' "$(basename "$0")" >&2
|
||||
printf 'Example: %s 123456 \"LGTM です\"\n' "$(basename "$0")" >&2
|
||||
}
|
||||
|
||||
if [ "$#" -lt 2 ]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
readonly COMMENT_ID="$1"
|
||||
shift
|
||||
|
||||
readonly MESSAGE="$*"
|
||||
|
||||
if [ -z "$MESSAGE" ]; then
|
||||
printf '返信本文を指定してください\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
OWNER="${OWNER:-}"
|
||||
REPO="${REPO:-}"
|
||||
|
||||
if [ -z "$OWNER" ]; then
|
||||
OWNER="$(gh repo view --json owner -q .owner.login 2>/dev/null || true)"
|
||||
fi
|
||||
|
||||
if [ -z "$REPO" ]; then
|
||||
REPO="$(gh repo view --json name -q .name 2>/dev/null || true)"
|
||||
fi
|
||||
|
||||
if [ -z "$OWNER" ] || [ -z "$REPO" ]; then
|
||||
printf 'owner/repo を特定できませんでした。OWNER/REPO を環境変数で指定してください\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
comment_info="$(gh api \"repos/$OWNER/$REPO/pulls/comments/$COMMENT_ID\" 2>/dev/null || true)"
|
||||
|
||||
if [ -z "$comment_info" ]; then
|
||||
printf 'コメント %s の取得に失敗しました。gh api のログを確認してください\n' \"$COMMENT_ID\" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
root_comment_id=\"$(printf '%s' \"$comment_info\" | jq -r '(.in_reply_to_id // .id)')\"
|
||||
|
||||
if [ -z \"$root_comment_id\" ] || [ \"$root_comment_id\" = \"null\" ]; then
|
||||
printf 'コメント %s を特定できませんでした。ID が正しいか確認してください\n' \"$COMMENT_ID\" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
pull_request_url=\"$(printf '%s' \"$comment_info\" | jq -r '.pull_request_url')\"
|
||||
pull_number=\"$(printf '%s' \"$pull_request_url\" | sed -E 's#.*/pulls/([0-9]+)$#\1#')\"
|
||||
|
||||
if [ -z \"$pull_number\" ] || [ \"$pull_number\" = \"null\" ]; then
|
||||
printf 'PR番号を特定できませんでした\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! reply_url=\"$(gh api \
|
||||
--method POST \
|
||||
\"repos/$OWNER/$REPO/pulls/$pull_number/comments/$root_comment_id/replies\" \
|
||||
--raw-field body=\"$MESSAGE\" \
|
||||
--jq '.html_url')\" ; then
|
||||
printf '返信投稿に失敗しました。gh api のログを確認してください\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf '返信を投稿しました: %s\n' \"$reply_url\"
|
||||
|
||||
Reference in New Issue
Block a user