From 4690617de01966eafaa9e3139282a4603255770e Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 15 May 2026 02:02:21 +0000 Subject: [PATCH] feat: add dry run delete flow --- action.yaml | 4 ++++ entrypoint.sh | 56 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/action.yaml b/action.yaml index be38a82..2de13d3 100644 --- a/action.yaml +++ b/action.yaml @@ -9,6 +9,10 @@ inputs: description: 'Number of recent package versions to keep' required: false default: '2' + dry_run: + description: 'When true, only print delete candidates' + required: false + default: 'true' runs: using: 'docker' image: 'Dockerfile' diff --git a/entrypoint.sh b/entrypoint.sh index 101f28a..0164d8a 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -47,6 +47,22 @@ resolve_keep_versions() { 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() { local repository="${GITEA_REPOSITORY:-}" @@ -171,8 +187,41 @@ collect_package_candidates() { 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() { - local token keep_versions + local token keep_versions dry_run log "Gitea Server Url: ${GITEA_SERVER_URL:-}" log "Gitea Repository: ${GITEA_REPOSITORY:-}" @@ -184,7 +233,9 @@ main() { export RESOLVED_GITEA_TOKEN="$token" init_repo_context keep_versions="$(resolve_keep_versions)" + dry_run="$(resolve_dry_run)" log "keep_versions=${keep_versions}" + log "dry_run=${dry_run}" log "Token source resolved successfully" CANDIDATES_FILE="$(mktemp)" @@ -192,7 +243,8 @@ main() { trap 'rm -f "${CANDIDATES_FILE}"' EXIT collect_package_candidates - log "Stage 3 complete" + process_candidates "${dry_run}" + log "Stage 4 complete" } main "$@"