mirror of https://github.com/thesofproject/sof.git
70 lines
2.3 KiB
Bash
Executable File
70 lines
2.3 KiB
Bash
Executable File
#!/bin/sh
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
set -e
|
|
|
|
# This script fetches Pull Request commits missing from a shallow clone
|
|
# and creates a PR_SHAs.txt file. This script has a limit of 500 commits but the
|
|
# github API used has a lower limit of 250 commits.
|
|
|
|
# It does not rely on git merge-bases which basically don't work with
|
|
# shallow clones:
|
|
# https://github.com/thesofproject/linux/issues/2556
|
|
|
|
# Design goals:
|
|
#
|
|
# - Keep the code short and as simple as possible. No one is interested
|
|
# in maintaining this sort of script.
|
|
#
|
|
# - Fast and accurate for small Pull Requests
|
|
#
|
|
# - For large Pull Requests _with merges_ the only objective is to
|
|
# complete in a reasonable time; say less than 10 minutes. It's very
|
|
# unlikely will look at 250 checkpatch results and time optimizations
|
|
# should not make this script more complex.
|
|
|
|
|
|
# Sample usage:
|
|
# $0 thesoftproject/linux 2772
|
|
main()
|
|
{
|
|
local gh_project="$1"
|
|
local pr_number="$2"
|
|
|
|
printf '%s: fetching PR %d for project %s\n' "$0" "$pr_number" "$gh_project"
|
|
|
|
# As of March 2021, Github's documented limit is 250 commits
|
|
# Let's have another cap a 500.
|
|
# https://docs.github.com/en/rest/reference/pulls#list-commits-on-a-pull-request
|
|
local pagelen PRlen=0
|
|
for i in 1 2 3 4 5; do
|
|
curl -H 'Accept: application/vnd.github.v3+json' \
|
|
"https://api.github.com/repos/$gh_project/pulls/$pr_number/commits?per_page=100&page=$i" \
|
|
> commits_"$i".json
|
|
pagelen=$(jq length < commits_$i.json)
|
|
if [ "$pagelen" -eq 0 ]; then
|
|
break
|
|
fi
|
|
PRlen=$((PRlen + pagelen))
|
|
done
|
|
|
|
printf 'Found %d commits, SHA1 list is in PR_SHAs.txt\n' "$PRlen"
|
|
|
|
# 'cut' removes double quotes
|
|
cat commits_?.json |
|
|
jq '.[] | .sha' |
|
|
cut -b2-41 > PR_SHAs.txt
|
|
|
|
# PRlen+1 gets us the merge base for simple, linear histories. For
|
|
# pull requests with merges, depth=PRLEN goes already much further
|
|
# than needed and +1 makes little difference. It's not clear when
|
|
# and for what sort of PRs git fetching individual commits would be
|
|
# faster so keep a single and simple fetch for now.
|
|
|
|
set -x # this command may take a while so show it
|
|
git fetch --depth "$((PRlen+1))" "https://github.com/$gh_project" "pull/$pr_number/head"
|
|
|
|
}
|
|
|
|
main "$@"
|