2023-11-16 08:20:24 +04:00
|
|
|
#!/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
|
|
|
|
|
2024-06-09 12:30:03 +04:00
|
|
|
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=
|
2024-06-04 09:01:24 +04:00
|
|
|
all=
|
2024-06-09 12:30:03 +04:00
|
|
|
Remote=
|
|
|
|
Autoff=1
|
|
|
|
Reset=ask
|
2023-11-16 08:20:24 +04:00
|
|
|
args=(
|
|
|
|
"\
|
|
|
|
mettre à jour les branches locales
|
|
|
|
|
2023-11-16 16:42:28 +04:00
|
|
|
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"
|
2023-11-16 08:20:24 +04:00
|
|
|
#"usage"
|
2024-06-09 12:30:03 +04:00
|
|
|
-d:,--chdir:BASEDIR chdir= "répertoire dans lequel se placer avant de lancer les opérations"
|
2024-06-04 09:01:24 +04:00
|
|
|
-a,--all all=1 "faire l'opération sur tous les sous-répertoires de BASEDIR qui sont des dépôts git"
|
2024-06-09 12:30:03 +04:00
|
|
|
-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"
|
2023-11-16 08:20:24 +04:00
|
|
|
)
|
|
|
|
parse_args "$@"; set -- "${args[@]}"
|
|
|
|
|
2024-06-09 12:30:03 +04:00
|
|
|
|
|
|
|
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
|