From 70165cb09f461dbc6d0bd15cc3a3613945c98919 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Wed, 7 Feb 2018 16:22:50 +0400 Subject: [PATCH] pff: ajout de --diff et --infos -l --- pff | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 102 insertions(+), 16 deletions(-) diff --git a/pff b/pff index 21ca5a2..6c3fe9d 100755 --- a/pff +++ b/pff @@ -6,6 +6,7 @@ SCRIPT_ALIASES=( pfa:-a pfb:-b pfe:-e + pfd:-d ) ORIGEXT=pff @@ -175,10 +176,10 @@ supportées sont: Ajouter/Identifier un fichier comme un fichier local pour tous les profils. Le fichier est copié dans le profil Base. - -L, --locals [WORKDIR] + --locals [WORKDIR] Lister les fichiers locaux - -l, --profiles [WORKDIR] + --profiles [WORKDIR] Lister les profils valides -s, --switch PROFILE [WORKDIR] @@ -190,13 +191,22 @@ supportées sont: -e, --edit FILES... Editer des fichiers, implique --add-local + -d, --diff [DESTP [WORKDIR]] + -d, --diff [SRCP DESTP [WORKDIR]] + Afficher la différence entre entre deux profils. Avec la première + syntaxe, comparer le profil courant au profil DESTP. Avec la deuxième + syntaxe, comparer le profil SRCP au DESTP. + --infos [WORKDIR] Afficher des informations sur le projet courant: profils, fichiers locaux, profil courant, etc. C'est la commande par défaut. Les fichiers locaux sont taggés avec les valeurs suivantes ${COULEUR_ROUGE}P${COULEUR_NORMALE} il existe un patch pour ce fichier dans le profil courant ${COULEUR_BLEUE}*${COULEUR_NORMALE} ce fichier local est spécifique à ce profil - ${COULEUR_BLEUE}C${COULEUR_NORMALE} ce fichier local est spécifique au profil Common" + $(get_color YELLOW)C${COULEUR_NORMALE} ce fichier local est spécifique au profil Common + -l, --details + Afficher tous les fichiers locaux au lieu de se contenter des fichiers + modifiés dans le profil courant." } # Nomenclature pour le nommage des fichiers traités: @@ -210,6 +220,10 @@ supportées sont: # clink: la destination du lien cfile # Plink: la destination du lien Pfile +function flexists() { + [ -e "$1" -o -L "$1" ] +} + function find_pffdir() { # trouver le répertoire du projet pff à partir du répertoire $2(=.) et # mettre le chemin absolu dans la variable $1(=pffdir) @@ -353,7 +367,7 @@ function sync_vlfiles() { rfile="${vlfile%__pv-*__}" for profile in "${profiles[@]}"; do prefix="$pffdir/pff/$profile" - [ -e "$prefix/$rfile" ] || continue + flexists "$prefix/$rfile" || continue pfile="$prefix/$vlfile" setx plink=multiups "$profile/$vlfile" "Base/$vlfile" if [ -L "$pfile" ]; then @@ -785,13 +799,13 @@ function add_global__link() { local rfile bfile cfile plink clink tmp setx rfile=get_rfile "$pfile" "$pffdir" || return - [ -L "$pffdir/$rfile" -o -e "$pffdir/$rfile" ] || touch "$pffdir/$rfile" + flexists "$pffdir/$rfile" || touch "$pffdir/$rfile" setx bfile=get_bfile "$pfile" "$pffdir" setx cfile=get_cfile "$pfile" "$pffdir" setx plink=multiups "$rfile" "pff/Current/$rfile" setx clink=multiups "Current/$rfile" "Base/$rfile" - if [ -e "$bfile" -a -L "$pfile" -a -L "$cfile" ]; then + if flexists "$bfile" && [ -L "$pfile" -a -L "$cfile" ]; then : # ok pour les liens else # Création des liens pour $rfile @@ -815,7 +829,7 @@ function add_global_cmd() { if [ -d "$file" ]; then ewarn "$file: est un répertoire. argument ignoré" continue - elif [ -L "$file" -o -e "$file" ]; then + elif flexists "$file"; then : else ewarn "$file: fichier introuvable" @@ -878,19 +892,19 @@ function add_local__link() { local rfile bfile pfile Pfile plink Plink # vérifier validité du chemin setx rfile=get_rfile "$pfile" "$pffdir" || return - [ -L "$pffdir/$rfile" -o -e "$pffdir/$rfile" ] || touch "$pffdir/$rfile" + flexists "$pffdir/$rfile" || touch "$pffdir/$rfile" # vérifier la présence du lien global setx bfile=get_bfile "$pfile" "$pffdir" - if [ ! -e "$bfile" ]; then + if ! flexists "$bfile"; then add_global__link "$pfile" "$pffdir" || return fi # vérifier la présence du lien local setx Pfile=get_pfile "$pfile" "$profile" "$pffdir" - [ -e "$Pfile" ] && return 0 + flexists "$Pfile" && return 0 # créer le fichier local setx Cfile=get_Cfile "$pfile" "$pffdir" mkdirof "$Pfile" - if [ -e "$Cfile" ]; then + if flexists "$Cfile"; then # copier depuis le profil Common par défaut cp "$Cfile" "$Pfile" else @@ -918,7 +932,7 @@ function add_local_cmd() { if [ -d "$file" ]; then ewarn "$file: est un répertoire. argument ignoré" continue - elif [ -L "$file" -o -e "$file" ]; then + elif flexists "$file"; then : else ewarn "$file: fichier introuvable" @@ -976,10 +990,76 @@ function edit_cmd() { return $r } +#=========================================================== +# pff --diff + +function diff_cmd() { + local pffdir profile srcp destp + case $# in + 0) + ensure_pffdir pffdir + setx srcp=get_current_profile "$pffdir" + destp= + ;; + 1) + if withpath "$1"; then + ensure_pffdir pffdir "$1" + setx srcp=get_current_profile "$pffdir" + destp= + else + ensure_pffdir pffdir + setx srcp=get_current_profile "$pffdir" + destp="$1" + fi + ;; + 2) + if withpath "$2"; then + ensure_pffdir pffdir "$2" + setx srcp=get_current_profile "$pffdir" + destp="$1" + else + ensure_pffdir pffdir + srcp="$1" + destp="$2" + fi + ;; + *) + ensure_pffdir pffdir "$3" + srcp="$1" + destp="$2" + ;; + esac + + local -a lfiles; local rfile bfile Cfile srcfile destfile + setx -a lfiles=get_local_files "$pffdir" + + for rfile in "${lfiles[@]}"; do + setx srcfile=get_pfile "$pffdir/$rfile" "$srcp" "$pffdir" + flexists "$srcfile" || continue + if [ -n "$destp" ]; then + setx destfile=get_pfile "$pffdir/$rfile" "$destp" "$pffdir" + else + setx Cfile=get_Cfile "$pffdir/$rfile" "$pffdir" + setx bfile=get_bfile "$pffdir/$rfile" "$pffdir" + # si on précise pas le profil destination, sélectionner dans l'ordre + # Common ou Base + if [ "$srcp" == Base -o "$srcp" == Common ]; then + destfile="$bfile" + elif flexists "$Cfile"; then + destfile="$Cfile" + else + destfile="$bfile" + fi + fi + diff -ur "$srcfile" "$destfile" + done | page_maybe +} + #=========================================================== # pff --infos function infos_cmd() { + local details="$1"; shift local pffdir="$1" local -a profiles vlfiles local rfile Pfile flag @@ -1002,7 +1082,9 @@ function infos_cmd() { elif [ -f "$Pfile" ]; then flag="${COULEUR_BLEUE}*${COULEUR_NORMALE} " elif [ "$profile" != Common -a -f "$Cfile" ]; then - flag="${COULEUR_BLEUE}C${COULEUR_NORMALE} " + flag="$(get_color YELLOW)C${COULEUR_NORMALE} " + elif [ -z "$details" ]; then + continue else flag=" " fi @@ -1044,6 +1126,7 @@ disttype=auto ORIGEXTS=("${DEFAULT_ORIGEXTS[@]}") PROTECTS=("${DEFAULT_PROTECTS[@]}") unwrap=auto +details= args=( --help '$exit_with display_help' -0,--init action=init @@ -1060,12 +1143,14 @@ args=( -E,--unwrap unwrap=1 -p,--patch action=patch -a,--add-global action=add-global - -L,--locals action=list-locals - -l,--profiles action=list-profiles + --locals action=list-locals + --profiles action=list-profiles -s,--switch action=switch -b,--add-local action=add-local -e,--edit action=edit + -d,--diff action=diff --infos action=infos + -l,--details details=1 ) parse_args "$@"; set -- "${args[@]}" @@ -1081,5 +1166,6 @@ list-profiles) list_profiles_cmd "$@";; switch) switch_cmd "$@";; add-local) add_local_cmd "$@";; edit) edit_cmd "$@";; -infos) infos_cmd "$@";; +diff) diff_cmd "$@";; +infos) infos_cmd "$details" "$@";; esac