fukuops/scripts/source-repos.sh
cătălin 1fd2bfef3d
feat(helm): complete chart normalization with ConfigMap, HPA, and OCI migration
- Added debug mode, structured ConfigMap pattern, and README to all charts
- Migrated all flat-structure charts to hierarchical values under chartname key
- Fixed templates to use correct hierarchical paths
- Renamed helm-rustical key to rustical, added HPA support
- Fixed ingress YAML parsing (oxicloud), nested env vars (rustical)
- Pushed all normalized charts to OCI registry as 1.0.0+ and updated ArgoCD apps
2026-08-14 09:35:19 +02:00

174 lines
4.4 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
PROJECTS_DIR="k8s/services/argo"
APPS_DIR="k8s/argo-apps"
usage() {
cat <<EOF
Usage: $(basename "$0") [OPTIONS]
List and manage source repos in ArgoCD projects.
OPTIONS:
-l, --list List all source repos (default)
-u, --unused List unused source repos
-d, --delete-unused Delete unused source repos from projects
-h, --help Show this help message
Examples:
$(basename "$0") # List all source repos
$(basename "$0") -u # List unused source repos
$(basename "$0") -d # Delete unused source repos
EOF
}
get_all_project_repos() {
awk '/^[[:space:]]*sourceRepos:/,/^[[:space:]]*[a-z]+:/' "$PROJECTS_DIR"/project-*.yaml | \
grep -E '^[[:space:]]+-[[:space:]]+' | \
sed 's/^[[:space:]]*- //' | \
sort -u
}
get_all_app_repos() {
grep -E '(^\s+-\s+repoURL:|^\s+repoURL:)' "$APPS_DIR"/*.yaml 2>/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