#!/usr/bin/env bash set -euo pipefail PROJECTS_DIR="k8s/services/argo" APPS_DIR="k8s/argo-apps" usage() { cat </dev/null | \ sed 's/.*repoURL: *//' | \ sort -u } get_project_name_from_repo() { local repo="$1" for project_file in "$PROJECTS_DIR"/project-*.yaml; do local project_name project_name=$(basename "$project_file" .yaml | sed 's/^project-//') if awk '/^[[:space:]]*sourceRepos:/,/^[[:space:]]*[a-z]+:/' "$project_file" | \ grep -qE "^[[:space:]]+- ${repo//\./\\.}$"; then echo "$project_name" return fi done } list_all() { echo "=== All Source Repos in ArgoCD Projects ===" echo "" while IFS= read -r repo; do local project project=$(get_project_name_from_repo "$repo") echo "[$project] $repo" done < <(get_all_project_repos) } list_unused() { local all_repos local all_app_repos all_repos=$(get_all_project_repos) all_app_repos=$(get_all_app_repos) echo "=== Unused Source Repos ===" echo "" local found_unused=false while IFS= read -r repo; do if ! echo "$all_app_repos" | grep -qF -- "$repo"; then found_unused=true local project project=$(get_project_name_from_repo "$repo") echo "[$project] $repo" fi done < <(echo "$all_repos") if [ "$found_unused" = false ]; then echo "No unused source repos found." fi } delete_unused() { local all_repos local all_app_repos all_repos=$(get_all_project_repos) all_app_repos=$(get_all_app_repos) local found_unused=false local to_delete=() while IFS= read -r repo; do if ! echo "$all_app_repos" | grep -qF -- "$repo"; then found_unused=true to_delete+=("$repo") fi done < <(echo "$all_repos") if [ "$found_unused" = false ]; then echo "No unused source repos found." return fi echo "The following source repos will be deleted:" echo "" for repo in "${to_delete[@]}"; do local project project=$(get_project_name_from_repo "$repo") echo "[$project] $repo" done echo "" read -p "Are you sure? [y/N] " -r if [[ ! $REPLY =~ ^[Yy]$ ]]; then echo "Aborted." return fi for repo in "${to_delete[@]}"; do for project_file in "$PROJECTS_DIR"/project-*.yaml; do if grep -q "sourceRepos:" "$project_file"; then local escaped_repo escaped_repo="${repo//\./\\.}" if grep -qE "^[[:space:]]+- $escaped_repo$" "$project_file"; then sed -i "s|^[[:space:]]*- $escaped_repo$||" "$project_file" sed -i '/^[[:space:]]*-$/d' "$project_file" sed -i '/^[[:space:]]*$/d' "$project_file" echo "Deleted '$repo' from $(basename "$project_file")" fi fi done done } COMMAND="list_all" while [[ $# -gt 0 ]]; do case "$1" in -l|--list) COMMAND="list_all" ;; -u|--unused) COMMAND="list_unused" ;; -d|--delete-unused) COMMAND="delete_unused" ;; -h|--help) usage exit 0 ;; *) echo "Unknown option: $1" usage exit 1 ;; esac shift done case "$COMMAND" in list_all) list_all ;; list_unused) list_unused ;; delete_unused) delete_unused ;; esac