fork of hey-api/openapi-ts because I need some additional things
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[@]}"