پاکسازی فایل‌های i18n و tests غیر ضروری در MediaWiki نسخه ۱.۴۳.۱

از پاپیروس
پرش به ناوبریپرش به جستجو

اسکریپت clean-all.sh

clean-all.sh یک اسکریپت پوسته (Bash) است که برای پاک‌سازی فایل‌های زبانی و تست‌های غیرضروری در پروژهٔ مدیاویکی استفاده می‌شود. این اسکریپت به گونه‌ای طراحی شده که بدون حذف دائمی فایل‌ها، آن‌ها را به یک پوشهٔ آرشیو منتقل کند و امکان بازگردانی کامل را نیز فراهم سازد.

هدف

  • کاهش حجم پروژه و ساده‌سازی بک‌آپ‌گیری
  • نگهداری فقط از زبان‌های مورد نیاز (فارسی، انگلیسی، آلمانی، فرانسوی)
  • انتقال فایل‌های غیرضروری به پوشهٔ move-extra/ به جای حذف کامل

عملیات اصلی

۱. انتقال فایل‌های ترجمه

از مسیرهای زیر، تمام فایل‌های .json که زبان‌شان غیر از en، fa، fr، de باشد منتقل می‌شوند:

  • languages/i18n/
  • languages/i18n/codex/
  • languages/i18n/exif/
  • languages/i18n/preferences/
  • includes/installer/i18n/
  • includes/api/i18n/
  • resources/lib/ooui/i18n/
  • vendor/oojs/oojs-ui/i18n/
  • includes/Rest/i18n/
  • includes/libs/ParamValidator/i18n/
  • extensions/*/i18n/
  • skins/*/i18n/

۲. انتقال فایل‌های پیام PHP

در پوشه languages/messages/ فقط فایل‌های زیر باقی می‌مانند:

  • MessagesEn*.php
  • MessagesFa.php
  • MessagesFr*.php
  • MessagesDe*.php

سایر فایل‌ها منتقل می‌شوند.

۳. انتقال پوشه‌های تست

فایل‌ها و پوشه‌های داخل این مسیرها منتقل می‌شوند:

  • tests/ ← به move-extra/tests/
  • extensions/DiscussionTools/tests/ ← به move-extra/extensions/DiscussionTools/tests/

پارامترهای ورودی

اسکریپت با یکی از پارامترهای زیر اجرا می‌شود:

حالت دستور توضیح
اجرای واقعی ./clean-all.sh فایل‌های غیرمجاز منتقل می‌شوند.
پیش‌نمایش (بدون تغییر) ./clean-all.sh --dry-run فقط نشان می‌دهد که چه کاری قرار است انجام شود.
بازگردانی ./clean-all.sh --undo فایل‌های منتقل‌شده به جای اصلی‌شان بازمی‌گردند.

ساختار انتقال

همه فایل‌ها با حفظ ساختار پوشه‌ای به move-extra/ منتقل می‌شوند. برای مثال:

  • languages/messages/MessagesTr.phpmove-extra/languages/messages/MessagesTr.php
  • tests/test.phpmove-extra/tests/test.php

فایل لاگ

اطلاعات کامل عملیات‌ها در فایل زیر ذخیره می‌شود:

move-extra/cleanup.log

ویژگی‌ها

  • بدون حذف دائمی فایل‌ها
  • قابل بازگردانی کامل
  • پشتیبانی از حالت پیش‌نمایش (dry-run)
  • گزارش کامل در فایل لاگ
  • حفظ ساختار دایرکتوری‌ها در عملیات انتقال

کد کامل اسکریپت clean-all.sh

#!/bin/bash

keep_langs_regex='^(en|fa|fr|de)'
ARCHIVE_DIR="move-extra"
LOG_FILE="$ARCHIVE_DIR/cleanup.log"
MODE="run"

if [[ "$1" == "--dry-run" ]]; then
  MODE="dry-run"
elif [[ "$1" == "--undo" ]]; then
  MODE="undo"
fi

mkdir -p "$ARCHIVE_DIR"
echo "🗓️  Log started at $(date)" > "$LOG_FILE"
echo "🛠️  Mode: $MODE" >> "$LOG_FILE"
echo >> "$LOG_FILE"

log_action() {
  echo "$1"
  echo "$1" >> "$LOG_FILE"
}

move_file() {
  src="$1"
  dest="$ARCHIVE_DIR/$src"
  if [[ "$MODE" == "dry-run" ]]; then
    log_action "[DRY-RUN] Would move: $src$dest"
  else
    mkdir -p "$(dirname "$dest")"
    mv "$src" "$dest" && log_action "[MOVED] $src$dest"
  fi
}

