diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 98ecabf..57e1497 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -126,8 +126,8 @@ jobs: echo "[Cleaning Skin Names]" uniq_skins=() for skin in "${skins[@]}"; do - skin="${skin#"${skin%%[![:space:]]*}"}" # Trim leading whitespace - skin="${skin%"${skin##*[![:space:]]}"}" # Trim trailing whitespace + skin="${skin#"${skin%%[![:space:]]*}"}" + skin="${skin%"${skin##*[![:space:]]}"}" if [ -n "$skin" ]; then uniq_skins+=("$skin") fi @@ -260,69 +260,70 @@ jobs: - name: Rename Generated Assets Based on skin.ini shell: bash run: | + set -euo pipefail + echo "[Asset Renaming Started]" - if [ -z "${CHANGED_SKINS_FILE:-}" ] || [ ! -s "$CHANGED_SKINS_FILE" ]; then - echo "No skins changed. Skipping asset renaming." - exit 0 - fi - - sanitize_filename() { - echo "$1" | \ - sed -e 's#[\\/:\*\?"<>|]#-#g' -e 's#%#_#g' | \ - tr -s ' ' | \ - sed 's/^ *//;s/ *$//' - } - - mapfile -t changed_skins < "$CHANGED_SKINS_FILE" skin_dirs=() - for skin in "${changed_skins[@]}"; do - [ -d "$DANSER_SKINS_DIR/$skin" ] && skin_dirs+=("$DANSER_SKINS_DIR/$skin/") - done + + if [ -n "${CHANGED_SKINS_FILE:-}" ] && [ -s "$CHANGED_SKINS_FILE" ]; then + echo "→ Using changed skins only." + while IFS= read -r skin || [[ -n "$skin" ]]; do + skin="$(echo "$skin" | tr -d '\r' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')" + [ -z "$skin" ] && continue + dir="$DANSER_SKINS_DIR/$skin" + [ -d "$dir" ] && skin_dirs+=("$dir") + done < "$CHANGED_SKINS_FILE" + else + echo "→ No changed skins file or empty file, using all skin directories." + while IFS= read -r dir; do + [ -d "$dir" ] && skin_dirs+=("$dir") + done < <(find "$DANSER_SKINS_DIR" -mindepth 1 -maxdepth 1 -type d | sort) + fi SKIN_COUNT=${#skin_dirs[@]} INDEX=1 - if [ "$SKIN_COUNT" -eq 0 ]; then - echo "No valid skin directories to process. Skipping." - exit 0 - fi + sanitize_filename() { + echo "$1" \ + | sed -e 's#[\\/:\*\?"<>|]#-#g' -e 's#%#_#g' \ + | tr -s ' ' \ + | sed 's/^ *//;s/ *$//' + } for skin_path in "${skin_dirs[@]}"; do [ -d "$skin_path" ] || continue - SKIN_NAME=$(basename "$skin_path") - - echo "" - echo "[$INDEX/$SKIN_COUNT] Skin: $SKIN_NAME" + SKIN_NAME=$(basename "$skin_path" \ + | tr -d '\r\n' \ + | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') + echo "Processing skin $INDEX/$SKIN_COUNT: $SKIN_NAME" + ini_file=$(find "$skin_path" -maxdepth 1 -iname "skin.ini" | head -n1 || true) skin_header="$SKIN_NAME" - - if ini_file=$(find "$skin_path" -maxdepth 1 -iname "skin.ini" | head -n 1); then - if [ -f "$ini_file" ]; then - name_line=$(grep -i '^[[:space:]]*name:' "$ini_file" | head -n 1) - if [ -n "$name_line" ]; then - new_name=$(echo "$name_line" | cut -d ':' -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') - new_name=$(sanitize_filename "$new_name") - [ -n "$new_name" ] && skin_header="$new_name" - fi + if [ -f "$ini_file" ]; then + name_line=$(grep -i '^[[:space:]]*name:' "$ini_file" | head -n1 || true) + if [ -n "$name_line" ]; then + new_name=$(echo "$name_line" | cut -d':' -f2- \ + | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') + new_name=$(sanitize_filename "$new_name") + [ -n "$new_name" ] && skin_header="$new_name" fi fi - if [ -f "$REPO_SCREENSHOT_DIR/$SKIN_NAME.gif" ] && [ "$SKIN_NAME" != "$skin_header" ]; then - mv -f "$REPO_SCREENSHOT_DIR/$SKIN_NAME.gif" "$REPO_SCREENSHOT_DIR/$skin_header.gif" + if [ -f "$REPO_SCREENSHOT_DIR/$SKIN_NAME.gif" ] \ + && [ "$SKIN_NAME" != "$skin_header" ]; then + mv -f "$REPO_SCREENSHOT_DIR/$SKIN_NAME.gif" \ + "$REPO_SCREENSHOT_DIR/$skin_header.gif" || true echo " ✓ Renamed GIF" - else - echo " → No GIF to rename or already named correctly" fi - if [ -f "$REPO_RANKING_PANEL_DIR/$SKIN_NAME.png" ] && [ "$SKIN_NAME" != "$skin_header" ]; then - mv -f "$REPO_RANKING_PANEL_DIR/$SKIN_NAME.png" "$REPO_RANKING_PANEL_DIR/$skin_header.png" - echo " ✓ Renamed Screenshot" - else - echo " → No Screenshot to rename or already named correctly" + if [ -f "$REPO_RANKING_PANEL_DIR/$SKIN_NAME.png" ] \ + && [ "$SKIN_NAME" != "$skin_header" ]; then + mv -f "$REPO_RANKING_PANEL_DIR/$SKIN_NAME.png" \ + "$REPO_RANKING_PANEL_DIR/$skin_header.png" || true + echo " ✓ Renamed PNG" fi - echo " ✓ Completed" INDEX=$((INDEX + 1)) done @@ -332,18 +333,32 @@ jobs: - name: Generate Mod Icons shell: bash run: | + set -euo pipefail + echo "[Mod Icon Generation Started]" sanitize_filename() { - echo "$1" | \ - sed -e 's#[\\/:\*\?"<>|]#-#g' -e 's#%#_#g' | \ - tr -s ' ' | \ - sed 's/^ *//;s/ *$//' + echo "$1" \ + | sed -e 's#[\\/:\*\?"<>|]#-#g' -e 's#%#_#g' \ + | tr -s ' ' \ + | sed 's/^ *//;s/ *$//' } - if [ -z "$CHANGED_SKINS_FILE" ] || [ ! -s "$CHANGED_SKINS_FILE" ]; then - echo "No skins changed. Skipping mod icon generation." - exit 0 + skin_dirs=() + + if [ -n "${CHANGED_SKINS_FILE:-}" ] && [ -s "$CHANGED_SKINS_FILE" ]; then + echo "→ Using changed skins only." + while IFS= read -r skin || [[ -n "$skin" ]]; do + skin="$(echo "$skin" | tr -d '\r' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')" + [ -z "$skin" ] && continue + dir="$DANSER_SKINS_DIR/$skin" + [ -d "$dir" ] && skin_dirs+=("$dir") + done < "$CHANGED_SKINS_FILE" + else + echo "→ No changed skins file or empty file, using all skin directories." + while IFS= read -r dir; do + [ -d "$dir" ] && skin_dirs+=("$dir") + done < <(find "$DANSER_SKINS_DIR" -mindepth 1 -maxdepth 1 -type d | sort) fi ICONS_JSON_FILE="${{ github.workspace }}/.gitea/workflows/icons.json" @@ -351,28 +366,23 @@ jobs: group2_icons=$(jq -r '.group2 | join(" ")' "$ICONS_JSON_FILE") group3_icons=$(jq -r '.group3 | join(" ")' "$ICONS_JSON_FILE") - mapfile -t skins < "$CHANGED_SKINS_FILE" - BLANK_IMAGE="blank.png" magick -size "160x160" xc:none "$BLANK_IMAGE" - SKIN_COUNT=${#skins[@]} + SKIN_COUNT=${#skin_dirs[@]} INDEX=1 - for skin_path in "${skins[@]}"; do - [ -z "$skin_path" ] && continue - SKIN_DIR="$DANSER_SKINS_DIR/$skin_path" + for SKIN_DIR in "${skin_dirs[@]}"; do [ -d "$SKIN_DIR" ] || continue + skin_header=$(basename "$SKIN_DIR" | tr -d '\r\n' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') - skin_header=$(basename "$SKIN_DIR") - if ini_file=$(find "$SKIN_DIR" -maxdepth 1 -iname "skin.ini" | head -n 1); then - if [ -f "$ini_file" ]; then - name_line=$(grep -i '^[[:space:]]*name:' "$ini_file" | head -n 1) - if [ -n "$name_line" ]; then - new_name=$(echo "$name_line" | cut -d ':' -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') - new_name=$(sanitize_filename "$new_name") - [ -n "$new_name" ] && skin_header="$new_name" - fi + ini_file=$(find "$SKIN_DIR" -maxdepth 1 -iname "skin.ini" | head -n 1 || true) + if [ -f "$ini_file" ]; then + name_line=$(grep -i '^[[:space:]]*name:' "$ini_file" | head -n 1 || true) + if [ -n "$name_line" ]; then + new_name=$(echo "$name_line" | cut -d ':' -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') + new_name=$(sanitize_filename "$new_name") + [ -n "$new_name" ] && skin_header="$new_name" fi fi @@ -416,54 +426,60 @@ jobs: echo "" echo "[Mod Icon Generation Finished — $SKIN_COUNT skins processed]" - - name: Create OSK files shell: bash run: | + set -euo pipefail + echo "[OSK Creation Job Started]" sanitize_filename() { - echo "$1" | \ - sed -e 's#[\\/:\*\?"<>|]#-#g' -e 's#%#_#g' | \ - tr -s ' ' | \ - sed 's/^ *//;s/ *$//' + echo "$1" \ + | sed -e 's#[\\/:\*\?"<>|]#-#g' -e 's#%#_#g' \ + | tr -s ' ' \ + | sed 's/^ *//;s/ *$//' } - if [ -z "${CHANGED_SKINS_FILE:-}" ] || [ ! -s "$CHANGED_SKINS_FILE" ]; then - echo "No skins to process. Skipping OSK file generation." - exit 0 + skin_dirs=() + + if [ -n "${CHANGED_SKINS_FILE:-}" ] && [ -s "$CHANGED_SKINS_FILE" ]; then + echo "→ Using changed skins only." + while IFS= read -r skin || [[ -n "$skin" ]]; do + skin="$(echo "$skin" | tr -d '\r' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')" + [ -z "$skin" ] && continue + dir="$DANSER_SKINS_DIR/$skin" + [ -d "$dir" ] && skin_dirs+=("$dir") + done < "$CHANGED_SKINS_FILE" + else + echo "→ No changed skins file or empty file, using all skin directories." + while IFS= read -r dir; do + [ -d "$dir" ] && skin_dirs+=("$dir") + done < <(find "$DANSER_SKINS_DIR" -mindepth 1 -maxdepth 1 -type d | sort) fi - mapfile -t skins < "$CHANGED_SKINS_FILE" - FIXED_TIMESTAMP="2025-01-01 00:00:00" - - SKIN_COUNT=${#skins[@]} + SKIN_COUNT=${#skin_dirs[@]} INDEX=1 - for skin_path in "${skins[@]}"; do - SKIN_DIR="$DANSER_SKINS_DIR/$skin_path" + for SKIN_DIR in "${skin_dirs[@]}"; do [ -d "$SKIN_DIR" ] || continue - skin_header="$skin_path" - if ini_file=$(find "$SKIN_DIR" -maxdepth 1 -iname "skin.ini" | head -n 1); then - if [ -f "$ini_file" ]; then - name_line=$(grep -i '^[[:space:]]*name:' "$ini_file" | head -n 1) - if [ -n "$name_line" ]; then - new_name=$(echo "$name_line" | cut -d ':' -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') - new_name=$(sanitize_filename "$new_name") - [ -n "$new_name" ] && skin_header="$new_name" - fi + skin_header=$(basename "$SKIN_DIR" | tr -d '\r\n' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') + + ini_file=$(find "$SKIN_DIR" -maxdepth 1 -iname "skin.ini" | head -n 1 || true) + if [ -f "$ini_file" ]; then + name_line=$(grep -i '^[[:space:]]*name:' "$ini_file" | head -n 1 || true) + if [ -n "$name_line" ]; then + new_name=$(echo "$name_line" | cut -d ':' -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') + new_name=$(sanitize_filename "$new_name") + [ -n "$new_name" ] && skin_header="$new_name" fi fi - skin_header=$(printf '%s' "$skin_header" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') - echo "" echo "[$INDEX/$SKIN_COUNT] Processing skin: $skin_header" (cd "$SKIN_DIR" && find . -type f -exec touch -d "$FIXED_TIMESTAMP" {} +) - (cd "$SKIN_DIR" && find . -type f | sort | zip -rq -D -X -9 --compression-method deflate "$OSK_PATH/${skin_header}.osk" -@) echo " ✓ OSK file created successfully."