nulib/bin_wip/npu

148 lines
5.1 KiB
Bash
Executable File

#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/../load.sh" || exit 1
require: git
function _git_update() {
local branch
local -a prbranches crbranches dbranches
setx -a prbranches=git_list_rbranches
git fetch -p "$@" || return
setx -a crbranches=git_list_rbranches
# vérifier s'il y a des branches distantes qui ont été supprimées
for branch in "${prbranches[@]}"; do
if ! array_contains crbranches "$branch"; then
array_add dbranches "${branch#*/}"
fi
done
if [ ${#dbranches[*]} -gt 0 ]; then
setx -a branches=git_list_branches
setx branch=git_get_branch
eimportant "One or more distant branches where deleted"
if git_check_cleancheckout; then
einfo "Delete the obsolete local branches with these commands:"
else
ewarn "Take care of uncommitted local changes first"
einfo "Then delete the obsolete local branches with these commands:"
fi
if array_contains dbranches "$branch"; then
# si la branche courante est l'une des branches à supprimer, il faut
# basculer vers develop ou master
local swto
if [ -z "$swto" ] && array_contains branches develop && ! array_contains dbranches develop; then
swto=develop
fi
if [ -z "$swto" ] && array_contains branches master && ! array_contains dbranches master; then
swto=master
fi
[ -n "$swto" ] && qvals git checkout "$swto"
fi
qvals git branch -D "${dbranches[@]}"
return 1
fi
# intégrer les modifications des branches locales
if ! git_check_cleancheckout; then
setx branch=git_get_branch
setx remote=git_get_branch_remote "$branch"
setx rbranch=git_get_branch_rbranch "$branch" "$remote"
pbranch="${rbranch#refs/remotes/}"
if git merge -q --ff-only "$rbranch"; then
enote "There are uncommitted local changes: only CURRENT branch were updated"
fi
return 0
fi
setx -a branches=git_list_branches
restore_branch=
for branch in "${branches[@]}"; do
setx remote=git_get_branch_remote "$branch"
setx rbranch=git_get_branch_rbranch "$branch" "$remote"
pbranch="${rbranch#refs/remotes/}"
[ -n "$remote" -a -n "$rbranch" ] || continue
if git_is_ancestor "$branch" "$rbranch"; then
if git_should_ff "$branch" "$rbranch"; then
einfo "Fast-forwarding $branch -> $pbranch"
git checkout -q "$branch"
git merge -q --ff-only "$rbranch"
restore_branch=1
fi
else
if [ "$branch" == "$orig_branch" ]; then
echo "* Cannot fast-forward CURRENT branch $branch from $pbranch
Try to merge manually with: git merge $pbranch"
else
echo "* Cannot fast-forward local branch $branch from $pbranch
You can merge manually with: git checkout $branch; git merge $pbranch"
fi
fi
done
[ -n "$restore_branch" ] && git checkout -q "$orig_branch"
return 0
}
function git_update() {
local cwd r
setx cwd=ppath2 "$(pwd)" "$OrigCwd"
etitle "$cwd"
_git_update "$@"; r=$?
eend
return $r
}
chdir=
all=
Remote=
Autoff=1
Reset=ask
args=(
"\
mettre à jour les branches locales
si la branche courante est une branche wip, écraser les modifications locales éventuelles après un avertissement.
sinon, ne mettre à jour la branche locale qu'en mode fast-forward"
#"usage"
-d:,--chdir:BASEDIR chdir= "répertoire dans lequel se placer avant de lancer les opérations"
-a,--all all=1 "faire l'opération sur tous les sous-répertoires de BASEDIR qui sont des dépôts git"
-o:,--remote Remote= "spécifier le remote depuis lequel faire le fetch"
--autoff Autoff=1 "s'il n'y a pas de modifications locales, faire un fast-forward de toutes les branches traquées. c'est l'option par défaut."
-l,--no-autoff Autoff= "ne pas faire de fast-forward automatique des branches traquées. seule la branche courante est mise à jour"
--reset Reset=1 "écraser les modifications locales si la branche courante est une branche wip"
-n,--no-reset Reset= "ne jamais écraser les modifications locales, même si la branche courante est une branche wip"
)
parse_args "$@"; set -- "${args[@]}"
setx OrigCwd=pwd
if [ -n "$chdir" ]; then
cd "$chdir" || die
fi
if [ -n "$all" ]; then
# liste de sous répertoires
if [ $# -gt 0 ]; then
# si on a une liste de patterns, l'utiliser
setx -a dirs=ls_dirs . "$@"
else
dirs=()
for dir in */.git; do
[ -d "$dir" ] || continue
dirs+=("${dir%/.git}")
done
fi
setx cwd=pwd
for dir in "${dirs[@]}"; do
cd "$dir" || die
git_update || die
cd "$cwd"
done
else
# répertoire courant uniquement
args=()
isatty || args+=(--porcelain)
git_update "${args[@]}"
fi