fork of hey-api/openapi-ts because I need some additional things
at main 3.3 kB view raw
1#!/usr/bin/env bash 2 3REPO="hey-api/openapi-ts" 4PER_PAGE=100 5PAGE=1 6USERS=() 7 8TMP_LOGINS="tmp_logins.txt" 9TMP_USERS="tmp_users.txt" 10 11CACHE_DIR=".cache/github-users" 12mkdir -p "$CACHE_DIR" 13 14AUTH_HEADER=() 15if [[ -n "${GITHUB_TOKEN:-}" ]]; then 16 AUTH_HEADER=(-H "Authorization: token $GITHUB_TOKEN") 17fi 18 19EXCLUDED_FILE="./docs/.contributorsignore" 20SINCE_FILE="./docs/.contributorssince" 21 22# disabled for now, we'd need to append to the list instead of write 23# if [[ -f "$SINCE_FILE" ]]; then 24# SINCE=$(cat "$SINCE_FILE") 25# else 26# SINCE="2024-01-27T00:00:00Z" 27# fi 28SINCE="2024-01-27T00:00:00Z" 29 30MAX_COMMIT_EPOCH=0 31 32> "$TMP_USERS" 33 34while :; do 35 TMP_JSON=$(mktemp) 36 HTTP_STATUS=$(curl -s -w "%{http_code}" -o "$TMP_JSON" \ 37 "${AUTH_HEADER[@]}" \ 38 "https://api.github.com/repos/$REPO/commits?sha=main&since=$SINCE&per_page=$PER_PAGE&page=$PAGE") 39 40 if [ "$HTTP_STATUS" != "200" ]; then 41 echo "GitHub API error: $HTTP_STATUS" 42 cat "$TMP_JSON" 43 rm "$TMP_JSON" 44 break 45 fi 46 47 if ! jq empty "$TMP_JSON" >/dev/null 2>&1; then 48 echo "Invalid JSON, stopping." 49 cat "$TMP_JSON" > debug_response.json 50 rm "$TMP_JSON" 51 break 52 fi 53 54 COUNT=$(jq 'length' "$TMP_JSON") 55 if [ "$COUNT" -eq 0 ]; then 56 rm "$TMP_JSON" 57 break 58 fi 59 60 # Track max commit date epoch for the whole run 61 LATEST_COMMIT_DATE=$(jq -r '.[].commit.committer.date' "$TMP_JSON" | sort -r | head -n1) 62 if [[ -n "$LATEST_COMMIT_DATE" ]]; then 63 EPOCH=$(date -j -f "%Y-%m-%dT%H:%M:%SZ" "$LATEST_COMMIT_DATE" "+%s") 64 if [ "$EPOCH" -gt "$MAX_COMMIT_EPOCH" ]; then 65 MAX_COMMIT_EPOCH=$EPOCH 66 fi 67 fi 68 69 jq -r '.[].author | select(.login != null) | .login' "$TMP_JSON" | sort -u > "$TMP_LOGINS" 70 71 while read -r login; do 72 if ! grep -Fxq "$login" "$EXCLUDED_FILE"; then 73 if ! printf '%s\n' "${USERS[@]}" | grep -qx "$login"; then 74 USERS+=("$login") 75 76 CACHE_FILE="$CACHE_DIR/$login.json" 77 if [ -f "$CACHE_FILE" ]; then 78 USER_JSON=$(<"$CACHE_FILE") 79 else 80 echo "Fetching user $login" 81 USER_JSON=$(curl -s "${AUTH_HEADER[@]}" "https://api.github.com/users/$login") 82 echo "$USER_JSON" > "$CACHE_FILE" 83 fi 84 85 SANITIZED_JSON=$(echo "$USER_JSON" | tr -d '\000-\037') 86 NAME=$(jq -r '.name // empty' <<< "$SANITIZED_JSON") 87 echo "$login|$NAME" >> "$TMP_USERS" 88 fi 89 fi 90 done < "$TMP_LOGINS" 91 92 rm "$TMP_JSON" "$TMP_LOGINS" 93 PAGE=$((PAGE + 1)) 94done 95 96# Update SINCE_FILE once after all pages 97if [ "$MAX_COMMIT_EPOCH" -gt 0 ]; then 98 BUFFER_DAYS=90 99 BUFFER_SECONDS=$((BUFFER_DAYS * 86400)) 100 BUFFERED_EPOCH=$((MAX_COMMIT_EPOCH - BUFFER_SECONDS)) 101 BUFFERED_DATE=$(date -u -r "$BUFFERED_EPOCH" "+%Y-%m-%dT%H:%M:%SZ") 102 echo "$BUFFERED_DATE" > "$SINCE_FILE" 103 echo "Updated SINCE to $BUFFERED_DATE" 104fi 105 106NAMES_SORTED=$(awk -F'|' '$2 != ""' "$TMP_USERS" | sort -t'|' -k2,2) 107NO_NAMES_SORTED=$(awk -F'|' '$2 == ""' "$TMP_USERS" | sort -t'|' -k1,1) 108 109{ 110 echo "$NAMES_SORTED" 111 echo "$NO_NAMES_SORTED" 112} | while IFS='|' read -r login name; do 113 if [ -n "$name" ]; then 114 echo "- [$name](https://github.com/$login)" 115 else 116 echo "- [$login](https://github.com/$login)" 117 fi 118done > ./docs/partials/contributors-list.md 119 120if [[ -f "$TMP_USERS" ]]; then 121 rm "$TMP_USERS" 122fi 123 124echo "Done. Total contributors: ${#USERS[@]}"