submodule: rewrite module_name
shell function in C
This implements the helper `name` in C instead of shell, yielding a nice performance boost. Before this patch, I measured a time (best out of three): $ time ./t7400-submodule-basic.sh >/dev/null real 0m11.066s user 0m3.348s sys 0m8.534s With this patch applied I measured (also best out of three) $ time ./t7400-submodule-basic.sh >/dev/null real 0m10.063s user 0m3.044s sys 0m7.487s Signed-off-by: Stefan Beller <sbeller@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
74703a1e4d
commit
0ea306ef17
@ -5,6 +5,9 @@
|
||||
#include "pathspec.h"
|
||||
#include "dir.h"
|
||||
#include "utf8.h"
|
||||
#include "submodule.h"
|
||||
#include "submodule-config.h"
|
||||
#include "string-list.h"
|
||||
|
||||
struct module_list {
|
||||
const struct cache_entry **entries;
|
||||
@ -102,6 +105,24 @@ static int module_list(int argc, const char **argv, const char *prefix)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int module_name(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
const struct submodule *sub;
|
||||
|
||||
if (argc != 2)
|
||||
usage(_("git submodule--helper name <path>"));
|
||||
|
||||
gitmodules_config();
|
||||
sub = submodule_from_path(null_sha1, argv[1]);
|
||||
|
||||
if (!sub)
|
||||
die(_("no submodule mapping found in .gitmodules for path '%s'"),
|
||||
argv[1]);
|
||||
|
||||
printf("%s\n", sub->name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct cmd_struct {
|
||||
const char *cmd;
|
||||
@ -110,6 +131,7 @@ struct cmd_struct {
|
||||
|
||||
static struct cmd_struct commands[] = {
|
||||
{"list", module_list},
|
||||
{"name", module_name},
|
||||
};
|
||||
|
||||
int cmd_submodule__helper(int argc, const char **argv, const char *prefix)
|
||||
|
@ -178,24 +178,6 @@ get_submodule_config () {
|
||||
printf '%s' "${value:-$default}"
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# Map submodule path to submodule name
|
||||
#
|
||||
# $1 = path
|
||||
#
|
||||
module_name()
|
||||
{
|
||||
# Do we have "submodule.<something>.path = $1" defined in .gitmodules file?
|
||||
sm_path="$1"
|
||||
re=$(printf '%s\n' "$1" | sed -e 's/[].[^$\\*]/\\&/g')
|
||||
name=$( git config -f .gitmodules --get-regexp '^submodule\..*\.path$' |
|
||||
sed -n -e 's|^submodule\.\(.*\)\.path '"$re"'$|\1|p' )
|
||||
test -z "$name" &&
|
||||
die "$(eval_gettext "No submodule mapping found in .gitmodules for path '\$sm_path'")"
|
||||
printf '%s\n' "$name"
|
||||
}
|
||||
|
||||
#
|
||||
# Clone a submodule
|
||||
#
|
||||
@ -498,7 +480,7 @@ cmd_foreach()
|
||||
then
|
||||
displaypath=$(relative_path "$sm_path")
|
||||
say "$(eval_gettext "Entering '\$prefix\$displaypath'")"
|
||||
name=$(module_name "$sm_path")
|
||||
name=$(git submodule--helper name "$sm_path")
|
||||
(
|
||||
prefix="$prefix$sm_path/"
|
||||
clear_local_git_env
|
||||
@ -554,7 +536,7 @@ cmd_init()
|
||||
while read mode sha1 stage sm_path
|
||||
do
|
||||
die_if_unmatched "$mode"
|
||||
name=$(module_name "$sm_path") || exit
|
||||
name=$(git submodule--helper name "$sm_path") || exit
|
||||
|
||||
displaypath=$(relative_path "$sm_path")
|
||||
|
||||
@ -636,7 +618,7 @@ cmd_deinit()
|
||||
while read mode sha1 stage sm_path
|
||||
do
|
||||
die_if_unmatched "$mode"
|
||||
name=$(module_name "$sm_path") || exit
|
||||
name=$(git submodule--helper name "$sm_path") || exit
|
||||
|
||||
displaypath=$(relative_path "$sm_path")
|
||||
|
||||
@ -758,7 +740,7 @@ cmd_update()
|
||||
echo >&2 "Skipping unmerged submodule $prefix$sm_path"
|
||||
continue
|
||||
fi
|
||||
name=$(module_name "$sm_path") || exit
|
||||
name=$(git submodule--helper name "$sm_path") || exit
|
||||
url=$(git config submodule."$name".url)
|
||||
branch=$(get_submodule_config "$name" branch master)
|
||||
if ! test -z "$update"
|
||||
@ -1022,7 +1004,7 @@ cmd_summary() {
|
||||
# Respect the ignore setting for --for-status.
|
||||
if test -n "$for_status"
|
||||
then
|
||||
name=$(module_name "$sm_path")
|
||||
name=$(git submodule--helper name "$sm_path")
|
||||
ignore_config=$(get_submodule_config "$name" ignore none)
|
||||
test $status != A && test $ignore_config = all && continue
|
||||
fi
|
||||
@ -1184,7 +1166,7 @@ cmd_status()
|
||||
while read mode sha1 stage sm_path
|
||||
do
|
||||
die_if_unmatched "$mode"
|
||||
name=$(module_name "$sm_path") || exit
|
||||
name=$(git submodule--helper name "$sm_path") || exit
|
||||
url=$(git config submodule."$name".url)
|
||||
displaypath=$(relative_path "$prefix$sm_path")
|
||||
if test "$stage" = U
|
||||
@ -1261,7 +1243,7 @@ cmd_sync()
|
||||
while read mode sha1 stage sm_path
|
||||
do
|
||||
die_if_unmatched "$mode"
|
||||
name=$(module_name "$sm_path")
|
||||
name=$(git submodule--helper name "$sm_path")
|
||||
url=$(git config -f .gitmodules --get submodule."$name".url)
|
||||
|
||||
# Possibly a url relative to parent
|
||||
|
Loading…
Reference in New Issue
Block a user