|
#!/usr/bin/env bash |
|
# shellcheck disable=SC2155 |
|
set -uo pipefail |
|
|
|
readonly username="$1" |
|
readonly commitMessage="[TASK] Run PHP-CS-Fixer" |
|
readonly composerScript="fix:php" |
|
readonly workdir="$(mktemp -d)" |
|
|
|
failedRepos=() |
|
|
|
# Validate username |
|
if [ -z "$username" ]; then |
|
echo "β No username given" |
|
exit 1 |
|
fi |
|
|
|
# Perform authentication, if needed |
|
if [ "$(gh auth status --json hosts --jq ".hosts | .\"github.com\" | map(select(.login == \"$username\")) | length")" -eq 0 ]; then |
|
echo "π Not authenticated for GitHub user '$username'. Starting interactive login..." |
|
gh auth login || { echo "β Authentication failed"; exit 1; } |
|
else |
|
echo "β
Authenticated as '$username'" |
|
fi |
|
|
|
echo "Working directory: $workdir" |
|
echo |
|
|
|
cd "$workdir" || exit 1 |
|
|
|
# Fetch suitable repos |
|
readonly repos=$(gh repo list "$username" \ |
|
--limit 1000 \ |
|
--json name,defaultBranchRef,isArchived,isFork \ |
|
--jq '.[] | select(.isFork == false and .isArchived == false) | "\(.name)|\(.defaultBranchRef.name)"') |
|
|
|
# Process each repo |
|
for entry in $repos; do |
|
repoName="${entry%%|*}" |
|
defaultBranch="${entry##*|}" |
|
|
|
echo |
|
echo "ββββββββββββββββββββββββββββββββββββββββββββ" |
|
echo "Processing repo: $repoName (branch: $defaultBranch)" |
|
|
|
# Clone repo |
|
if ! gh repo clone "$username/$repoName" -- --depth=1; then |
|
failedRepos+=("$repoName (clone)") |
|
continue |
|
fi |
|
|
|
# Switch to repo dir |
|
cd "$repoName" || { |
|
failedRepos+=("$repoName (cd)") |
|
continue |
|
} |
|
|
|
# Skip if no composer.json exists |
|
if [[ ! -f composer.json ]]; then |
|
echo "βΉοΈ No composer.json β skipping" |
|
cd .. |
|
rm -rf "$repoName" |
|
continue |
|
fi |
|
|
|
lastCommitMessage=$(git log -1 --pretty=%s) |
|
|
|
# Skip if repo was already processed |
|
if [[ "$lastCommitMessage" == "$commitMessage" ]]; then |
|
echo "βΉοΈ Last commit already matches target message β skipping" |
|
cd .. |
|
rm -rf "$repoName" |
|
continue |
|
fi |
|
|
|
# Detect suitable composer script |
|
if composer help "$composerScript" >/dev/null 2>&1; then |
|
composerCommand="$composerScript" |
|
elif composer help cgl >/dev/null 2>&1; then |
|
composerCommand="cgl $composerScript" |
|
else |
|
echo "β οΈ No suitable composer fix command found β skipping" |
|
cd .. |
|
rm -rf "$repoName" |
|
continue |
|
fi |
|
|
|
# Run composer install |
|
if ! composer install --no-interaction --no-progress; then |
|
failedRepos+=("$repoName (composer install)") |
|
cd .. |
|
continue |
|
fi |
|
|
|
# Run composer fix |
|
if ! PHP_CS_FIXER_IGNORE_ENV=1 composer $composerCommand; then |
|
failedRepos+=("$repoName (composer $composerCommand)") |
|
cd .. |
|
continue |
|
fi |
|
|
|
# Skip if no files were changed |
|
if git diff --quiet; then |
|
echo "βΉοΈ No changes β nothing to commit" |
|
cd .. |
|
rm -rf "$repoName" |
|
continue |
|
fi |
|
|
|
# Commit changes |
|
if ! git commit -A -m "$commitMessage"; then |
|
failedRepos+=("$repoName (commit)") |
|
cd .. |
|
continue |
|
fi |
|
|
|
# Display changes |
|
echo |
|
echo "π Review changes if needed:" |
|
echo " cd \"$workdir/$repoName\"" |
|
echo |
|
git show |
|
echo |
|
|
|
# Push changes back to GitHub |
|
read -rp "π Push changes to '$defaultBranch'? [y/N] " CONFIRM |
|
if [[ "$CONFIRM" =~ ^[Yy]$ ]]; then |
|
if ! git push origin "$defaultBranch"; then |
|
failedRepos+=("$repoName (push)") |
|
else |
|
echo "β
Pushed successfully" |
|
fi |
|
else |
|
echo "βΈοΈ Push skipped by user" |
|
fi |
|
|
|
# Remove repo |
|
cd .. |
|
rm -rf "$repoName" |
|
done |
|
|
|
echo |
|
echo "ββββββββββββββββββββββββββββββββββββββββββββ" |
|
echo "Finished." |
|
|
|
# Display failed repos |
|
if (( ${#failedRepos[@]} > 0 )); then |
|
echo "β Failed repositories:" |
|
for repo in "${failedRepos[@]}"; do |
|
echo " - $repo" |
|
done |
|
else |
|
echo "β
All repositories processed successfully" |
|
fi |