feat: add dry run delete flow

This commit is contained in:
2026-05-15 02:02:21 +00:00
parent 02d7cc5951
commit 4690617de0
2 changed files with 58 additions and 2 deletions
+4
View File
@@ -9,6 +9,10 @@ inputs:
description: 'Number of recent package versions to keep' description: 'Number of recent package versions to keep'
required: false required: false
default: '2' default: '2'
dry_run:
description: 'When true, only print delete candidates'
required: false
default: 'true'
runs: runs:
using: 'docker' using: 'docker'
image: 'Dockerfile' image: 'Dockerfile'
+54 -2
View File
@@ -47,6 +47,22 @@ resolve_keep_versions() {
printf '%s' "${raw_value}" printf '%s' "${raw_value}"
} }
resolve_dry_run() {
local raw_value="${INPUT_DRY_RUN:-true}"
case "${raw_value,,}" in
true|1|yes|on)
printf 'true'
;;
false|0|no|off)
printf 'false'
;;
*)
fail "Invalid dry_run: ${raw_value}"
;;
esac
}
init_repo_context() { init_repo_context() {
local repository="${GITEA_REPOSITORY:-}" local repository="${GITEA_REPOSITORY:-}"
@@ -171,8 +187,41 @@ collect_package_candidates() {
done < <(jq -c 'group_by(.name)[]' <<<"${packages_json}") done < <(jq -c 'group_by(.name)[]' <<<"${packages_json}")
} }
process_candidates() {
local dry_run="$1"
local name version created_at
local deleted_count=0
local skipped_count=0
local error_count=0
if [[ ! -s "${CANDIDATES_FILE}" ]]; then
log "No delete candidates found"
return 0
fi
while IFS=$'\t' read -r name version created_at; do
[[ -z "${name}" ]] && continue
if [[ "${dry_run}" == "true" ]]; then
log "[DRY-RUN] Would delete package ${name} version ${version} (created: ${created_at})"
skipped_count=$((skipped_count + 1))
continue
fi
if api_request DELETE "/api/v1/packages/${REPO_OWNER}/nuget/${name}/${version}"; then
log "Deleted package ${name} version ${version} -> ${API_HTTP_CODE}"
deleted_count=$((deleted_count + 1))
else
log "ERROR: DELETE package ${name} version ${version} -> ${API_HTTP_CODE}"
error_count=$((error_count + 1))
fi
done < "${CANDIDATES_FILE}"
log "Summary: deleted=${deleted_count} kept=${keep_versions} candidates=$(wc -l < "${CANDIDATES_FILE}") skipped=${skipped_count} errors=${error_count} dry_run=${dry_run}"
}
main() { main() {
local token keep_versions local token keep_versions dry_run
log "Gitea Server Url: ${GITEA_SERVER_URL:-}" log "Gitea Server Url: ${GITEA_SERVER_URL:-}"
log "Gitea Repository: ${GITEA_REPOSITORY:-}" log "Gitea Repository: ${GITEA_REPOSITORY:-}"
@@ -184,7 +233,9 @@ main() {
export RESOLVED_GITEA_TOKEN="$token" export RESOLVED_GITEA_TOKEN="$token"
init_repo_context init_repo_context
keep_versions="$(resolve_keep_versions)" keep_versions="$(resolve_keep_versions)"
dry_run="$(resolve_dry_run)"
log "keep_versions=${keep_versions}" log "keep_versions=${keep_versions}"
log "dry_run=${dry_run}"
log "Token source resolved successfully" log "Token source resolved successfully"
CANDIDATES_FILE="$(mktemp)" CANDIDATES_FILE="$(mktemp)"
@@ -192,7 +243,8 @@ main() {
trap 'rm -f "${CANDIDATES_FILE}"' EXIT trap 'rm -f "${CANDIDATES_FILE}"' EXIT
collect_package_candidates collect_package_candidates
log "Stage 3 complete" process_candidates "${dry_run}"
log "Stage 4 complete"
} }
main "$@" main "$@"