| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- #!/usr/bin/env bash
- # input:
- # env:
- # - CRATE_TOKEN
- # - COMMIT_RANGE
- if [[ -z $COMMIT_RANGE ]]; then
- echo "COMMIT_RANGE should be provided"
- exit 1
- fi
- if ! command -v toml &>/dev/null; then
- echo "not found toml-cli"
- cargo install toml-cli
- fi
- declare skip_patterns=(
- "Cargo.toml"
- "programs/sbf"
- )
- declare -A verified_crate_owners=(
- ["anza-team"]=1
- )
- # get Cargo.toml from git diff
- readarray -t files <<<"$(git diff "$COMMIT_RANGE" --diff-filter=AM --name-only | grep Cargo.toml)"
- printf "%s\n" "${files[@]}"
- error_count=0
- for file in "${files[@]}"; do
- read -r crate_name package_publish workspace < <(toml get "$file" . | jq -r '(.package.name | tostring)+" "+(.package.publish | tostring)+" "+(.workspace | tostring)')
- echo "=== $crate_name ($file) ==="
- if [[ $package_publish = 'false' ]]; then
- echo -e "⏩ skip (package_publish: $package_publish)\n"
- continue
- fi
- if [[ "$workspace" != "null" ]]; then
- echo -e "⏩ skip (is a workspace root)\n"
- continue
- fi
- for skip_pattern in "${skip_patterns[@]}"; do
- if [[ $file =~ ^$skip_pattern ]]; then
- echo -e "⏩ skip (match skip patterns)\n"
- continue 2
- fi
- done
- response=$(curl -s https://crates.io/api/v1/crates/"$crate_name"/owners)
- errors=$(echo "$response" | jq .errors)
- if [[ $errors != "null" ]]; then
- details=$(echo "$response" | jq .errors | jq -r ".[0].detail")
- if [[ $details = *"does not exist"* ]]; then
- ((error_count++))
- echo "❌ new crate $crate_name not found on crates.io. you can either
- 1. mark it as not for publication in its Cargo.toml
- [package]
- ...
- publish = false
- or
- 2. make a dummy publication.
- example:
- scripts/reserve-cratesio-package-name.sh \
- --token <GRIMES_CRATESIO_TOKEN> \
- lib solana-new-lib-crate
- see also: scripts/reserve-cratesio-package-name.sh --help
- "
- else
- ((error_count++))
- echo "❌ $response"
- fi
- else
- readarray -t owners <<<"$(echo "$response" | jq .users | jq -r ".[] | .login")"
- verified_owner_count=0
- unverified_owner_count=0
- for owner in "${owners[@]}"; do
- if [[ -z $owner ]]; then
- continue
- fi
- owner_id="$(echo "$owner" | awk '{print $1}')"
- if [[ ${verified_crate_owners[$owner_id]} ]]; then
- ((verified_owner_count++))
- echo "✅ $owner"
- else
- ((unverified_owner_count++))
- echo "❌ $owner"
- fi
- done
- if [[ ($unverified_owner_count -gt 0) ]]; then
- ((error_count++))
- echo "error: found unverified owner(s)"
- elif [[ ($verified_owner_count -le 0) ]]; then
- ((error_count++))
- echo "error: there are no verified owners"
- fi
- fi
- echo ""
- done
- if [ "$error_count" -eq 0 ]; then
- echo "success"
- exit 0
- else
- exit 1
- fi
|