support des filtres avec wildcards

This commit is contained in:
Jephté Clain 2019-12-05 14:43:33 +04:00
parent 747c563a2b
commit f7f8889bba
1 changed files with 88 additions and 6 deletions

94
pff
View File

@ -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