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:

committed by
Junio C Hamano

parent
74703a1e4d
commit
0ea306ef17
@ -5,6 +5,9 @@
|
|||||||
#include "pathspec.h"
|
#include "pathspec.h"
|
||||||
#include "dir.h"
|
#include "dir.h"
|
||||||
#include "utf8.h"
|
#include "utf8.h"
|
||||||
|
#include "submodule.h"
|
||||||
|
#include "submodule-config.h"
|
||||||
|
#include "string-list.h"
|
||||||
|
|
||||||
struct module_list {
|
struct module_list {
|
||||||
const struct cache_entry **entries;
|
const struct cache_entry **entries;
|
||||||
@ -102,6 +105,24 @@ static int module_list(int argc, const char **argv, const char *prefix)
|
|||||||
return 0;
|
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 {
|
struct cmd_struct {
|
||||||
const char *cmd;
|
const char *cmd;
|
||||||
@ -110,6 +131,7 @@ struct cmd_struct {
|
|||||||
|
|
||||||
static struct cmd_struct commands[] = {
|
static struct cmd_struct commands[] = {
|
||||||
{"list", module_list},
|
{"list", module_list},
|
||||||
|
{"name", module_name},
|
||||||
};
|
};
|
||||||
|
|
||||||
int cmd_submodule__helper(int argc, const char **argv, const char *prefix)
|
int cmd_submodule__helper(int argc, const char **argv, const char *prefix)
|
||||||
|
@ -178,24 +178,6 @@ get_submodule_config () {
|
|||||||
printf '%s' "${value:-$default}"
|
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
|
# Clone a submodule
|
||||||
#
|
#
|
||||||
@ -498,7 +480,7 @@ cmd_foreach()
|
|||||||
then
|
then
|
||||||
displaypath=$(relative_path "$sm_path")
|
displaypath=$(relative_path "$sm_path")
|
||||||
say "$(eval_gettext "Entering '\$prefix\$displaypath'")"
|
say "$(eval_gettext "Entering '\$prefix\$displaypath'")"
|
||||||
name=$(module_name "$sm_path")
|
name=$(git submodule--helper name "$sm_path")
|
||||||
(
|
(
|
||||||
prefix="$prefix$sm_path/"
|
prefix="$prefix$sm_path/"
|
||||||
clear_local_git_env
|
clear_local_git_env
|
||||||
@ -554,7 +536,7 @@ cmd_init()
|
|||||||
while read mode sha1 stage sm_path
|
while read mode sha1 stage sm_path
|
||||||
do
|
do
|
||||||
die_if_unmatched "$mode"
|
die_if_unmatched "$mode"
|
||||||
name=$(module_name "$sm_path") || exit
|
name=$(git submodule--helper name "$sm_path") || exit
|
||||||
|
|
||||||
displaypath=$(relative_path "$sm_path")
|
displaypath=$(relative_path "$sm_path")
|
||||||
|
|
||||||
@ -636,7 +618,7 @@ cmd_deinit()
|
|||||||
while read mode sha1 stage sm_path
|
while read mode sha1 stage sm_path
|
||||||
do
|
do
|
||||||
die_if_unmatched "$mode"
|
die_if_unmatched "$mode"
|
||||||
name=$(module_name "$sm_path") || exit
|
name=$(git submodule--helper name "$sm_path") || exit
|
||||||
|
|
||||||
displaypath=$(relative_path "$sm_path")
|
displaypath=$(relative_path "$sm_path")
|
||||||
|
|
||||||
@ -758,7 +740,7 @@ cmd_update()
|
|||||||
echo >&2 "Skipping unmerged submodule $prefix$sm_path"
|
echo >&2 "Skipping unmerged submodule $prefix$sm_path"
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
name=$(module_name "$sm_path") || exit
|
name=$(git submodule--helper name "$sm_path") || exit
|
||||||
url=$(git config submodule."$name".url)
|
url=$(git config submodule."$name".url)
|
||||||
branch=$(get_submodule_config "$name" branch master)
|
branch=$(get_submodule_config "$name" branch master)
|
||||||
if ! test -z "$update"
|
if ! test -z "$update"
|
||||||
@ -1022,7 +1004,7 @@ cmd_summary() {
|
|||||||
# Respect the ignore setting for --for-status.
|
# Respect the ignore setting for --for-status.
|
||||||
if test -n "$for_status"
|
if test -n "$for_status"
|
||||||
then
|
then
|
||||||
name=$(module_name "$sm_path")
|
name=$(git submodule--helper name "$sm_path")
|
||||||
ignore_config=$(get_submodule_config "$name" ignore none)
|
ignore_config=$(get_submodule_config "$name" ignore none)
|
||||||
test $status != A && test $ignore_config = all && continue
|
test $status != A && test $ignore_config = all && continue
|
||||||
fi
|
fi
|
||||||
@ -1184,7 +1166,7 @@ cmd_status()
|
|||||||
while read mode sha1 stage sm_path
|
while read mode sha1 stage sm_path
|
||||||
do
|
do
|
||||||
die_if_unmatched "$mode"
|
die_if_unmatched "$mode"
|
||||||
name=$(module_name "$sm_path") || exit
|
name=$(git submodule--helper name "$sm_path") || exit
|
||||||
url=$(git config submodule."$name".url)
|
url=$(git config submodule."$name".url)
|
||||||
displaypath=$(relative_path "$prefix$sm_path")
|
displaypath=$(relative_path "$prefix$sm_path")
|
||||||
if test "$stage" = U
|
if test "$stage" = U
|
||||||
@ -1261,7 +1243,7 @@ cmd_sync()
|
|||||||
while read mode sha1 stage sm_path
|
while read mode sha1 stage sm_path
|
||||||
do
|
do
|
||||||
die_if_unmatched "$mode"
|
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)
|
url=$(git config -f .gitmodules --get submodule."$name".url)
|
||||||
|
|
||||||
# Possibly a url relative to parent
|
# Possibly a url relative to parent
|
||||||
|
Reference in New Issue
Block a user