bytelyst-devops-tools/check_i_ayushh18_collaborator.sh

160 lines
4.2 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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}"