mirror of
https://github.com/anthropics/claude-code.git
synced 2026-02-07 09:24:06 +00:00
- Create GitHub API caching script that handles authenticated and unauthenticated requests - Update Dockerfile to include the script in the container - Update init-firewall.sh to use cached GitHub API data - Modify devcontainer.json to run cache script before build and mount cache directory 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
109 lines
3.2 KiB
Bash
Executable File
109 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
# Script to cache GitHub API data
|
|
# Used to prevent rate limiting during container builds
|
|
|
|
# Configuration
|
|
# Store cache in the home directory
|
|
CACHE_DIR="${HOME}/.github-meta-cache"
|
|
CACHE_FILE="${CACHE_DIR}/meta.json"
|
|
TIMESTAMP_FILE="${CACHE_DIR}/meta-timestamp.txt"
|
|
MAX_AGE_SECONDS=3600 # Cache expires after 1 hour
|
|
|
|
# Create cache directory if it doesn't exist
|
|
mkdir -p "${CACHE_DIR}"
|
|
|
|
# Function to get current timestamp
|
|
get_timestamp() {
|
|
date +%s
|
|
}
|
|
|
|
# Function to check if cache is valid
|
|
is_cache_valid() {
|
|
if [[ ! -f "${CACHE_FILE}" || ! -f "${TIMESTAMP_FILE}" ]]; then
|
|
return 1
|
|
fi
|
|
|
|
local cache_time=$(cat "${TIMESTAMP_FILE}")
|
|
local current_time=$(get_timestamp)
|
|
local age=$((current_time - cache_time))
|
|
|
|
if [[ ${age} -gt ${MAX_AGE_SECONDS} ]]; then
|
|
echo "Cache is expired (${age} seconds old)"
|
|
return 1
|
|
fi
|
|
|
|
echo "Using cached GitHub API data (${age} seconds old)"
|
|
return 0
|
|
}
|
|
|
|
# Function to fetch data using authenticated gh cli
|
|
fetch_with_gh() {
|
|
echo "Attempting to fetch GitHub API data using authenticated gh CLI..."
|
|
if gh auth status &>/dev/null; then
|
|
gh api meta > "${CACHE_FILE}" &&
|
|
get_timestamp > "${TIMESTAMP_FILE}" &&
|
|
echo "Successfully fetched and cached GitHub API data using gh CLI"
|
|
return $?
|
|
else
|
|
echo "gh CLI not authenticated"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Function to fetch data using curl
|
|
fetch_with_curl() {
|
|
echo "Attempting to fetch GitHub API data using curl..."
|
|
# First try with GITHUB_TOKEN if available
|
|
if [[ -n "${GITHUB_TOKEN}" ]]; then
|
|
echo "Using GITHUB_TOKEN for authentication"
|
|
curl -s -H "Authorization: token ${GITHUB_TOKEN}" https://api.github.com/meta > "${CACHE_FILE}" &&
|
|
get_timestamp > "${TIMESTAMP_FILE}" &&
|
|
echo "Successfully fetched and cached GitHub API data using curl with token"
|
|
return $?
|
|
else
|
|
# Fall back to unauthenticated request
|
|
echo "No GITHUB_TOKEN found, making unauthenticated request (may be rate limited)"
|
|
curl -s https://api.github.com/meta > "${CACHE_FILE}"
|
|
|
|
# Check if the response indicates rate limiting
|
|
if grep -q "API rate limit exceeded" "${CACHE_FILE}"; then
|
|
echo "Rate limit exceeded for unauthenticated request"
|
|
return 1
|
|
else
|
|
get_timestamp > "${TIMESTAMP_FILE}"
|
|
echo "Successfully fetched and cached GitHub API data using curl without auth"
|
|
return 0
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Main logic
|
|
if is_cache_valid; then
|
|
echo "Using existing cache from $(cat ${TIMESTAMP_FILE})"
|
|
exit 0
|
|
fi
|
|
|
|
# Try with gh CLI first
|
|
if ! fetch_with_gh; then
|
|
# Fall back to curl
|
|
if ! fetch_with_curl; then
|
|
# Both methods failed, check if we have an existing cache file
|
|
if [[ -f "${CACHE_FILE}" ]]; then
|
|
echo "Warning: Failed to update cache, using existing cached data (which may be expired)"
|
|
exit 0
|
|
else
|
|
echo "Error: Failed to fetch GitHub API data and no cache exists"
|
|
exit 1
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Display a summary of the cached data
|
|
echo "GitHub API meta data cached successfully. Summary:"
|
|
jq -r '.domains.actions | length' "${CACHE_FILE}" > /dev/null 2>&1 &&
|
|
echo "- Actions domains: $(jq -r '.domains.actions | length' "${CACHE_FILE}")" ||
|
|
echo "- Could not parse actions domains from cache file"
|
|
|
|
exit 0 |