diff --git a/.gitea/actions/cleanup/action.yml b/.gitea/actions/cleanup/action.yml index b6ea0a6..3ca1054 100644 --- a/.gitea/actions/cleanup/action.yml +++ b/.gitea/actions/cleanup/action.yml @@ -21,12 +21,24 @@ runs: exit 1 fi + # Load skins array readarray -t skins < <(jq -r '.[]' "$all_skins_file") + # Remove known static extras [ -f how-to-use.md ] && rm -f -- how-to-use.md [ -f src/replay.osr ] && rm -f -- src/replay.osr [ -d src/default-skin ] && rm -rf -- src/default-skin + ############################################## + # NORMALIZATION FIX — KEY TO SOLVING PROBLEM # + ############################################## + normalize() { + printf "%s" "$1" | \ + tr '[:upper:]' '[:lower:]' | \ + sed 's/[][{}()<>|\/:*?"'"'"' ]/-/g' | \ + tr -s '-' | sed 's/^-//; s/-$//' + } + sanitize_filename() { echo "$1" | \ tr -d '\000-\037' | \ @@ -36,31 +48,47 @@ runs: skins_raw=() skins_clean=() + skins_norm=() for s in "${skins[@]}"; do - skins_raw+=("$s") - skins_clean+=("$(sanitize_filename "$s")") + raw="$s" + clean="$(sanitize_filename "$s")" + norm="$(normalize "$s")" + + skins_raw+=("$raw") + skins_clean+=("$clean") + skins_norm+=("$norm") done + ################################################## + # SAFE SKIN MATCHING → FIXES ALL FALSE DELETIONS # + ################################################## is_known_skin() { local name="$1" - for i in "${!skins_raw[@]}"; do - if [[ "$name" == "${skins_raw[$i]}" ]] || [[ "$name" == "${skins_clean[$i]}" ]]; then + local norm="$(normalize "$name")" + + for i in "${!skins_norm[@]}"; do + if [[ "$norm" == "${skins_norm[$i]}" ]]; then return 0 fi done return 1 } + ############################################# + # PRUNE HELPERS (unchanged except matching) # + ############################################# prune_dir() { local root="$1" local skin_raw="$2" local expected="$3" + # Remove unexpected root-level files for f in "$root"/*; do [ -f "$f" ] || continue basename_f="$(basename "$f")" + # Root-level files must exactly match one of the skins if printf '%s\n' "${skins_raw[@]}" | grep -Fxq -- "$basename_f"; then continue fi @@ -69,6 +97,7 @@ runs: rm -f -- "$f" done + # Now prune inside per-skin directories local folder="$root/$skin_raw" [ -d "$folder" ] || return @@ -81,6 +110,9 @@ runs: done } + ################################################ + # DELETE DIRECTORIES THAT ARE NOT VALID SKINS # + ################################################ for root in "$REPO_SCREENSHOT_DIR" "$REPO_RANKING_PANEL_DIR" "$REPO_MOD_ICONS_DIR" "$REPO_THUMBNAIL_DIR" "$OSK_PATH" "$DOC_DIR"; do [ -d "$root" ] || continue for dir in "$root"/*; do @@ -88,16 +120,20 @@ runs: name="$(basename "$dir")" if ! is_known_skin "$name"; then - echo " → Skin '$name' deleted—removing directory $dir" + echo " → Skin '$name' deleted — removing directory $dir" rm -rf -- "$dir" || true fi done done + ################################################ + # FILE PRUNING FOR EACH VALID SKIN # + ################################################ for idx in "${!skins_raw[@]}"; do skin="${skins_raw[$idx]}" header="${skins_clean[$idx]}" + # Try reading Name from skin.ini ini=$(find "$DANSER_SKINS_DIR/$skin" -maxdepth 1 -type f -iname "skin.ini" -print -quit || true) if [[ -f "$ini" ]]; then raw=$(grep -i '^[[:space:]]*Name:' "$ini" | head -n1 || true)