Re: [PATCH 4/7] submodule-config: check if a submodule is in a group

2016-05-10 Thread Junio C Hamano
Stefan Beller  writes:

> +static int in_group(int argc, const char **argv, const char *prefix)
> + ...
> + if (!group)
> + list = git_config_get_value_multi("submodule.updateGroup");
> + else {
> + string_list_split(_list, group, ',', -1);

Is this expected to be used only by test scripts, or will it have
real scripted Porcelain as its users?  I am wondering if
concatenation with ' ' would be more natural if it is the latter (if
only used for testing, I don't care that much).

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 4/7] submodule-config: check if a submodule is in a group

2016-05-10 Thread Stefan Beller
In later patches we need to tell if a submodule is in a group,
so expose a handy test function in both C and shell.

Signed-off-by: Stefan Beller 
---
 builtin/submodule--helper.c  | 42 +++-
 submodule-config.c   | 50 ++
 submodule-config.h   |  3 +++
 t/t7412-submodule--helper.sh | 58 
 4 files changed, 152 insertions(+), 1 deletion(-)

diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index d3f4684..6ffd1c1 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -858,6 +858,45 @@ static int valid_label_name(int argc, const char **argv, 
const char *prefix)
  "and must contain alphanumeric characters or dashes only."));
 }
 
+static int in_group(int argc, const char **argv, const char *prefix)
+{
+   const struct string_list *list;
+   struct string_list actual_list = STRING_LIST_INIT_DUP;
+   const struct submodule *sub;
+   const char *group = NULL;
+
+   struct option default_group_options[] = {
+   OPT_STRING('g', "group", , N_("group"),
+   N_("comma separated group specifier for 
submodules")),
+   OPT_END()
+   };
+
+   const char *const git_submodule_helper_usage[] = {
+   N_("git submodule--helper in-group "),
+   NULL
+   };
+
+   argc = parse_options(argc, argv, prefix, default_group_options,
+git_submodule_helper_usage, 0);
+
+   gitmodules_config();
+   git_config(submodule_config, NULL);
+
+   if (argc != 1)
+   usage(git_submodule_helper_usage[0]);
+
+   sub = submodule_from_path(null_sha1, argv[0]);
+
+   if (!group)
+   list = git_config_get_value_multi("submodule.updateGroup");
+   else {
+   string_list_split(_list, group, ',', -1);
+   list = _list;
+   }
+
+   return !submodule_in_group(list, sub);
+}
+
 struct cmd_struct {
const char *cmd;
int (*fn)(int, const char **, const char *);
@@ -871,7 +910,8 @@ static struct cmd_struct commands[] = {
{"resolve-relative-url", resolve_relative_url},
{"resolve-relative-url-test", resolve_relative_url_test},
{"init", module_init},
-   {"valid-label-name", valid_label_name}
+   {"valid-label-name", valid_label_name},
+   {"in-group", in_group}
 };
 
 int cmd_submodule__helper(int argc, const char **argv, const char *prefix)
diff --git a/submodule-config.c b/submodule-config.c
index 0cdb47e..7f38ebd 100644
--- a/submodule-config.c
+++ b/submodule-config.c
@@ -522,3 +522,53 @@ void submodule_free(void)
cache_free();
is_cache_init = 0;
 }
+
+int submodule_in_group(const struct string_list *group,
+  const struct submodule *sub)
+{
+   int matched = 0;
+   struct strbuf sb = STRBUF_INIT;
+
+   if (!group)
+   /*
+* If no group is specified at all, all submodules match to
+* keep traditional behavior.
+*/
+   return 1;
+
+   if (sub->labels) {
+   struct string_list_item *item;
+   for_each_string_list_item(item, sub->labels) {
+   strbuf_reset();
+   strbuf_addf(, "*%s", item->string);
+   if (string_list_has_string(group, sb.buf)) {
+   matched = 1;
+   break;
+   }
+   }
+   }
+   if (sub->path) {
+   /*
+* NEEDSWORK: This currently works only for
+* exact paths, but we want to enable
+* inexact matches such wildcards.
+*/
+   strbuf_reset();
+   strbuf_addf(, "./%s", sub->path);
+   if (string_list_has_string(group, sb.buf))
+   matched = 1;
+   }
+   if (sub->name) {
+   /*
+* NEEDSWORK: Same as with path. Do we want to
+* support wildcards or such?
+*/
+   strbuf_reset();
+   strbuf_addf(, ":%s", sub->name);
+   if (string_list_has_string(group, sb.buf))
+   matched = 1;
+   }
+   strbuf_release();
+
+   return matched;
+}
diff --git a/submodule-config.h b/submodule-config.h
index d57da59..4c696cc 100644
--- a/submodule-config.h
+++ b/submodule-config.h
@@ -31,4 +31,7 @@ const struct submodule *submodule_from_path(const unsigned 
char *commit_sha1,
const char *path);
 void submodule_free(void);
 
+int submodule_in_group(const struct string_list *group,
+  const struct submodule *sub);
+
 #endif /* SUBMODULE_CONFIG_H */
diff --git a/t/t7412-submodule--helper.sh