submodule: move core cmd_update() logic to C
This patch completes the conversion past the flag parsing of `submodule update` by introducing a helper subcommand called `submodule--helper update`. The behaviour of `submodule update` should remain the same after this patch. Prior to this patch, `submodule update` was implemented by piping the output of `update-clone` (which clones all missing submodules, then prints relevant information for all submodules) into `run-update-procedure` (which reads the information and updates the submodule tree). With `submodule--helper update`, we iterate over the submodules and update the submodule tree in the same process. This reuses most of existing code structure, except that `update_submodule()` now updates the submodule tree (instead of printing submodule information to be consumed by another process). Recursing on a submodule is done by calling a subprocess that launches `submodule--helper update`, with a modified `--recursive-prefix` and `--prefix` parameter. Mentored-by: Christian Couder <christian.couder@gmail.com> Mentored-by: Shourya Shukla <periperidip@gmail.com> Signed-off-by: Atharva Raykar <raykar.ath@gmail.com> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Glen Choo <chooglen@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
75df9df0f8
commit
b3c5f5cb04
104
git-submodule.sh
104
git-submodule.sh
@ -51,14 +51,6 @@ jobs=
|
||||
recommend_shallow=
|
||||
filter=
|
||||
|
||||
die_if_unmatched ()
|
||||
{
|
||||
if test "$1" = "#unmatched"
|
||||
then
|
||||
exit ${2:-1}
|
||||
fi
|
||||
}
|
||||
|
||||
isnumber()
|
||||
{
|
||||
n=$(($1 + 0)) 2>/dev/null && test "$n" = "$1"
|
||||
@ -356,11 +348,14 @@ cmd_update()
|
||||
shift
|
||||
done
|
||||
|
||||
{
|
||||
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper update-clone \
|
||||
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper update \
|
||||
${GIT_QUIET:+--quiet} \
|
||||
${force:+--force} \
|
||||
${progress:+"--progress"} \
|
||||
${remote:+--remote} \
|
||||
${recursive:+--recursive} \
|
||||
${init:+--init} \
|
||||
${nofetch:+--no-fetch} \
|
||||
${wt_prefix:+--prefix "$wt_prefix"} \
|
||||
${prefix:+--recursive-prefix "$prefix"} \
|
||||
${update:+--update "$update"} \
|
||||
@ -368,98 +363,13 @@ cmd_update()
|
||||
${dissociate:+"--dissociate"} \
|
||||
${depth:+"$depth"} \
|
||||
${require_init:+--require-init} \
|
||||
${dissociate:+"--dissociate"} \
|
||||
$single_branch \
|
||||
$recommend_shallow \
|
||||
$jobs \
|
||||
$filter \
|
||||
-- \
|
||||
"$@" || echo "#unmatched" $?
|
||||
} | {
|
||||
err=
|
||||
while read -r quickabort sha1 just_cloned sm_path
|
||||
do
|
||||
die_if_unmatched "$quickabort" "$sha1"
|
||||
|
||||
displaypath=$(git submodule--helper relative-path "$prefix$sm_path" "$wt_prefix")
|
||||
|
||||
if test $just_cloned -eq 0
|
||||
then
|
||||
just_cloned=
|
||||
fi
|
||||
|
||||
out=$(git submodule--helper run-update-procedure \
|
||||
${wt_prefix:+--prefix "$wt_prefix"} \
|
||||
${GIT_QUIET:+--quiet} \
|
||||
${force:+--force} \
|
||||
${just_cloned:+--just-cloned} \
|
||||
${nofetch:+--no-fetch} \
|
||||
${depth:+"$depth"} \
|
||||
${update:+--update "$update"} \
|
||||
${prefix:+--recursive-prefix "$prefix"} \
|
||||
${sha1:+--oid "$sha1"} \
|
||||
${remote:+--remote} \
|
||||
"--" \
|
||||
"$sm_path")
|
||||
|
||||
# exit codes for run-update-procedure:
|
||||
# 0: update was successful, say command output
|
||||
# 1: update procedure failed, but should not die
|
||||
# 128: subcommand died during execution
|
||||
# 3: no update procedure was run
|
||||
res="$?"
|
||||
case $res in
|
||||
0)
|
||||
say "$out"
|
||||
;;
|
||||
1)
|
||||
err="${err};$out"
|
||||
continue
|
||||
;;
|
||||
128)
|
||||
printf >&2 "$out"
|
||||
exit $res
|
||||
;;
|
||||
esac
|
||||
|
||||
if test -n "$recursive"
|
||||
then
|
||||
(
|
||||
prefix=$(git submodule--helper relative-path "$prefix$sm_path/" "$wt_prefix")
|
||||
wt_prefix=
|
||||
sanitize_submodule_env
|
||||
cd "$sm_path" &&
|
||||
eval cmd_update
|
||||
)
|
||||
res=$?
|
||||
if test $res -gt 0
|
||||
then
|
||||
die_msg="fatal: $(eval_gettext "Failed to recurse into submodule path '\$displaypath'")"
|
||||
if test $res -ne 2
|
||||
then
|
||||
err="${err};$die_msg"
|
||||
continue
|
||||
else
|
||||
die_with_status $res "$die_msg"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
if test -n "$err"
|
||||
then
|
||||
OIFS=$IFS
|
||||
IFS=';'
|
||||
for e in $err
|
||||
do
|
||||
if test -n "$e"
|
||||
then
|
||||
echo >&2 "$e"
|
||||
fi
|
||||
done
|
||||
IFS=$OIFS
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
"$@"
|
||||
}
|
||||
|
||||
#
|
||||
|
||||
Reference in New Issue
Block a user