File size: 8,541 Bytes
a72d1cf | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 | #!/usr/bin/env bash
# Tablo2SQL-TR başlatıcı — Linux ve macOS
# bash baslat.sh : denetle, eksikleri kur, arayüzü aç
# bash baslat.sh --kontrol : yalnızca denetle
# bash baslat.sh --kisayol : masaüstü kısayolu oluştur
# bash baslat.sh --sifirla : sanal ortamı (.venv) silip yeniden kur
set -u
# ---- proje klasörüne geç (sembolik bağlantıları çöz)
SRC="${BASH_SOURCE[0]}"
while [ -L "$SRC" ]; do
DIR="$(cd -P "$(dirname "$SRC")" && pwd)"; SRC="$(readlink "$SRC")"
[[ "$SRC" != /* ]] && SRC="$DIR/$SRC"
done
ROOT="$(cd -P "$(dirname "$SRC")" && pwd)"
cd "$ROOT" || exit 1
OS="$(uname -s)"
MIN_MINOR=10
PY_VER_WANTED="3.12"
VENV="$ROOT/.venv"
VPY="$VENV/bin/python"
if [ -t 1 ]; then B=$'\e[1m'; G=$'\e[32m'; Y=$'\e[33m'; R=$'\e[31m'; C=$'\e[36m'; N=$'\e[0m'; else B=""; G=""; Y=""; R=""; C=""; N=""; fi
ok() { echo " ${G}[TAMAM]${N} $*"; }
warn() { echo " ${Y}[UYARI]${N} $*"; }
err() { echo " ${R}[HATA]${N} $*"; }
info() { echo " ${C}[BİLGİ]${N} $*"; }
ask() { # ask "soru" -> 0 evet / 1 hayır (etkileşimsizse hayır)
[ -t 0 ] || return 1
local a; read -r -p " $1 [E/h] " a
case "${a:-e}" in [eEyY]*) return 0 ;; *) return 1 ;; esac
}
pause_on_error() {
local code=$1
if [ "$code" -ne 0 ] && [ -t 0 ]; then
echo; read -r -p " Bir sorun oluştu. Pencereyi kapatmak için Enter'a basın… " _
fi
exit "$code"
}
echo
echo "${B} ═══ Tablo2SQL-TR başlatıcı (${OS}) ═══${N}"
# ---- argümanlar
RESET=0; ARGS=()
for a in "$@"; do
case "$a" in
--sifirla) RESET=1 ;;
*) ARGS+=("$a") ;;
esac
done
# ======================================================================= Python bul
py_ok() { # $1 = yorumlayıcı; uygun sürümse 0
"$1" -c "import sys; sys.exit(0 if sys.version_info >= (3, $MIN_MINOR) else 1)" >/dev/null 2>&1
}
find_python() {
local cands=()
cands+=(python3.13 python3.12 python3.11 python3.10)
if [ "$OS" = "Darwin" ]; then
cands+=(/opt/homebrew/bin/python3 /usr/local/bin/python3)
for f in /Library/Frameworks/Python.framework/Versions/3.*/bin/python3; do [ -x "$f" ] && cands+=("$f"); done
# /usr/bin/python3 Xcode araçları yoksa kurulum penceresi açar; yalnızca araçlar kuruluysa dene
xcode-select -p >/dev/null 2>&1 && cands+=(/usr/bin/python3)
else
cands+=(python3)
fi
cands+=("$HOME/.local/bin/python3.12")
for p in "${cands[@]}"; do
if command -v "$p" >/dev/null 2>&1 || [ -x "$p" ]; then
local full; full="$(command -v "$p" 2>/dev/null || echo "$p")"
if py_ok "$full"; then echo "$full"; return 0; fi
fi
done
# uv ile kurulmuş bağımsız Python
if command -v uv >/dev/null 2>&1 || [ -x "$HOME/.local/bin/uv" ]; then
local UVB; UVB="$(command -v uv 2>/dev/null || echo "$HOME/.local/bin/uv")"
local up; up="$("$UVB" python find "$PY_VER_WANTED" 2>/dev/null)"
[ -n "$up" ] && py_ok "$up" && { echo "$up"; return 0; }
fi
return 1
}
install_with_uv() {
info "uv (yönetici izni gerektirmeyen Python yöneticisi) ile Python $PY_VER_WANTED kuruluyor…"
if ! command -v uv >/dev/null 2>&1 && [ ! -x "$HOME/.local/bin/uv" ]; then
if command -v curl >/dev/null 2>&1; then curl -LsSf https://astral.sh/uv/install.sh | sh
elif command -v wget >/dev/null 2>&1; then wget -qO- https://astral.sh/uv/install.sh | sh
else err "curl veya wget bulunamadı."; return 1; fi
fi
local UVB; UVB="$(command -v uv 2>/dev/null || echo "$HOME/.local/bin/uv")"
"$UVB" python install "$PY_VER_WANTED"
}
install_python() {
warn "Python 3.$MIN_MINOR veya daha yenisi bulunamadı."
if [ "$OS" = "Darwin" ]; then
if command -v brew >/dev/null 2>&1; then
if ask "Homebrew ile python@$PY_VER_WANTED kurulsun mu?"; then brew install "python@$PY_VER_WANTED" && return 0; fi
fi
if ask "Yönetici izni olmadan uv ile Python $PY_VER_WANTED kurulsun mu? (önerilir)"; then install_with_uv && return 0; fi
if ask "Resmî python.org kurulum paketi indirilip açılsın mı?"; then
local PKG="/tmp/python-3.12.10-macos11.pkg"
curl -fL -o "$PKG" "https://www.python.org/ftp/python/3.12.10/python-3.12.10-macos11.pkg" && open "$PKG"
info "Kurulum sihirbazını tamamladıktan sonra bu başlatıcıyı yeniden çalıştırın."
pause_on_error 1
fi
err "Python kurulmadı. Seçenekler:"
echo " • https://www.python.org/downloads/macos/ adresinden Python $PY_VER_WANTED"
echo " • Homebrew: /bin/bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\" && brew install python@$PY_VER_WANTED"
return 1
fi
# Linux: dağıtım paket yöneticisi
local cmd=""
if command -v apt-get >/dev/null 2>&1; then cmd="sudo apt-get update && sudo apt-get install -y python3 python3-venv python3-pip"
elif command -v dnf >/dev/null 2>&1; then cmd="sudo dnf install -y python3 python3-pip"
elif command -v pacman >/dev/null 2>&1; then cmd="sudo pacman -S --needed --noconfirm python python-pip"
elif command -v zypper >/dev/null 2>&1; then cmd="sudo zypper install -y python312 python312-pip"
elif command -v apk >/dev/null 2>&1; then cmd="sudo apk add python3 py3-pip"
fi
if [ -n "$cmd" ] && ask "Sistem paket yöneticisiyle kurulsun mu? ($cmd)"; then
bash -c "$cmd" && find_python >/dev/null && return 0
warn "Dağıtımın Python sürümü yetersiz veya kurulum başarısız."
fi
if ask "Yönetici izni olmadan uv ile Python $PY_VER_WANTED kurulsun mu? (önerilir)"; then install_with_uv && return 0; fi
err "Python kurulmadı. Elle kurulum: dağıtımınızın paket yöneticisi ile python3 (≥3.$MIN_MINOR), python3-venv ve"
echo " python3-pip paketlerini kurun ya da: curl -LsSf https://astral.sh/uv/install.sh | sh && uv python install $PY_VER_WANTED"
return 1
}
# ======================================================================= ana akış
echo
echo "${B}0) Ön koşullar${N}"
PY="$(find_python)"
if [ -z "$PY" ]; then
install_python || pause_on_error 1
hash -r
PY="$(find_python)"
[ -z "$PY" ] && { err "Kurulumdan sonra Python bulunamadı; terminali kapatıp yeniden açın."; pause_on_error 1; }
fi
ok "Python: $PY ($("$PY" -c 'import platform; print(platform.python_version())'))"
# yalnızca kısayol isteniyorsa sanal ortam gerekmez
if [ "${ARGS[0]:-}" = "--kisayol" ]; then
"$PY" "$ROOT/scripts/kisayol.py"; pause_on_error $?
fi
# ---- sanal ortam
if [ "$RESET" -eq 1 ] && [ -d "$VENV" ]; then info "Sanal ortam siliniyor…"; rm -rf "$VENV"; fi
if [ -d "$VENV" ] && ! "$VPY" -c "import sys" >/dev/null 2>&1; then
warn "Mevcut .venv bozuk (klasör taşınmış veya Python güncellenmiş olabilir); yeniden oluşturuluyor."
rm -rf "$VENV"
fi
if [ ! -d "$VENV" ]; then
info "Sanal ortam oluşturuluyor (.venv)…"
if ! "$PY" -m venv "$VENV" 2>/tmp/t2s_venv_err.txt; then
rm -rf "$VENV"
warn "venv modülü eksik: $(tail -1 /tmp/t2s_venv_err.txt)"
MINOR="$("$PY" -c 'import sys; print(f"{sys.version_info[0]}.{sys.version_info[1]}")')"
if command -v apt-get >/dev/null 2>&1 && ask "python$MINOR-venv paketi kurulsun mu? (sudo)"; then
sudo apt-get install -y "python$MINOR-venv" python3-venv
"$PY" -m venv "$VENV" || { rm -rf "$VENV"; }
fi
if [ ! -d "$VENV" ] && { command -v uv >/dev/null 2>&1 || [ -x "$HOME/.local/bin/uv" ]; }; then
UVB="$(command -v uv 2>/dev/null || echo "$HOME/.local/bin/uv")"
"$UVB" venv --seed --python "$PY" "$VENV"
fi
[ -d "$VENV" ] || { err "Sanal ortam oluşturulamadı. Debian/Ubuntu: sudo apt install python3-venv"; pause_on_error 1; }
fi
ok "Sanal ortam hazır."
else
ok "Sanal ortam mevcut."
fi
# ---- paketler (requirements.txt değiştiyse yeniden kur)
HASH_FILE="$VENV/.req_hash"
NEW_HASH="$("$VPY" -c "import hashlib; print(hashlib.sha256(open('requirements.txt','rb').read()).hexdigest())")"
if [ ! -f "$HASH_FILE" ] || [ "$(cat "$HASH_FILE")" != "$NEW_HASH" ]; then
info "Python paketleri kuruluyor (ilk kurulum birkaç dakika sürebilir)…"
"$VPY" -m pip install --disable-pip-version-check -q --upgrade pip >/dev/null 2>&1
if "$VPY" -m pip install --disable-pip-version-check -r requirements.txt; then
echo "$NEW_HASH" > "$HASH_FILE"; ok "Paketler kuruldu."
else
err "Paket kurulumu başarısız. İnternet bağlantısını kontrol edin; sorun sürerse: bash baslat.sh --sifirla"
pause_on_error 1
fi
fi
# ---- ortak başlatıcı
"$VPY" "$ROOT/scripts/baslat.py" "${ARGS[@]+"${ARGS[@]}"}"
pause_on_error $?
|