160 lines
4.2 KiB
Bash
Executable File
160 lines
4.2 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Script to check if i-ayushh18 is a collaborator on repositories
|
||
# Uses accounts.json for authentication tokens
|
||
|
||
set -euo pipefail
|
||
|
||
# Color definitions
|
||
readonly RED='\033[0;31m'
|
||
readonly GREEN='\033[0;32m'
|
||
readonly YELLOW='\033[1;33m'
|
||
readonly BLUE='\033[0;34m'
|
||
readonly CYAN='\033[0;36m'
|
||
readonly BOLD='\033[1m'
|
||
readonly NC='\033[0m' # No Color
|
||
|
||
USER_TO_CHECK="i-ayushh18"
|
||
REPOS_FILE="repos.txt"
|
||
ACCOUNTS_FILE="accounts.json"
|
||
|
||
# Function to log messages
|
||
log_info() {
|
||
echo -e "${BLUE}ℹ️ $1${NC}"
|
||
}
|
||
|
||
log_success() {
|
||
echo -e "${GREEN}✅ $1${NC}"
|
||
}
|
||
|
||
log_warning() {
|
||
echo -e "${YELLOW}⚠️ $1${NC}"
|
||
}
|
||
|
||
log_error() {
|
||
echo -e "${RED}❌ $1${NC}"
|
||
}
|
||
|
||
log_header() {
|
||
echo -e "\n${BOLD}${CYAN}$1${NC}"
|
||
echo -e "${CYAN}$(printf '=%.0s' {1..60})${NC}"
|
||
}
|
||
|
||
# Check required files
|
||
if [[ ! -f "$REPOS_FILE" ]]; then
|
||
log_error "Repository list file '$REPOS_FILE' not found"
|
||
exit 1
|
||
fi
|
||
|
||
if [[ ! -f "$ACCOUNTS_FILE" ]]; then
|
||
log_error "Accounts file '$ACCOUNTS_FILE' not found"
|
||
exit 1
|
||
fi
|
||
|
||
# Get GitHub token from accounts.json
|
||
GITHUB_TOKEN=$(jq -r '.[0].token' "$ACCOUNTS_FILE")
|
||
GITHUB_USER=$(jq -r '.[0].user' "$ACCOUNTS_FILE")
|
||
|
||
if [[ -z "$GITHUB_TOKEN" || "$GITHUB_TOKEN" == "null" ]]; then
|
||
log_error "Could not extract GitHub token from accounts.json"
|
||
exit 1
|
||
fi
|
||
|
||
log_info "Using GitHub account: $GITHUB_USER"
|
||
|
||
# Function to check if user is a collaborator on a repository
|
||
check_collaboration() {
|
||
local repo="$1"
|
||
|
||
# Validate repository name format
|
||
if [[ ! "$repo" =~ ^[a-zA-Z0-9._-]+/[a-zA-Z0-9._-]+$ ]]; then
|
||
log_warning "Invalid repository name format: $repo"
|
||
return 1
|
||
fi
|
||
|
||
local response
|
||
response=$(curl -s -w "%{http_code}" -H "Authorization: token $GITHUB_TOKEN" \
|
||
"https://api.github.com/repos/$repo/collaborators/$USER_TO_CHECK")
|
||
|
||
local http_code="${response: -3}"
|
||
|
||
case "$http_code" in
|
||
204)
|
||
return 0 # User is a collaborator
|
||
;;
|
||
404)
|
||
return 1 # User is not a collaborator
|
||
;;
|
||
403)
|
||
log_warning "Access forbidden for $repo - may not have admin permissions"
|
||
return 1
|
||
;;
|
||
401)
|
||
log_error "Authentication failed - token may be invalid or expired"
|
||
return 1
|
||
;;
|
||
*)
|
||
log_warning "Failed to check collaboration status for $USER_TO_CHECK on $repo (HTTP: $http_code)"
|
||
return 1
|
||
;;
|
||
esac
|
||
}
|
||
|
||
# Main execution
|
||
log_header "Checking collaborator status for $USER_TO_CHECK"
|
||
|
||
# Read repositories from file
|
||
if [[ ! -s "$REPOS_FILE" ]]; then
|
||
log_error "Repository file '$REPOS_FILE' is empty"
|
||
exit 1
|
||
fi
|
||
|
||
collaborator_repos=()
|
||
total_repos=0
|
||
checked_repos=0
|
||
|
||
# Count total repositories
|
||
total_repos=$(wc -l < "$REPOS_FILE")
|
||
log_info "Found $total_repos repositories to check"
|
||
|
||
log_header "Checking Repositories"
|
||
|
||
# Check each repository
|
||
while IFS= read -r repo; do
|
||
# Skip empty lines
|
||
[[ -z "$repo" ]] && continue
|
||
|
||
((checked_repos++))
|
||
printf "\r${CYAN}Progress: [%3d%%] %d/%d repositories checked${NC}" \
|
||
$((checked_repos * 100 / total_repos)) "$checked_repos" "$total_repos"
|
||
|
||
if check_collaboration "$repo"; then
|
||
collaborator_repos+=("$repo")
|
||
echo # New line after progress
|
||
log_success "$USER_TO_CHECK is a collaborator on: $repo"
|
||
fi
|
||
done < "$REPOS_FILE"
|
||
|
||
echo # New line after progress
|
||
|
||
# Show results
|
||
log_header "Results Summary"
|
||
|
||
if [[ ${#collaborator_repos[@]} -eq 0 ]]; then
|
||
log_info "✨ $USER_TO_CHECK is not a collaborator on any of the $total_repos repositories checked"
|
||
echo -e "${GREEN}No repositories found where $USER_TO_CHECK has collaborator access.${NC}"
|
||
else
|
||
log_success "$USER_TO_CHECK is a collaborator on ${#collaborator_repos[@]} out of $total_repos repositories:"
|
||
echo
|
||
for repo in "${collaborator_repos[@]}"; do
|
||
echo -e "${YELLOW}• $repo${NC}"
|
||
done
|
||
|
||
# Save results to file
|
||
results_file="collaborator_repos_${USER_TO_CHECK}.txt"
|
||
printf '%s\n' "${collaborator_repos[@]}" > "$results_file"
|
||
log_info "Results saved to: $results_file"
|
||
fi
|
||
|
||
log_header "Operation Complete"
|
||
echo -e "${GREEN}Finished checking $total_repos repositories for $USER_TO_CHECK collaborator status${NC}" |