name: "Cleanup Extra Files" description: "Remove leftover or outdated assets from repository" inputs: all_skins: description: "JSON array of all skins" required: true runs: using: "composite" steps: - name: Cleanup Extra Files shell: bash run: | set -euo pipefail echo "[Cleanup Extra Files Started]" all_skins_file="/tmp/all_skins_shared.json" if [ ! -f "$all_skins_file" ]; then echo "Error: $all_skins_file not found" exit 1 fi # Load all skins from JSON readarray -t skins < <(jq -r '.[]' "$all_skins_file") # Remove known stray files [ -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 ############################################################ # 1. Normalization for matching (lenient, consistent) ############################################################ normalize() { printf "%s" "$1" | \ tr '[:upper:]' '[:lower:]' | \ sed 's/[][{}()<>|\/:*?"'"'"' ]/-/g' | \ tr -s '-' | sed 's/^-//; s/-$//' } skins_raw=() skins_norm=() for s in "${skins[@]}"; do skins_raw+=("$s") skins_norm+=("$(normalize "$s")") done ############################################################ # 2. Matching logic — FIXED (no false deletions) ############################################################ is_known_skin() { local name="$1" local norm="$(normalize "$name")" for i in "${!skins_norm[@]}"; do [[ "$norm" == "${skins_norm[$i]}" ]] && return 0 done return 1 } ############################################################ # 3. Pruning helper (unchanged except matching logic) ############################################################ 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 filename must be exactly one of the skins if printf '%s\n' "${skins_raw[@]}" | grep -Fxq -- "$basename_f"; then continue fi echo " → Removing unexpected root file: $f" rm -f -- "$f" done # Now prune inside each skin directory local folder="$root/$skin_raw" [ -d "$folder" ] || return for f in "$folder"/*; do [ -e "$f" ] || continue if [[ "$(basename "$f")" != "$expected" ]]; then echo " → Removing unexpected file: $f" rm -f -- "$f" fi done } ############################################################ # 4. Remove directories for skins that do not exist anymore ############################################################ 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 [ -d "$dir" ] || continue name="$(basename "$dir")" if ! is_known_skin "$name"; then echo " → Skin '$name' deleted — removing $dir" rm -rf -- "$dir" || true fi done done ############################################################ # 5. Expected filenames must use RAW names — FIXED ############################################################ for idx in "${!skins_raw[@]}"; do skin="${skins_raw[$idx]}" # Expected base filename = RAW name (FIX) header="$skin" # Override using skin.ini if available ini=$(find "$DANSER_SKINS_DIR/$skin" -maxdepth 1 -type f -iname "skin.ini" -print -quit || true) if [[ -f "$ini" ]]; then ini_raw=$(grep -i '^[[:space:]]*Name:' "$ini" | head -n1 || true) ini_raw="${ini_raw#*:}" ini_raw="$(echo "$ini_raw" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')" # If INI name is not empty, use it directly as the filename [[ -n "$ini_raw" ]] && header="$ini_raw" fi # Prune directories using expected filenames prune_dir "$REPO_SCREENSHOT_DIR" "$skin" "$header.mp4" prune_dir "$REPO_RANKING_PANEL_DIR" "$skin" "$header.webp" prune_dir "$REPO_MOD_ICONS_DIR" "$skin" "$header.webp" prune_dir "$REPO_THUMBNAIL_DIR" "$skin" "$header.webp" prune_dir "$OSK_PATH" "$skin" "$header.osk" prune_dir "$DOC_DIR" "$skin" "$header.md" done echo "[Cleanup Extra Files Complete]"