| #!/usr/bin/env bash |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| # Assign a milestone to the given PR based on the open milestones and known |
| # releases. |
| |
| set -euo pipefail |
| |
| main() { |
| local -r repo="${1}" |
| local -r pr_number="${2}" |
| echo "On ${repo} pull ${pr_number}" |
| |
| local -r existing_milestone=$(gh pr view "${pr_number}" \ |
| --json milestone \ |
| -t '{{if .milestone}}{{.milestone.title}}{{end}}') |
| |
| if [[ -n "${existing_milestone}" ]]; then |
| echo "PR has milestone: ${existing_milestone}" |
| local -r milestone="${existing_milestone}" |
| else |
| local -r milestone=$( |
| gh api "/repos/${repo}/milestones" | |
| jq --raw-output '.[] | .title' | |
| grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | |
| head -n1 |
| ) |
| |
| echo "Assigning milestone: ${milestone}" |
| gh pr edit "${pr_number}" -m "${milestone}" |
| fi |
| |
| local -r repo_owner=$(echo "${repo}" | cut -d'/' -f1) |
| local -r repo_name=$(echo "${repo}" | cut -d'/' -f2) |
| local -r graphql_query="{ |
| repository(owner: \"${repo_owner}\", name: \"${repo_name}\") { |
| pullRequest(number: ${pr_number}) { |
| closingIssuesReferences(first: 5) { |
| edges { |
| node { |
| number |
| } |
| } |
| } |
| } |
| } |
| }" |
| local -r linked_issues=$(gh api graphql -f query="${graphql_query}" | jq -r '.data.repository.pullRequest.closingIssuesReferences.edges | .[].node.number') |
| for issue in ${linked_issues}; do |
| echo "Linked issue: ${issue}" |
| gh issue edit "${issue}" --milestone "${milestone}" |
| done |
| } |
| |
| main "$@" |