diff --git a/README.md b/README.md index 32a7a37..aa40027 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ - 依序嘗試取得 Gitea API token。 - 預設每個套件保留最新 `2` 個版本。 - 直接刪除超出保留數量的舊版本。 +- 只處理你指定的 NuGet 套件名稱,可一次指定多個。 - 輸出可搜尋的 log,包含 API status、request id 與 summary。 ## Token 來源順序 @@ -25,6 +26,7 @@ Action 會依序嘗試以下來源: | --- | --- | --- | --- | | `RUNNER_TOKEN` | string | - | Gitea API token,優先順序最高 | | `KEEP_COUNT` | integer string | `2` | 每個套件要保留的最新版本數,必須是整數且 `>= 0` | +| `PACKAGE_NAMES` | string | - | 要清理的 NuGet 套件名稱,逗號分隔,可一次指定多個 | ## Log 行為 @@ -33,6 +35,7 @@ Action 會依序嘗試以下來源: - `Trying token from ...` - `Using token from ...` - `keep_count=...` +- `package_names=...` - `GET /api/v1/... -> 200 OK` - `Candidate to delete: ...` - `Deleted package ... -> 204 No Content` @@ -49,6 +52,7 @@ jobs: with: RUNNER_TOKEN: ${{ secrets.GITEA_TOKEN }} KEEP_COUNT: 2 + PACKAGE_NAMES: package-a,package-b ``` ## 相關檔案 diff --git a/action.yaml b/action.yaml index 048ee0c..2416ef1 100644 --- a/action.yaml +++ b/action.yaml @@ -3,12 +3,15 @@ description: '清理 Nuget 沒用到的資源' author: 'Jeffery' inputs: RUNNER_TOKEN: - description: 'GitHub Runner Token' + description: 'Gitea API token, highest priority source' required: false KEEP_COUNT: description: '保留的版本數量' required: false default: '2' + PACKAGE_NAMES: + description: '要清理的 NuGet 套件名稱,逗號分隔,可一次指定多個' + required: true runs: using: 'docker' image: 'Dockerfile' diff --git a/entrypoint.sh b/entrypoint.sh index 1071a77..a364f3b 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -10,6 +10,8 @@ fail() { exit 1 } +declare -A TARGET_PACKAGES=() + resolve_token() { log "Trying token from RUNNER_TOKEN" @@ -36,6 +38,30 @@ resolve_keep_versions() { printf '%s' "${raw_value}" } +resolve_package_names() { + local raw_value="${INPUT_PACKAGE_NAMES:-}" + local normalized package_name + local -a package_name_list + + if [[ -z "${raw_value}" ]]; then + fail "Missing PACKAGE_NAMES" + fi + + normalized="${raw_value//$'\n'/,}" + + IFS=',' read -r -a package_name_list <<< "${normalized}" + for package_name in "${package_name_list[@]}"; do + package_name="${package_name#"${package_name%%[![:space:]]*}"}" + package_name="${package_name%"${package_name##*[![:space:]]}"}" + [[ -n "${package_name}" ]] || continue + TARGET_PACKAGES["${package_name}"]=1 + done + + if (( ${#TARGET_PACKAGES[@]} == 0 )); then + fail "Missing PACKAGE_NAMES" + fi +} + init_repo_context() { local repository="${GITEA_REPOSITORY:-}" @@ -142,12 +168,17 @@ collect_package_candidates() { while IFS= read -r group_json; do package_name="$(jq -r '.[0].name' <<<"${group_json}")" + + if [[ -z "${TARGET_PACKAGES["$package_name"]+x}" ]]; then + continue + fi + total_versions="$(jq 'length' <<<"${group_json}")" PACKAGE_COUNT=$((PACKAGE_COUNT + 1)) TOTAL_VERSION_COUNT=$((TOTAL_VERSION_COUNT + total_versions)) - log "Package ${package_name}: total_versions=${total_versions} keep_versions=${keep_versions}" + log "Package ${package_name}: total_versions=${total_versions} keep_count=${keep_versions}" log "Package ${package_name} versions (oldest -> newest):" while IFS=$'\t' read -r version created_at; do [[ -z "${version}" ]] && continue @@ -219,6 +250,8 @@ main() { init_repo_context keep_versions="$(resolve_keep_versions)" log "keep_count=${keep_versions}" + resolve_package_names + log "package_names=${INPUT_PACKAGE_NAMES}" log "Token source resolved successfully" CANDIDATES_FILE="$(mktemp)" @@ -230,6 +263,9 @@ main() { trap 'rm -f "${CANDIDATES_FILE}"' EXIT collect_package_candidates + if (( PACKAGE_COUNT == 0 )); then + log "No matching packages found for requested package_names" + fi process_candidates log "Stage 4 complete" }