forked from simonaszilinskas/albert-code
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathalbert-code.sh
More file actions
executable file
·131 lines (120 loc) · 4.77 KB
/
albert-code.sh
File metadata and controls
executable file
·131 lines (120 loc) · 4.77 KB
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
#!/bin/bash
#
# albert-code.sh - Lanceur principal (Linux / Mac).
#
# Ce script est le point d'entree pour lancer albert-code depuis
# le terminal en utilisant un venv Python local (sans uv).
# Il gere automatiquement l'environnement virtuel :
# 1. Au premier lancement : cree le venv et installe le projet.
# 2. Aux lancements suivants : active le venv existant.
# 3. Lance albert-code avec les arguments transmis.
#
# Usage :
# ./albert-code.sh -> lance albert-code dans le repertoire courant
# ./albert-code.sh --help -> affiche l'aide d'albert-code
# ./albert-code.sh --install -> installe le lien ~/.local/bin/albert-code
# (commande disponible globalement, cwd preserve)
# ./albert-code.sh --uninstall -> retire le lien ~/.local/bin/albert-code
#
# Inspire de albert-cli/albert-cli.sh.
#
# Projet : albert-code
# Licence : Apache-2.0
#
set -euo pipefail
# Dossier du script. On resout les liens symboliques manuellement pour que
# `--install` (qui place un symlink dans ~/.local/bin/albert-code) ne fasse
# pas pointer SCRIPT_DIR vers ~/.local/bin. La boucle est portable BSD/Linux,
# contrairement a `readlink -f` qui n'existe pas sur macOS par defaut.
SOURCE="${BASH_SOURCE[0]}"
while [ -L "$SOURCE" ]; do
SOURCE_DIR="$(cd "$(dirname "$SOURCE")" && pwd)"
SOURCE="$(readlink "$SOURCE")"
case "$SOURCE" in
/*) ;; # absolute already
*) SOURCE="$SOURCE_DIR/$SOURCE" ;;
esac
done
SCRIPT_DIR="$(cd "$(dirname "$SOURCE")" && pwd)"
VENV_DIR="$SCRIPT_DIR/.venv"
PYTHON_BIN="${PYTHON_BIN:-python3}"
SYMLINK_PATH="$HOME/.local/bin/albert-code"
# ---- Sous-commandes d'installation / desinstallation du lien global ----
case "${1:-}" in
--install)
mkdir -p "$(dirname "$SYMLINK_PATH")"
ln -sf "$SCRIPT_DIR/albert-code.sh" "$SYMLINK_PATH"
echo "Lien cree : $SYMLINK_PATH -> $SCRIPT_DIR/albert-code.sh"
case ":$PATH:" in
*":$HOME/.local/bin:"*)
echo "OK : ~/.local/bin est deja dans le PATH."
;;
*)
echo
echo "Note : ~/.local/bin n'est pas dans ton PATH."
echo "Ajoute la ligne suivante a ton ~/.bashrc ou ~/.zshrc :"
echo " export PATH=\"\$HOME/.local/bin:\$PATH\""
echo "Puis ouvre un nouveau terminal."
;;
esac
echo
echo "Tu peux maintenant lancer 'albert-code' depuis n'importe quel dossier."
echo "Le repertoire courant est utilise comme dossier de travail."
exit 0
;;
--uninstall)
if [ -L "$SYMLINK_PATH" ] || [ -e "$SYMLINK_PATH" ]; then
rm -f "$SYMLINK_PATH"
echo "Lien supprime : $SYMLINK_PATH"
else
echo "Aucun lien trouve a $SYMLINK_PATH (deja desinstalle)."
fi
exit 0
;;
esac
# Verifier que python3 est disponible
if ! command -v "$PYTHON_BIN" >/dev/null 2>&1; then
echo "Erreur : $PYTHON_BIN introuvable. Installe Python 3.12+ avant de continuer." >&2
exit 1
fi
# Verifier la version de Python (>= 3.12)
PYTHON_VERSION="$("$PYTHON_BIN" -c 'import sys; print(f"{sys.version_info[0]}.{sys.version_info[1]}")')"
PYTHON_MAJOR="${PYTHON_VERSION%%.*}"
PYTHON_MINOR="${PYTHON_VERSION##*.}"
if [ "$PYTHON_MAJOR" -lt 3 ] || { [ "$PYTHON_MAJOR" -eq 3 ] && [ "$PYTHON_MINOR" -lt 12 ]; }; then
echo "Erreur : albert-code requiert Python 3.12 ou superieur (detecte : $PYTHON_VERSION)." >&2
exit 1
fi
# Creer le venv s'il n'existe pas (premier lancement uniquement)
if [ ! -d "$VENV_DIR" ]; then
echo "Creation de l'environnement virtuel ($VENV_DIR)..."
"$PYTHON_BIN" -m venv "$VENV_DIR"
fi
# shellcheck disable=SC1091
source "$VENV_DIR/bin/activate"
# Determiner s'il faut (re)installer le projet :
# - entry point absent (premier lancement)
# - pyproject.toml modifie depuis la derniere install (suivi via hash)
PYPROJECT="$SCRIPT_DIR/pyproject.toml"
INSTALL_MARKER="$VENV_DIR/.albert-code-install-hash"
NEEDS_INSTALL=0
if ! command -v albert-code >/dev/null 2>&1; then
NEEDS_INSTALL=1
elif [ -f "$PYPROJECT" ]; then
CURRENT_HASH="$(sha256sum "$PYPROJECT" | awk '{print $1}')"
if [ ! -f "$INSTALL_MARKER" ] || [ "$(cat "$INSTALL_MARKER")" != "$CURRENT_HASH" ]; then
NEEDS_INSTALL=1
fi
fi
if [ "$NEEDS_INSTALL" -eq 1 ]; then
echo "Installation des dependances et du projet (mode editable)..."
pip install --upgrade --disable-pip-version-check pip >/dev/null
pip install --disable-pip-version-check -e "$SCRIPT_DIR"
if [ -f "$PYPROJECT" ]; then
sha256sum "$PYPROJECT" | awk '{print $1}' > "$INSTALL_MARKER"
fi
echo "Lancement de albert-code, veuillez patienter..."
echo
fi
# Lancer albert-code -- "$@" transmet tous les arguments passes au script
exec albert-code "$@"