restore_file() {
  moved="$1"
  original="${moved#$ARCHIVE_DIR/}"
  if [[ "$MODE" == "dry-run" ]]; then
    log_action "[DRY-RUN] Would restore: $moved$original"
  else
    mkdir -p "$(dirname "$original")"
    mv "$moved" "$original" && log_action "[RESTORED] $moved$original"
  fi
}

if [[ "$MODE" == "undo" ]]; then
  echo "↩️  Restoring files from $ARCHIVE_DIR ..."
  find "$ARCHIVE_DIR" -type f | while read -r file; do
    restore_file "$file"
  done

  if [[ -d "$ARCHIVE_DIR/tests" ]]; then
    echo "↩️  Restoring tests/ from $ARCHIVE_DIR/tests/ ..."
    shopt -s dotglob
    for f in "$ARCHIVE_DIR/tests/"*; do
      restore_file "$f"
    done
    shopt -u dotglob
  fi

  dt_path="extensions/DiscussionTools/tests"
  if [[ -d "$ARCHIVE_DIR/$dt_path" ]]; then
    echo "↩️  Restoring $dt_path/ from $ARCHIVE_DIR/$dt_path/ ..."
    shopt -s dotglob
    for f in "$ARCHIVE_DIR/$dt_path/"*; do
      restore_file "$f"
    done
    shopt -u dotglob
  fi

  echo "✅ Undo complete. Log saved to $LOG_FILE"
  exit 0
fi

paths=(
  "languages/i18n/"
  "languages/messages/"
  "languages/i18n/codex/"
  "languages/i18n/exif/"
  "languages/i18n/preferences/"
  "includes/installer/i18n/"
  "includes/api/i18n/"
  "resources/lib/ooui/i18n/"
  "vendor/oojs/oojs-ui/i18n/"
  "includes/Rest/i18n/"
  "includes/libs/ParamValidator/i18n/"
)

for path in "${paths[@]}"; do
  if [[ -d "$path" ]]; then
    echo "🔍 Scanning $path ..."
    find "$path" -maxdepth 1 -type f | while read -r file; do
      fname=$(basename "$file")
      if [[ "$path" == "languages/messages/" ]]; then
        case "$fname" in
          MessagesEn*.php|MessagesFa.php|MessagesFr*.php|MessagesDe*.php)
            # keep
            ;;
          *)
            move_file "$file"
            ;;
        esac
      else
        if [[ ! "$fname" =~ ^$keep_langs_regex.*\.json$ ]]; then
          move_file "$file"
        fi
      fi
    done
  fi
done

echo "🔍 Scanning extensions ..."
find extensions/ -type f -path "*/i18n/*.json" | while read -r file; do
  fname=$(basename "$file")
  if [[ ! "$fname" =~ ^$keep_langs_regex.*\.json$ ]]; then
    move_file "$file"
  fi
done

echo "🔍 Scanning skins ..."
find skins/ -type f -path "*/i18n/*.json" | while read -r file; do
  fname=$(basename "$file")
  if [[ ! "$fname" =~ ^$keep_langs_regex.*\.json$ ]]; then
    move_file "$file"
  fi
done

if [[ -d tests ]]; then
  echo "📦 Moving contents of tests/ to move-extra/tests/ ..."
  mkdir -p "$ARCHIVE_DIR/tests"
  shopt -s dotglob
  for f in tests/*; do
    if [[ "$MODE" == "dry-run" ]]; then
      log_action "[DRY-RUN] Would move: $f$ARCHIVE_DIR/tests/"
    else
      mv "$f" "$ARCHIVE_DIR/tests/" && log_action "[MOVED] $f$ARCHIVE_DIR/tests/"
    fi
  done
  shopt -u dotglob
fi

dt_path="extensions/DiscussionTools/tests"
if [[ -d "$dt_path" ]]; then
  echo "📦 Moving contents of $dt_path/ to $ARCHIVE_DIR/$dt_path/ ..."
  mkdir -p "$ARCHIVE_DIR/$dt_path"
  shopt -s dotglob
  for f in "$dt_path"/*; do
    if [[ "$MODE" == "dry-run" ]]; then
      log_action "[DRY-RUN] Would move: $f$ARCHIVE_DIR/$dt_path/"
    else
      mv "$f" "$ARCHIVE_DIR/$dt_path/" && log_action "[MOVED] $f$ARCHIVE_DIR/$dt_path/"
    fi
  done
  shopt -u dotglob
fi

echo "✅ Cleanup complete! Log saved to $LOG_FILE"