submodule--helper: convert the bulk of cmd_add() to C
Introduce the 'add' subcommand to `submodule--helper.c` that does all the work 'submodule add' past the parsing of flags. We also remove the constness of the sm_path field of the `add_data` struct. This is needed so that it can be modified by normalize_path_copy(). As with the previous conversions, this is meant to be a faithful conversion with no modification to the behaviour of `submodule add`. Signed-off-by: Atharva Raykar <raykar.ath@gmail.com> Mentored-by: Christian Couder <christian.couder@gmail.com> Helped-by: Kaartic Sivaraam <kaartic.sivaraam@gmail.com> Mentored-by: Shourya Shukla <periperidip@gmail.com> Based-on-patch-by: Shourya Shukla <periperidip@gmail.com> Based-on-patch-by: Prathamesh Chavan <pc44800@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
ed86301f68
commit
a6226fd772
@ -145,104 +145,12 @@ cmd_add()
|
||||
shift
|
||||
done
|
||||
|
||||
if ! git submodule--helper config --check-writeable >/dev/null 2>&1
|
||||
if test -z "$1"
|
||||
then
|
||||
die "fatal: $(eval_gettext "please make sure that the .gitmodules file is in the working tree")"
|
||||
fi
|
||||
|
||||
if test -n "$reference_path"
|
||||
then
|
||||
is_absolute_path "$reference_path" ||
|
||||
reference_path="$wt_prefix$reference_path"
|
||||
|
||||
reference="--reference=$reference_path"
|
||||
fi
|
||||
|
||||
repo=$1
|
||||
sm_path=$2
|
||||
|
||||
if test -z "$sm_path"; then
|
||||
sm_path=$(printf '%s\n' "$repo" |
|
||||
sed -e 's|/$||' -e 's|:*/*\.git$||' -e 's|.*[/:]||g')
|
||||
fi
|
||||
|
||||
if test -z "$repo" || test -z "$sm_path"; then
|
||||
usage
|
||||
fi
|
||||
|
||||
is_absolute_path "$sm_path" || sm_path="$wt_prefix$sm_path"
|
||||
|
||||
# assure repo is absolute or relative to parent
|
||||
case "$repo" in
|
||||
./*|../*)
|
||||
test -z "$wt_prefix" ||
|
||||
die "fatal: $(gettext "Relative path can only be used from the toplevel of the working tree")"
|
||||
|
||||
# dereference source url relative to parent's url
|
||||
realrepo=$(git submodule--helper resolve-relative-url "$repo") || exit
|
||||
;;
|
||||
*:*|/*)
|
||||
# absolute url
|
||||
realrepo=$repo
|
||||
;;
|
||||
*)
|
||||
die "fatal: $(eval_gettext "repo URL: '\$repo' must be absolute or begin with ./|../")"
|
||||
;;
|
||||
esac
|
||||
|
||||
# normalize path:
|
||||
# multiple //; leading ./; /./; /../; trailing /
|
||||
sm_path=$(printf '%s/\n' "$sm_path" |
|
||||
sed -e '
|
||||
s|//*|/|g
|
||||
s|^\(\./\)*||
|
||||
s|/\(\./\)*|/|g
|
||||
:start
|
||||
s|\([^/]*\)/\.\./||
|
||||
tstart
|
||||
s|/*$||
|
||||
')
|
||||
if test -z "$force"
|
||||
then
|
||||
git ls-files --error-unmatch "$sm_path" > /dev/null 2>&1 &&
|
||||
die "fatal: $(eval_gettext "'\$sm_path' already exists in the index")"
|
||||
else
|
||||
git ls-files -s "$sm_path" | sane_grep -v "^160000" > /dev/null 2>&1 &&
|
||||
die "fatal: $(eval_gettext "'\$sm_path' already exists in the index and is not a submodule")"
|
||||
fi
|
||||
|
||||
if test -d "$sm_path" &&
|
||||
test -z $(git -C "$sm_path" rev-parse --show-cdup 2>/dev/null)
|
||||
then
|
||||
git -C "$sm_path" rev-parse --verify -q HEAD >/dev/null ||
|
||||
die "fatal: $(eval_gettext "'\$sm_path' does not have a commit checked out")"
|
||||
fi
|
||||
|
||||
if test -z "$force"
|
||||
then
|
||||
dryerr=$(git add --dry-run --ignore-missing --no-warn-embedded-repo "$sm_path" 2>&1 >/dev/null)
|
||||
res=$?
|
||||
if test $res -ne 0
|
||||
then
|
||||
echo >&2 "$dryerr"
|
||||
exit $res
|
||||
fi
|
||||
fi
|
||||
|
||||
if test -n "$custom_name"
|
||||
then
|
||||
sm_name="$custom_name"
|
||||
else
|
||||
sm_name="$sm_path"
|
||||
fi
|
||||
|
||||
if ! git submodule--helper check-name "$sm_name"
|
||||
then
|
||||
die "fatal: $(eval_gettext "'$sm_name' is not a valid submodule name")"
|
||||
fi
|
||||
|
||||
git submodule--helper add-clone ${GIT_QUIET:+--quiet} ${force:+"--force"} ${progress:+"--progress"} ${branch:+--branch "$branch"} --prefix "$wt_prefix" --path "$sm_path" --name "$sm_name" --url "$realrepo" ${reference:+"$reference"} ${dissociate:+"--dissociate"} ${depth:+"$depth"} || exit
|
||||
git submodule--helper add-config ${force:+--force} ${branch:+--branch "$branch"} --url "$repo" --resolved-url "$realrepo" --path "$sm_path" --name "$sm_name"
|
||||
git ${wt_prefix:+-C "$wt_prefix"} ${prefix:+--super-prefix "$prefix"} submodule--helper add ${GIT_QUIET:+--quiet} ${force:+--force} ${progress:+"--progress"} ${branch:+--branch "$branch"} ${reference_path:+--reference "$reference_path"} ${dissociate:+--dissociate} ${custom_name:+--name "$custom_name"} ${depth:+"$depth"} -- "$@"
|
||||
}
|
||||
|
||||
#
|
||||
|
Reference in New Issue
Block a user