Skip to content

Instantly share code, notes, and snippets.

@jensim
Last active June 6, 2024 21:44
Show Gist options
  • Select an option

  • Save jensim/c157b935f3c3874bd9857509a6b36f82 to your computer and use it in GitHub Desktop.

Select an option

Save jensim/c157b935f3c3874bd9857509a6b36f82 to your computer and use it in GitHub Desktop.
Add default reviewers to bitbucket-server pull requests where there are currently 0 reviewers
#!/bin/bash
#set -x
set -e
host='https://my-code.local'
if ! which jq ; then
echo 'jq not installed.' >&2
exit 1
fi
username="$(whoami)"
echo "Username ($username):" >&2
read -r username_input
if ! [ "$username_input" = '' ]; then
username="$username_input"
fi
password=''
while [ "$password" = '' ]; do
echo "Password: " >&2
read -s -r password
done
function handle_single_pr(){
pr="$1"
# echo "$pr"
pr_id="$(jq -r '.id' <<< "$pr")"
pr_version="$(jq -r '.version' <<< "$pr")"
to_ref="$(jq -r '.toRef.id' <<< "$pr")"
from_ref="$(jq -r '.fromRef.id' <<< "$pr")"
to_repo="$(jq -r '.toRef.repository.id' <<< "$pr")"
from_repo="$(jq -r '.fromRef.repository.id' <<< "$pr")"
key="$(jq -r '.fromRef.repository.project.key' <<< "$pr")"
repo_slug="$(jq -r '.fromRef.repository.slug' <<< "$pr")"
default_reviewers="$(curl -s -f -u "${username}:${password}" "${host}/rest/default-reviewers/1.0/projects/$key/repos/$repo_slug/reviewers?sourceRefId=${from_ref}&targetRefId=${to_ref}&sourceRepoId=${from_repo}&targetRepoId=${to_repo}")"
default_reviewers_formatted="$(jq -c '[ .[] | {"user":{"name":.name}}]' <<<"$default_reviewers")"
body="{\"id\":${pr_id},\"version\":${pr_version},\"reviewers\":${default_reviewers_formatted}}"
default_reviewers_printable="$(jq -c '[ .[] | .name ]' <<<"$default_reviewers")"
curl -s -f -u "${username}:${password}" -X PUT -H 'Content-Type: application/json' -d "${body}" "${host}/rest/api/1.0/projects/${key}/repos/${repo_slug}/pull-requests/${pr_id}" > /dev/null
echo "PUT default reviewers ${default_reviewers_printable} to pr against repo '${key}:${repo_slug}'"
printf '.'
}
is_last_page=false
start=0
while [ "$is_last_page" == 'false' ] ; do
prs_json="$(curl -s -f -u "${username}:${password}" "${host}/rest/api/1.0/dashboard/pull-requests?limit=10&state=OPEN&role=AUTHOR&start=${start}")"
is_last_page="$(jq -r '.isLastPage' <<< "$prs_json")"
size="$(jq -r '.size' <<< "$prs_json")"
if [ "$size" == 0 ] ; then
echo 'Nothing to do.'
break
else
echo "Working start:$start is_last_page:$is_last_page size:$size"
start=$((size+start))
IFS='
'
for pr in $(jq -c '.values[] | select((.reviewers | length) == 0)' <<< "$prs_json") ; do
handle_single_pr "$pr" &
done
wait
fi
done
echo ""
echo "Done"
@nspassov

nspassov commented Jan 6, 2023

Copy link
Copy Markdown

Great work, thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment