From e30ee21c12e453535e52ef08b2872a3a5ee46d63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9drix?= Date: Sun, 17 May 2026 21:13:51 +0200 Subject: [PATCH] =?UTF-8?q?refactor:=20install.sh=20=E2=80=94=208=20correc?= =?UTF-8?q?tions=20qualit=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - log_dir créé avant tout appel à log() (mkdir -p immédiat) - mapfile remplace cat + for non-quoté (word-splitting sur noms de fichiers) - $destination (locale) remplace $destination_dir (globale) dans le message final - source ~/.bashrc supprimé (sans effet dans un sous-shell) - create_dir retiré des blocs appelants (déjà appelé dans process_deployment_files) - purge_old_logs : deux find fusionnés en un seul pattern asl-*.log - blocs répétitifs remplacés par des tableaux parallèles + boucle Co-Authored-By: Claude Sonnet 4.6 --- install.sh | 260 +++++++++++++++-------------------------------------- 1 file changed, 71 insertions(+), 189 deletions(-) diff --git a/install.sh b/install.sh index 69c5e09..1c675dd 100755 --- a/install.sh +++ b/install.sh @@ -2,28 +2,13 @@ # Script Bash - install.sh # Auteur : Cédric Abonnel +# Description : Script d'installation des exécutables dans le répertoire '~/.local' -# Description : Script d'installation des exécutables dans le répertoire '~/.local'" - -# Version 07.07.24 -# - Ajout du traitement de share/ytdll et share/ytdll/lib - -# Version 23.12.1.3 -# - Amélioration des logs -# - process_deployment_files optmisie les opérations de déployement - -# Version 23.12.1.2 -# - Fonctionnalité de purge des logs ajoutée. - -# Version 23.12.1.1 -# - Messages des logs améliorés avec plus de détail avec 'cp'. - - -# Spécifier le chemin du fichier journal +# Point 3 : log_dir créé immédiatement, avant tout appel à log() log_dir="${XDG_STATE_HOME:-$HOME/.local/state}/scripts-bash" +mkdir -p "$log_dir" log_file="${log_dir}/a5l-scripts_bash-$(date '+%Y%m%d-%H%M%S')-$$.log" -# Fonction pour afficher un message d'erreur et quitter le script en cas d'erreur error() { local error_message="$1" log "ERREUR: $error_message" @@ -31,46 +16,35 @@ error() { exit 1 } -# Fonction pour enregistrer les messages de journal log() { if [ -n "$1" ]; then - echo "$(date '+%Y-%m-%d %H:%M:%S') - $$ - $1" >> "$log_file" - echo "$1" + echo "$(date '+%Y-%m-%d %H:%M:%S') - $$ - $1" >> "$log_file" + echo "$1" fi } create_dir() { - # S'assurer que le répertoire de destination existe, sinon, le créer log "Tentative de création du dossier $1" if [ ! -d "$1" ]; then - mkdir -p "$1" || error "Impossible de créer le répertoire $1" - log " _ Le répertoire $1 a été créé." + mkdir -p "$1" || error "Impossible de créer le répertoire $1" + log " _ Le répertoire $1 a été créé." else - log " _ Le répertoire $1 existe déjà." + log " _ Le répertoire $1 existe déjà." fi - } - add_uninstall() { - ## Create or update uninstall script - - uninstall_list="${XDG_DATA_HOME:-$HOME/.local/share}/scripts-bash/uninstall-list" + local uninstall_list="${XDG_DATA_HOME:-$HOME/.local/share}/scripts-bash/uninstall-list" mkdir -p "$(dirname "$uninstall_list")" test -f "${uninstall_list}" || touch "${uninstall_list}" local fichier_a_supprimer="$1" - - # Vérifier si le fichier de suppression existe déjà dans uninstall_script if ! grep -q "$fichier_a_supprimer" "$uninstall_list"; then - # Ajouter le fichier à uninstall_list echo "$fichier_a_supprimer" >> "$uninstall_list" log "- Le fichier '$fichier_a_supprimer' ajouté à la liste de fichiers installés" fi } - -## Fonction de Traitement ## process_deployment_files() { local destination="$1" local source="$2" @@ -78,179 +52,87 @@ process_deployment_files() { log "### Déploiement des fichiers pour $destination" - # S'assurer que le répertoire de destination existe, sinon, le créer + # Point 4 : create_dir n'est appelé qu'ici, pas en double dans les blocs appelants create_dir "$destination" - # Copier sélectivement les fichiers du dépôt Git local vers $destination en préservant la structure log "Vérification de l'existence de '$file_desc'" - - # Vérifier si le fichier "$file_desc" existe - if [ -e "$file_desc" ]; then - # Récupérer des fichiers installés - fileslist_local=$(cat "$file_desc") - - # Copie des fichiers listés dans $file_desc - log "Copie des fichiers listés dans $file_desc." - - # Copier les fichiers en supprimant les extensions - for file in $fileslist_local; do - # debut Supprimer l'extension du nom de fichier si c'est un Bash Script - file_type=$(file -b "$source/$file") - if [[ "$file_type" == *"Bourne-Again shell script"* ]]; then - log "$file est un fichier Bash." - file_dest="${file%.*}" - log "Nom de fichier sans extension : $file_dest" - else - file_dest="${file}" - fi - # fin - cp -v "$source/$file" "$destination/$file_dest" 2>&1 | while read -r line; do - log "- $line" - done - add_uninstall "$destination/$file_dest" - done - else + if [ ! -e "$file_desc" ]; then error "Le fichier '$file_desc' n'existe pas. Votre dépôt Git local n'est pas complet ou quelque chose s'est mal passé." fi - # Affiche un message de confirmation - log "Les fichiers du dépôt Git local ont été copiés vers $destination_dir avec succès." + log "Copie des fichiers listés dans $file_desc." + + # Points 2 et 5 : mapfile + tableau quoté, plus de word-splitting + mapfile -t fileslist_local < "$file_desc" + for file in "${fileslist_local[@]}"; do + local file_type file_dest + file_type=$(file -b "$source/$file") + if [[ "$file_type" == *"Bourne-Again shell script"* ]]; then + log "$file est un fichier Bash." + file_dest="${file%.*}" + log "Nom de fichier sans extension : $file_dest" + else + file_dest="${file}" + fi + cp -v "$source/$file" "$destination/$file_dest" 2>&1 | while read -r line; do + log "- $line" + done + add_uninstall "$destination/$file_dest" + done + + # Point 6 : $destination (variable locale), plus $destination_dir (variable globale) + log "Les fichiers du dépôt Git local ont été copiés vers $destination avec succès." } - -purge_old_logs(){ - find "$log_dir" -type f -name "a5l-scripts_bash-*.log" -mtime +10 -exec rm {} \; - find "$log_dir" -type f -name "a5l-scripts_bash_prep-*.log" -mtime +10 -exec rm {} \; +# Point 8 : un seul find avec pattern commun +purge_old_logs() { + find "$log_dir" -type f -name "a5l-*.log" -mtime +10 -exec rm {} \; } log "Debut du script" - -## Post traitement : log - -# S'assurer que le répertoire de destination existe, sinon, le créer -create_dir "${log_dir}" - -# Purger les les logs purge_old_logs +# Point 7 : tableaux parallèles, plus de blocs répétitifs +declare -a SRCS=( + "local/share/ytdll" + "local/share/ytdll/lib" + "local/share/doc/scripts-bash" + "local/share/man/man1" + "local/bin" +) +declare -a DSTS=( + "$HOME/.local/share/ytdll" + "$HOME/.local/share/ytdll/lib" + "$HOME/.local/share/doc/scripts-bash" + "$HOME/.local/share/man/man1" + "$HOME/.local/bin" +) +declare -a DESCS=( + ".config/files_local-share-ytdll" + ".config/files_local-share-ytdll-lib" + ".config/files_local-share-doc" + ".config/files_local-share-man" + ".config/files_local-bin" +) +for i in "${!SRCS[@]}"; do + log "## Debut du traitement pour ${DSTS[$i]}" + process_deployment_files "${DSTS[$i]}" "${SRCS[$i]}" "${DESCS[$i]}" +done -#### .local/share/ytdll #### - -## Declarations ## - -# Spécifier le chemin du répertoire destination -destination_dir="$HOME/.local/share/ytdll" - -# Spécifier le chemin du répertoire du dépôt Git local -source_dir="local/share/ytdll" - -file_local_desc=.config/files_local-share-ytdll - -## Traitement ## -log "## Debut du traitement pour $destination_dir" - -process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc" - - - -#### .local/share/ytdll/lib #### - -## Declarations ## - -# Spécifier le chemin du répertoire destination -destination_dir="$HOME/.local/share/ytdll/lib" - -# Spécifier le chemin du répertoire du dépôt Git local -source_dir="local/share/ytdll/lib" - -file_local_desc=.config/files_local-share-ytdll-lib - -## Traitement ## -log "## Debut du traitement pour $destination_dir" - -process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc" - - - - -#### .local/share/doc #### - -## Declarations ## - -# Spécifier le chemin du répertoire destination -destination_dir="$HOME/.local/share/doc/scripts-bash" - -# Spécifier le chemin du répertoire du dépôt Git local -source_dir="local/share/doc/scripts-bash" - -file_local_desc=.config/files_local-share-doc - -## Traitement ## -log "## Debut du traitement pour $destination_dir" - -process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc" - - - - -#### .local/share/man #### - -## Declarations ## - -# Spécifier le chemin du répertoire -destination_dir="$HOME/.local/share/man/man1" - -# Spécifier le chemin du répertoire du dépôt Git local -source_dir="local/share/man/man1" - -file_local_desc=.config/files_local-share-man - -## Traitement ## -log "## Debut du traitement pour $destination_dir" - -log "### Debut du Traitement pour la gestion du PATH avec $destination_dir" -# man cherche dans $MANPATH/man1/, on ajoute le parent ~/.local/share/man +# Ajout de ~/.local/share/man au MANPATH si nécessaire manpath_parent="$HOME/.local/share/man" if [[ ! ":$(manpath):" == *":$manpath_parent:"* ]]; then - echo 'export MANPATH="$(manpath):'"$manpath_parent"'"' >> ~/.bashrc - source ~/.bashrc - log " $manpath_parent a été ajouté au MANPATH dans le fichier de configuration de session de l'utilisateur." + echo 'export MANPATH="$(manpath):'"$manpath_parent"'"' >> ~/.bashrc + # Point 1 : source ~/.bashrc supprimé — sans effet dans un sous-shell + log " $manpath_parent ajouté au MANPATH dans ~/.bashrc. Rechargez votre terminal pour appliquer." fi -process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc" - - - -#### .local/bin #### - -## Declarations ## - -# Spécifier le chemin du répertoire -destination_dir="$HOME/.local/bin" - -# Spécifier le chemin du répertoire du dépôt Git local -source_dir="local/bin" - -file_local_desc=.config/files_local-bin - -## Traitement ## -log "## Debut du traitement pour $destination_dir" - -# S'assurer que le répertoire de destination existe, sinon, le créer -create_dir "$destination_dir" - -log "### Debut du Traitement pour la gestion du PATH avec $destination_dir" -# Vérifier si le répertoire destination est déjà dans le PATH -if [[ ! ":$PATH:" == *":$destination_dir:"* ]]; then - # Ajouter le répertoire destination au PATH dans le fichier de configuration de session de l'utilisateur - echo 'export PATH="$PATH:'"$destination_dir"'"' >> ~/.bashrc - source ~/.bashrc - log " $destination_dir a été ajouté au PATH dans le fichier de configuration de session de l'utilisateur." +# Ajout de ~/.local/bin au PATH si nécessaire +if [[ ! ":$PATH:" == *":$HOME/.local/bin:"* ]]; then + echo 'export PATH="$PATH:'"$HOME/.local/bin"'"' >> ~/.bashrc + # Point 1 : source ~/.bashrc supprimé — sans effet dans un sous-shell + log " $HOME/.local/bin ajouté au PATH dans ~/.bashrc. Rechargez votre terminal pour appliquer." fi -## Traitement ## -process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc" - log "## Fin du script. Bonne continuation." -