diff --git a/pff b/pff index 3e30cb2..3ab48f0 100755 --- a/pff +++ b/pff @@ -23,6 +23,7 @@ PFFCONFVARS=( "PVERSIONS//Versions en attente d'intégration" "PROFILES//Profils définis" "ORIGEXTS=//Extensions origines" + "PROTECTS=//Fichiers locaux à protéger lors de l'intégration e.g /dir/, /file, etc." "MKDIRS//Répertoires qui doivent toujours exister" "FILTERS//Filtres appliqués aux fichiers lors de l'intégration" ) @@ -206,6 +207,9 @@ supportées sont: -g, --patch [WORKDIR] Intégrer les modifications entrantes sur les fichiers nouvellement arrivés via l'option --new + -o, --ours + Utiliser la stratégie '-s recursive -X ours' en cas de conflit lors de + l'intégration de la version. --ask-commit -c, --commit --no-commit @@ -685,7 +689,7 @@ function new__prepare_archive() { } function new_cmd() { - local autopatch="$1" version="$2" disttype="$3" unwrap="$4" commit_policy="$5"; shift; shift; shift; shift; shift + local autopatch="$1" version="$2" disttype="$3" unwrap="$4" merge_strategy="$5" commit_policy="$6"; shift; shift; shift; shift; shift; shift local archive="$1" pffdir="$2" ensure_pffdir pffdir "$pffdir" @@ -721,7 +725,7 @@ function new_cmd() { local -a find; local p local fndest0="$workdir/ndest0" fldest0="$workdir/ldest0" get_local_files "$pffdir" >"$fldest0" - for p in "${PROTECTS[@]}"; do + for p in "${PROTECTS[@]}" "${DEFAULT_PROTECTS[@]}"; do [ ${#find[*]} -gt 0 ] && find=("${find[@]}" -o) if [ "${p#/}" != "$p" ]; then # les fichiers à la racine @@ -934,7 +938,7 @@ function new_cmd() { if [ -n "$autopatch" ]; then # lancer la commande patch pour intégrer les modifications ask_yesno "Voulez-vous passer à l'intégration de cette version?" O && - patch_cmd "$commit_policy" "$pffdir" + patch_cmd "$merge_strategy" "$commit_policy" "$pffdir" fi } @@ -942,9 +946,10 @@ function new_cmd() { # pff --patch function patch_cmd() { - local commit_policy="$1" pffdir="$2" + local merge_strategy="$1" commit_policy="$2"; shift; shift + local pffdir="$1" local gitproject was_patched eop_version - local version profile rcfile curdir workdir controldir + local version profile rcfile curdir workdir controlfile control tmpfile local -a profiles vlfiles tmpfiles ensure_pffdir pffdir "$pffdir" @@ -959,6 +964,12 @@ function patch_cmd() { array_add profiles Common fi + case "$merge_strategy" in + ours) merge_strategy=(-s recursive -X ours);; + theirs) merge_strategy=(-s recursive -X theirs);; + *) merge_strategy=();; + esac + while true; do # si pas de version en cours, il n'y a rien à patcher [ ${#PVERSIONS[*]} -gt 0 ] || break @@ -983,10 +994,9 @@ function patch_cmd() { # il faut patcher les fichiers du profil etitle "Intégration de la version $version dans le profil $profile" [ -n "$rcfile" ] || ac_set_tmpfile rcfile + [ -n "$controlfile" ] || ac_set_tmpfile controlfile [ -n "$workdir" ] && ac_clean "$workdir" ac_set_tmpdir workdir - [ -n "$controldir" ] && ac_clean "$controldir" - ac_set_tmpdir controldir curdir="$(pwd)" cd "$workdir" git init -q . @@ -1036,7 +1046,7 @@ function patch_cmd() { [ -n "$(git status --porcelain)" ] && git commit -qm "$version" # basculer vers la branche de version et tenter de merger upstream dans version git checkout -q "v$version" - if git merge -q --no-commit upstream; then + if git merge -q "${merge_strategy[@]}" --no-commit upstream; then # tout s'est bien passé [ -n "$(git status --porcelain)" ] && git commit -qm "v$version --> $profile" else @@ -1046,17 +1056,48 @@ function patch_cmd() { [ -f ~/.bashrc ] && . ~/.bashrc $(qvals source "$ULIBDIR/ulib") urequire DEFAULTS -function abort() { $(qvals touch "$controldir/ABORT"); exit; } -function a() { abort \"\$@\"; } # raccourci pour abort -function d() { exit; } # raccourci pour done +function Commit() { echo COMMIT >$(qvals "$controlfile"); exit; } +# raccourcis pour Commit +function C() { Commit \"\$@\"; }; function c() { Commit \"\$@\"; }; function commit() { Commit \"\$@\"; } +function Abort() { echo ABORT >$(qvals "$controlfile"); exit; } +# raccourcis pour Abort +function A() { Abort \"\$@\"; }; function a() { Abort \"\$@\"; }; function abort() { Abort \"\$@\"; } $(qvals cd "$workdir") -$(qvals eerror "Une erreur s'est produite: examinez la situation et faites les corrections nécessaires") -$(qvals eimportant "Puis tapez exit pour valider l'intégration de la version") -$(qvals eimportant "Sinon, tapez abort pour arrêter l'intégration de cette version") +$(qvals eerror "Une erreur s'est produite: consultez les fichiers concernés et faites les corrections nécessaires. En cas de conflit, vous devez les résoudre en examinant les lignes marquées + <<<<<<< HEAD + ======= + >>>>>>> upstream +puis en gardant la partie HEAD pour les modifications locales et upstream pour les modifications entrantes") +$(qvals eimportant "Puis tapez ${COULEUR_VERTE}Commit${COULEUR_NORMALE} pour valider l'intégration de cette version") +$(qvals eimportant "Sinon, tapez ${COULEUR_ROUGE}Abort${COULEUR_NORMALE} pour arrêter l'intégration de cette version") " + >"$controlfile" "${SHELL:-bash}" --rcfile "$rcfile" + control="$(<"$controlfile")" + if [ -z "$control" ]; then + # demander à l'utilisateur sa décision + eerror "Vous n'avez pas terminé votre session par ${COULEUR_VERTE}Commit${COULEUR_NORMALE} ou ${COULEUR_ROUGE}Abort${COULEUR_NORMALE}" + ask_yesno "Voulez-vous valider l'intégration de la version?" N && control=COMMIT || control=ABORT + fi + if [ "$control" == COMMIT ]; then + array_from_lines tmpfiles "$(git status --porcelain | awk '{print substr($0, 4)}')" + for tmpfile in "${tmpfiles[@]}"; do + if grep -qE '^(<<<<<<<|=======|>>>>>>>)' "$tmpfile"; then + ewarn "Vous avez choisi de valider l'intégration des modifications mais..." + ewarn "$tmpfile: ce fichier semble encore contenir des marques de conflit" + if ! ask_yesno -y "Etes-vous sûr d'avoir correctement édité le fichier?" N; then + eecho "Annulation de l'intégration de la version" + control=ABORT + break + fi + fi + done + fi + if [ "$control" == ABORT ]; then + enote "Vous pouvez reprendre l'intégration de la version $version avec la commande pff -g" + break # abort + fi fi - [ -f "$controldir/ABORT" ] && break # récupérer les versions modifiées et supprimer les fichiers de patch for vlfile in "${vlfiles[@]}"; do setx pfile=get_pfile "${vlfile%__pv-${version}__}" "$profile" "$pffdir" @@ -1499,8 +1540,8 @@ autopatch=1 version= disttype=auto ORIGEXTS=("${DEFAULT_ORIGEXTS[@]}") -PROTECTS=("${DEFAULT_PROTECTS[@]}") unwrap=auto +merge_strategy= commit_policy=ask profile= alternate= @@ -1519,6 +1560,8 @@ args=($parse_mode --no-unwrap unwrap= -E,--unwrap unwrap=1 -g,--patch action=patch + -o,--ours merge_strategy=ours + --theirs merge_strategy=theirs --ask-commit commit_policy=ask -c,--comit commit_policy=1 --no-commit commit_policy= @@ -1542,8 +1585,8 @@ array_fix_paths ORIGEXTS case "$action" in init) init_cmd "$@";; -new) new_cmd "$autopatch" "$version" "$disttype" "$unwrap" "$commit_policy" "$@";; -patch) patch_cmd "$commit_policy" "$@";; +new) new_cmd "$autopatch" "$version" "$disttype" "$unwrap" "$merge_strategy" "$commit_policy" "$@";; +patch) patch_cmd "$merge_strategy" "$commit_policy" "$@";; add-global) add_global_cmd "$@";; list-locals) list_locals_cmd "$@";; list-profiles) list_profiles_cmd "$@";;