پاکسازی فایلهای 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*.phpMessagesFa.phpMessagesFr*.phpMessagesDe*.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.php←move-extra/languages/messages/MessagesTr.phptests/test.php←move-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"