scripts/autoRequirements.sh

110 lines
4.1 KiB
Bash
Executable file

#!/bin/bash
#**********************************#
# autoRequirements.sh #
# #
# author: rick@gnous.eu #
# licence: MIT #
#**********************************#
path=${1:-.}
INDEX=0
echo 'Récupération des packets installés sur la machine...'
installedPackage=($(pip3 freeze))
echo 'Fait.'
packagePutInReq=()
# ========================================================================= #
# contains() #
# Vérifie si le packet est dans la liste des packets installés #
# #
# Utilise la variable globale installedPackage. #
# #
# Paramètres : $1 le packet à vérifier #
# #
# Retourne : - 0 si le packet est dans la liste des packets installés #
# Mets à jour la variable globale INDEX avec l'index du packet #
# dans la tableau installedPackagei #
# - 1 sinon #
# ========================================================================= #
contains() {
value=$1
i=0
for element in "${installedPackage[@]}"; do
element=$(cut -d= -f1 <<< $element)
if [[ "$element" == "$value" ]]; then
INDEX=$i
return 0
break
fi
i=$((i+1))
done
return 1
}
# ====================================================================== #
# checkContains() #
# Vérifie si le packet n'est pas déjà présent dans la liste des packets #
# qui seront dans le requirements.txt #
# #
# Utilise la variable globale packagePutInReq. #
# #
# Paramètres : $1 le packet à vérifier #
# #
# Retourne : - 0 si le packet est déjà présent dans la liste des packets #
# - 1 sinon #
# ====================================================================== #
checkContains() {
value=$1
for element in "${packagePutInReq[@]}"; do
if [[ "$value" == "$element" ]]; then
return 0
fi
done
return 1
}
echo 'Récupération des packets à installer...'
for file in $(find $path -iname "*.py"); do
# boucle sur les lines qui commencent par import ou from. Vous pouvez voir la commande utilisée
# à la fin de la boucle
while read -r line; do
package=$(cut -d' ' -f2 <<< $line)
contains $package
if [ $? -eq 0 ]; then
newPackage=${installedPackage[$INDEX]}
checkContains $newPackage
if [ $? -eq 1 ]; then
packagePutInReq+=($newPackage)
fi
fi
done < <(grep '\(^[[:blank:]]*import\)\|\(^[[:blank:]]*from\)' $file)
done
echo 'Fait.'
echo 'Création et insertion des packets dans requirements.txt...'
pathRequirement=$path'/requirements.txt'
if [[ -e $pathRequirement ]]; then
read -p "Le fichier requirements.txt existe déjà. Voulez-vous l'(E)ffacer, faire un (B)ackup ou (A)nnuler l'opération ?" checkFile
case "$checkFile" in
E | e )
echo 'Suppression du fichier...'
rm $pathRequirement
;;
B | b )
echo 'Backup du fichier...'
mv $pathRequirement $pathRequirement'.backup'
;;
*)
echo 'Annulation...'
exit
;;
esac
fi
touch pathRequirement
for package in "${packagePutInReq[@]}"; do
echo $package >> $pathRequirement
done
echo 'Fait.'