-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNouveau_projet.sh
316 lines (283 loc) · 11.5 KB
/
Nouveau_projet.sh
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
#!/bin/bash
: '
* AUTEUR : Erwan PECHON :: Mewen PUREN
* VERSION : 2.0
* DATE : 31 oct. 2023
* Script qui sert à créer un nouveau projet dans un language donnée.
'
# CRÉATION DES VARIABLES GLOBALES
# # Localisation
dossierActu=`pwd`
export dossierModele="$dossierModele" # Où ce trouve les Modèles ?
export archiveModele="$dossierModele/type_\$language.tar.gz"
parametreur="$dossierModele/GenereProjet_\$language.sh"
export questionneur="$dossierModele/question.sh"
chmod a+x $questionneur
# # Gestion des paramètres
export indiceParam=1
nbParam_min=2
# # Gestion des erreurs
declare -A codeErr
codeErr["nbParam"]=1
codeErr["param"]=2
codeErr["appel"]=3
codeErr["export"]=4
codeErr["cd"]=12
# # Info sur le nouveau projet
# # # Type du projet
export language="<Le language dont on veut générer un projet>"
lstLanguage=( `ls $dossierModele | grep -E "^GenereProjet_.*\.sh|^type_.*\.tar\.gz" | cut -d_ -f2- | cut -d. -f1 | sort -u | tr "\n" "\t"` )
export languageOpt="" # Une option de language (ex:cls pour classe LaTeX)
export extension="<Veuillez redéfinir la variable '\$extension'.>"
# # # Nom et emplacement du projet
export nomProjet=""
export emplacementProjet=""
lstLiens=()
# # # Contributeur du projet
export premierAuteur="" # Chef du projet
export lstAuteur="" # premierAuteur :: auteur2 ; auteur3 ; ... ; auteurN
# # # Autres infos sur le projet
export description="" # Le projet sert à $description
export dateCreation=`date +"%a %e %b %Y %H:%M:%S %Z" | sed 's/\<[a-z]/\U&/g'`
# # Qu'elle balises à remplacer dans le projet ?
declare -A balises
balises["nomProjet"]="~~PROJET~~"
balises["lstAuteur"]="~~AUTEURS~~"
balises["premierAuteur"]="~~CHEF~~"
balises["description"]="~~DESCR~~"
balises["dateCreation"]="~~DATE~~"
balises["language"]="~~LANGUAGE~~"
# # Autres
export autres_verif=">>>>>Veuillez personaliser la variable 'autres_verif'.<<<<<"
export modele="Veuillez redéfinir \$modele avec le nom du modèle de projet (depuis l'archive \$archiveModele)"
# AIDE UTILISATION
strParam="[<emplacementProjet>/]<nomProjet> <language> [{ -a <auteur> [<auteur>]... a- | -d <description> | {-l|-s} <lien> }]... [--] [<autres>]..."
detailAide="\n\t\t> L'aide d'un language donnée si <nomParam> est '-l <nomLanguage>'.\n\t\t> L'aide de tout les language si <nomParam est '-l \"\"'."
aideLanguage="true"
declare -A detail
# Paramètre $1
detail["emplacementProjet"]="Le dossier où créer le projet."
detail["nomProjet"]="Le nom du projet."
# Paramètre $2
detail["language"]="Le language principale du projet à créer, à choisir dans la liste suivante : ${lstLanguage[*]}.\n\t\t> Une spécialisation du language peut-être fait en l'appelant avec '<language>:<spe>' (par exemple : 'Shell:zsh')."
# Paramètre 'auteur'
detail["%-a"]="Déclare le début d'une liste d'auteur à ajouter au auteurs déjà mentionner (si il y en à déjà eu)."
detail["auteur"]="Un auteur du projet."
detail["%a-"]="Déclare la fin d'une liste d'auteur."
# Paramètre 'définition
detail["%-d"]="Annonce la définition de la description."
detail["description"]="Compléter la phrase 'Le projet sert à <description>'."
detail["%-l"]="Crée un lien physique vers le projet. Permet d'avoir plusieurs accès au projet."
detail["%-s"]="Crée un lien symbolique vers le projet. Permet d'avoir plusieurs accès au projet."
detail["lien"]="Nom du lien (et chemin) vers le projet."
detail["--"]="Explicite la fin des options du script général et explicite le début des options du générateur spécialiser."
detail["autres"]="Les paramètres à transmettre au générateur de projet du language cible."
# CRÉATION(S) DE(S) FONCTION(S)
source "$dossierModele/fonction_creation_projet.sh"
# VÉRIFIÉ LES PARAMÉTRES (Renvoyer 1 en cas d'erreur)
# # Bon nombre de paramètre ? #
if ( test $# -lt $nbParam_min ) ; then
aide ${codeErr["nbParam"]} $LINENO "Au moins $nbParam_min paramètres attendu" $#
fi
# # Bon type de paramètre ? #
: ' Test du paramètre [<emplacementProjet>/]<nomProjet> : '
echo -e "> Lecture de l'emplacement du projet\n"
if ( test $( echo "$1" | grep "[^a-zA-Z0-9_/.\-]" ) ) then
aide ${codeErr["param"]} $LINENO "[<emplacementProjet>/]<nomProjet>" "$1" "Le paramètre \$$indiceParam contient des caractère interdit pour un emplacement de projet." -h "emplacementProjet" "nomProjet"
fi
emplacementProjet=$(dirname "$1")
nomProjet=`basename "$1"`
shift ; indiceParam=`expr $indiceParam + 1`
: ' Test du paramètre <emplacementProjet> : '
if ( test "$emplacementProjet" != "" ) ; then
: ' Obtenir le chemin absolue vers le dossier demandé '
emplacementProjet=`echo "$emplacementProjet" | sed "s/^ *//g"` # Supprimer les espaces au début
if ( test "$( echo "$emplacementProjet" | cut -c1 )" = "~" ) ; then # Si relatif par rapport au HOME de l'utilisateur
emplacementProjet="$HOME$( echo "$emplacementProjet" | cut -c2- )"
elif ( test "$( echo "$emplacementProjet" | cut -c1 )" != "/" ) ; then # Si relatif par rapport au dossier actuel
emplacementProjet="$dossierActu/$emplacementProjet"
fi
emplacementProjet=`echo "$emplacementProjet" | sed "s/\/\.\//\//g"` # Supprimer tout les '/./' de la réponse.
emplacementProjet=`echo "$emplacementProjet" | sed "s/\/\.$/\//g"` # Supprimer tout les '/./' de la réponse.
emplacementProjet=`echo "$emplacementProjet" | sed "s/\/[^/]*\/\.\.\//\//g"` # Supprimer tout les '/[^/]*/../' de la réponse.
emplacementProjet=`echo "$emplacementProjet" | sed "s/\/[^/]*\/\.\.$/\//g"` # Supprimer tout les '/[^/]*/../' de la réponse.
emplacementProjet=`echo "$emplacementProjet" | sed 's#/\+$##'` # Supprimer tout les '/' à la fin de la réponse.
: ' Obtenir le chemin vers l objet demandé '
chemin=""
for F in `echo "$emplacementProjet" | tr "/" " "` ; do
chemin="$chemin/$F"
# Vérifier si tout les membres du chemin existe :
if ( ! test -e "$chemin" ) ; then
echo "Le dossier '$chemin' n'existe pas."
echo "Par conséquent, les dossier fils allant jusqu'à '$emplacementProjet' n'existe pas."
$questionneur :o "Voulez-vous les créer" "abandon" ; retour=$?
if ( test $retour -eq 0 ) ; then # annuler
echo "> Abandon."
exit 0
elif ( test $retour -eq 1 ) ; then # o
break
else # err
echo "ERROR sur la question"
exit -1
fi
fi
# Vérifier si tout les membres du chemin sont des dossiers
if ( ! test -d "$chemin" ) ; then
echo "Le fichier '$chemin' existe, mais il n'est pas un dossier."
echo "Par conséquent, les dossier fils allant jusqu'à '$emplacementProjet' n'existe pas."
$questionneur :o "Voulez-vous l'ÉCRASER" "abandon" ; retour=$?
if ( test $retour -eq 0 ) ; then # annuler
echo "> Abandon."
exit 0
elif ( test $retour -eq 1 ) ; then # o
break
else # err
echo "ERROR sur la question"
exit -1
fi
fi
# Vérifier si l'on ne passe pas par les modèles
if ( test "$chemin" = "$dossierModele" ) ; then
echo "Merci de ne pas créer de projet dans les modèles de projet."
echo "Veuillez en copier le contenu (à l'aide de ce super générateur) et travailler ailleurs."
exit -1
fi
done
chemin=""
fi
: ' Test du paramètre <nomProjet> : '
echo -e "> Lecture du nom du projet\n"
if ( test $( echo "$nomProjet" | grep "[^a-zA-Z0-9_\-]" ) ) then
aide ${codeErr["param"]} $LINENO "<nomProjet>" "$1" "Le paramètre \$$indiceParam ne devrait pas contenir d'extension pour le projet." -h "nomProjet"
fi
: ' Test du paramètre <language> : '
echo -e "> Lecture du language du projet\n"
if ( test $# -ge 1 ) ; then
language=`echo "$1" | cut -d: -f1`
for lang in ${lstLanguage[*]} ; do
if ( test "$language" = "$lang" ) ; then
languageOpt="1"
break
fi
done
if ( test $languageOpt -eq 1 ) ; then
languageOpt=`echo "$1" | cut -d: -f2-`
else
aide ${codeErr["param"]} $LINENO "<language>" "$1" "Le paramètre \$$indiceParam ne contient pas un language connue." -h "language"
fi
if ( test "$languageOpt" = "$language" ) ; then
languageOpt=""
fi
fi
shift ; indiceParam=`expr $indiceParam + 1`
: ' Test des paramètres commun à tous les générateurs de projets : '
while ( test $# -ne 0 ) ; do
case "$1" in
"-a") #Test des paramètres optionnels informant sur le ou les auteurs du documents. :
echo -e "> Lecture des auteurs du projet\n"
shift ; indiceParam=`expr $indiceParam + 1`
if ( test $# -lt 2 ) then
aide ${codeErr["param"]} $LINENO "-a <auteur> a-" "-a $*" "-a doit être suivit par au moins 1 <auteur> et ce finir par a-." -h "auteur"
fi
if ( test "$premierAuteur" = "" ) ; then
premierAuteur="$1"
shift ; indiceParam=`expr $indiceParam + 1`
fi
while ( test $# -ne 0 -a "$1" != "a-" ) ; do
if ( test "$lstAuteur" = "" ) ; then
lstAuteur="$1"
else
lstAuteur="$lstAuteur ; $1"
fi
shift ; indiceParam=`expr $indiceParam + 1`
done
if ( test $# -eq 0 ) ; then
aide ${codeErr["param"]} $LINENO "-a <auteur> a-" "a-" "-a doit ce finir par a-." -h "auteur"
fi
;;
"-d") #Test du paramètre optionnel <description> :
echo -e "> Lecture de la description du projet\n"
shift ; indiceParam=`expr $indiceParam + 1`
if ( test -z "$description" ) then
description="$1"
else
aide ${codeErr["param"]} $LINENO "<description>" "$1" "La description à déjà était renseigné." -h "description"
fi
;;
"-s"|"-l") # Test du paramètre optionnel <lien> :
echo -e "> Lecture d'un lien sur le projet\n"
typeLien="$1"
shift ; indiceParam=`expr $indiceParam + 1`
# Obtenir le nom du lien
nouv_lien="$1"
if ( test -d "$nouv_lien" ) ; then # Si le lien indiquer existe
nouv_lien="$(realpath "$nouv_lien")/$nomProjet"
fi
# Vérifier si le lien existe
testFichier "-e" "nouv_lien" ; retour=$?
if ( test $retour -eq 0 ) ; then # ok
if ( test "$typeLien" = "-s" ) then
nouv_lien="s:$nouv_lien"
else
nouv_lien="l:$nouv_lien"
fi
lstLiens=( ${lstLiens[*]} "$nouv_lien" )
elif ( test $retour -eq 1 ) ; then # abandon
echo "Abandon de la création du lien"
else # err
echo "ERREUR sur le test de l'existence d'un fichier nommée '$nouv_lien'."
exit -1
fi
;;
*) # Obtention de la liste des paramètres du script
break
;;
esac
shift ; indiceParam=`expr $indiceParam + 1`
done
if ( test -z "$description" ) then
description="faireQuelqueChoseDeSuperUtileMaisJeNeSaisPasEncoreQuoi"
fi
if ( test -z "$premierAuteur" ) then
premierAuteur="Erwan PECHON"
fi
if ( test -z "$lstAuteur" ) then
lstAuteur="$premierAuteur"
else
lstAuteur="$premierAuteur :: $lstAuteur"
fi
echo -e "> Fin de la lecture des paramètres commun d'un projet\n"
if ( test "$1" = "--" ) ; then
shift ; indiceParam=`expr $indiceParam + 1`
fi
echo -e "> Accès au générateur spécialiser pour la création de ce type de projet\n"
# SCRIPT
# Accéder au dossier de modèle
eval "parametreur=\"$parametreur\""
eval "archiveModele=\"$archiveModele\""
# Créer le fichier de sauvegarde des tableau
export F_tab="$dossierModele/mesTableaux.sh"
rm -f $F_tab
touch $F_tab
# Sauvegarde des tableaux
declare -p codeErr >> $F_tab
declare -p balises >> $F_tab
declare -p lstLiens >> $F_tab
# Activation des script
chmod a+x $parametreur
# Création du projet
$parametreur "$@" ; retour=$?
echo -e "> Le générateur de projet spécialiser semble avoir fini de travailler\n"
if ( test $retour -ne 0 ) ; then
echo "Une erreur est survenu durant le déroulement du script spécialiser pour un projet en $language."
exit $retour
fi
# Désactivation des script
chmod 644 $questionneur
chmod 644 $parametreur
# SORTIE
cd $dossierActu
rm -f $F_tab
echo -e "\n\tFIN DU SCRIPT '$(basename "$0")'."
exit 0
# #####-#####-#####-#####-##### FIN PROGRAMMATION #####-#####-#####-#####-##### #