From f7f8889bba4c15fd04cd019131f3d0d19249cef2 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Thu, 5 Dec 2019 14:43:33 +0400 Subject: [PATCH] support des filtres avec wildcards --- pff | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 88 insertions(+), 6 deletions(-) diff --git a/pff b/pff index 1c14d92..57931e7 100755 --- a/pff +++ b/pff @@ -26,10 +26,10 @@ PFFCONFVARS=( "DISTTYPE=auto//Type de distribution upstream: full ou patch" -a "ORIGEXTS=//Extensions origines" - "PROTECTS=//Fichiers locaux à protéger lors de l'intégration e.g /dir/, /file, etc." + "PROTECTS=//Fichiers locaux à protéger lors de l'intégration au format rsync e.g /dir/, /file, etc." "MKDIRS//Répertoires qui doivent toujours exister" - "FILTERS//Filtres appliqués aux fichiers lors de l'intégration" - "NOMERGES=//Fichiers qu'il ne faut pas chercher à fusionner" + "FILTERS//Filtres appliqués aux fichiers lors de l'intégration, de la forme 'filespec:filter'. Cf la doc pour le détail du format" + "NOMERGES=//Fichiers qu'il ne faut pas chercher à fusionner. Cf la doc pour le détail du format" ) if [ "$#" -eq 1 -a "$1" == --nutools-makelinks ]; then @@ -152,6 +152,44 @@ sont: USAGE $scriptname [options] +CONFIGURATION +Le fichier $PFFCONF contient des variables qui conditionnent le comportement de +pff: + + PROTECTS -- liste de spécifications de fichiers ou de répertoires à protéger + lors de l'intégration. Ces spécifications sont au format rsync, e.g + /dir/, /file, etc. + + FILTERS -- liste de définitions de filtres à appliquer aux fichiers lors de + l'intégration. ces spécifications sont de la forme 'filespec:filter'. + Les spécifications de fichier peuvent contenir des wildcards et sont de + deux sortes: + - sans chemin, e.g 'myfile' ou '*.c', tous les fichiers de ce nom + correspondent + - avec un chemin, e.g '/myfile', 'path/to/*.jsp', la correspondance est + cherchée relativement au répertoire du projet. ainsi '/*.c' ne matche + que les fichiers ayant l'extension .c situés dans le répertoire du + projet + Les filtres disponibles sont: + nl2lf -- forcer le caractère de fin de ligne à LF + nl2crlf -- forcer le caractère de fin de ligne à CR+LF + nl2cr -- forcer le caractère de fin de ligne à CR + normalize_properties -- normaliser fichier de propriétés java + Il est possible de créer de nouveaux filtres en définissant des + fonctions de la forme pff_filter_NAME(). Ces fonctions, si elles sont + appelées sans argument, doivent filtrer l'entrée standard. Si un + argument est spécifié, il faut filtrer ce fichier-là. + + NOMERGES -- liste de spécifications de fichiers qu'il ne faut pas chercher à + fusionner. Les spécifications de fichier peuvent contenir des wildcards + et sont de deux sortes: + - sans chemin, e.g 'myfile' ou '*.c', tous les fichiers de ce nom + correspondent + - avec un chemin, e.g '/myfile', 'path/to/*.jsp', la correspondance est + cherchée relativement au répertoire du projet. ainsi '/*.c' ne matche + que les fichiers ayant l'extension .c situés dans le répertoire du + projet + COMMANDES / OPTIONS Les arguments du script dépendent de la commande utilisée. Les commandes supportées sont: @@ -456,6 +494,7 @@ function is_nomerge() { for nomerge in "${NOMERGES[@]}"; do if [[ "$nomerge" == */* ]]; then # matcher sur le chemin relatif + nomerge="${nomerge#/}" if eval "[[ $(qval "$rfile") == $(qwc "$nomerge") ]]"; then return 0 fi @@ -572,6 +611,39 @@ function pff_filter_normalize_properties() { return $r fi } +function pff_filter_nl2lf() { + if [ $# -eq 0 ]; then + _nl2lf + else + local mode r + mode="$(fix_mode "$1")" + doinplace "$1" _nl2lf; r=$? + unfix_mode "$1" "$mode" + return $r + fi +} +function pff_filter_nl2crlf() { + if [ $# -eq 0 ]; then + _nl2crlf + else + local mode r + mode="$(fix_mode "$1")" + doinplace "$1" _nl2crlf; r=$? + unfix_mode "$1" "$mode" + return $r + fi +} +function pff_filter_nl2cr() { + if [ $# -eq 0 ]; then + _nl2cr + else + local mode r + mode="$(fix_mode "$1")" + doinplace "$1" _nl2cr; r=$? + unfix_mode "$1" "$mode" + return $r + fi +} function apply_filter() { # Appliquer les filtres définis au fichier $1 dans le projet pff $2 @@ -580,12 +652,22 @@ function apply_filter() { # produite, 2 si aucun filtre n'existe pour ce fichier local pfile="$1" pffdir="$2" local realfile="${3:-$pfile}" - local rfile ffile filter r=2 + local rfile ffile filter r=2 filedir filespec setx rfile=get_rfile "$realfile" "$pffdir" + setx file=basename -- "$rfile" # utilisé pour le match sur le nom du fichier for filter in "${FILTERS[@]}"; do splitpair "$filter" ffile filter - if [ "$ffile" == "$rfile" ]; then - "pff_filter_$filter" "$pfile" && r=0 || r=1 + if [[ "$ffile" == */* ]]; then + # matcher sur le chemin relatif + ffile="${ffile#/}" + if eval "[[ $(qval "$rfile") == $(qwc "$ffile") ]]"; then + "pff_filter_$filter" "$pfile" && r=0 || r=1 + fi + else + # matcher uniquement sur le nom du fichier + if eval "[[ $(qval "$file") == $(qwc "$ffile") ]]"; then + "pff_filter_$filter" "$pfile" && r=0 || r=1 + fi fi done return $r