From: Stefan Beller <sbeller@google.com>
To: jrnieder@gmail.com, gitster@pobox.com, Jens.Lehmann@web.de
Cc: git@vger.kernel.org, pclouds@gmail.com,
Stefan Beller <sbeller@google.com>
Subject: [PATCH 4/7] submodule-config: check if a submodule is in a group
Date: Tue, 10 May 2016 17:59:54 -0700 [thread overview]
Message-ID: <1462928397-1708-5-git-send-email-sbeller@google.com> (raw)
In-Reply-To: <1462928397-1708-1-git-send-email-sbeller@google.com>
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 <sbeller@google.com>
---
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", &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 <path>"),
+ 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(&actual_list, group, ',', -1);
+ list = &actual_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(&cache);
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(&sb);
+ strbuf_addf(&sb, "*%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(&sb);
+ strbuf_addf(&sb, "./%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(&sb);
+ strbuf_addf(&sb, ":%s", sub->name);
+ if (string_list_has_string(group, sb.buf))
+ matched = 1;
+ }
+ strbuf_release(&sb);
+
+ 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 b/t/t7412-submodule--helper.sh
index 3af315c..042f3f5 100755
--- a/t/t7412-submodule--helper.sh
+++ b/t/t7412-submodule--helper.sh
@@ -46,4 +46,62 @@ test_expect_success 'valid-label-name fails with utf8 characters' '
test_i18ngrep alphanumeric actual
'
+test_expect_success 'setup superproject with submodules' '
+
+ mkdir sub &&
+ (
+ cd sub &&
+ git init &&
+ test_commit test
+ test_commit test2
+ ) &&
+ mkdir super &&
+ (
+ cd super &&
+ git init &&
+ git submodule add ../sub sub0 &&
+ git submodule add -l bit1 ../sub sub1 &&
+ git submodule add -l bit2 ../sub sub2 &&
+ git submodule add -l bit2 -l bit1 ../sub sub3 &&
+ git submodule add ../sub sub_name &&
+ git mv sub_name sub_path &&
+ git commit -m "add labeled submodules"
+ )
+'
+
+test_expect_success 'in-group' '
+ (
+ cd super &&
+ # we do not specify a group nor have set a default group,
+ # any submodule should be in the default group:
+ git submodule--helper in-group sub0 &&
+ git submodule--helper in-group sub1 &&
+ git submodule--helper in-group sub2 &&
+ git submodule--helper in-group sub3 &&
+
+ # test bit1:
+ test_must_fail git submodule--helper in-group --group=\*bit1 sub0 &&
+ git submodule--helper in-group --group=\*bit1 sub1 &&
+ test_must_fail git submodule--helper in-group --group=\*bit1 sub2 &&
+ git submodule--helper in-group --group=\*bit1 sub3 &&
+ test_must_fail git submodule--helper in-group --group=\*bit1 sub_path &&
+
+ # test by path:
+ git submodule--helper in-group --group=./sub0 sub0 &&
+ test_must_fail git submodule--helper in-group --group=./sub0 sub1 &&
+ test_must_fail git submodule--helper in-group --group=./sub0 sub_path &&
+
+ # tests by name:
+ git submodule--helper in-group --group=:sub0 sub0 &&
+ test_must_fail git submodule--helper in-group --group=:sub0 sub1 &&
+ git submodule--helper in-group --group=:sub_name sub_path &&
+
+ # logical OR of path and labels
+ git submodule--helper in-group --group=\*bit1,./sub0 sub0 &&
+ git submodule--helper in-group --group=\*bit1,./sub0 sub1 &&
+ test_must_fail git submodule--helper in-group --group=\*bit1,./sub0 sub2 &&
+ git submodule--helper in-group --group=\*bit1,./sub0 sub3
+ )
+'
+
test_done
--
2.8.0.35.g58985d9.dirty
next prev parent reply other threads:[~2016-05-11 1:00 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-11 0:59 [PATCH 0/7] submodule groups Stefan Beller
2016-05-11 0:59 ` [PATCH 1/7] submodule--helper: add valid-label-name Stefan Beller
2016-05-11 1:11 ` Junio C Hamano
2016-05-11 0:59 ` [PATCH 2/7] submodule add: label submodules if asked to Stefan Beller
2016-05-11 1:13 ` Junio C Hamano
2016-05-11 17:26 ` Stefan Beller
2016-05-11 0:59 ` [PATCH 3/7] submodule-config: keep labels around Stefan Beller
2016-05-11 1:15 ` Junio C Hamano
2016-05-11 17:41 ` Stefan Beller
2016-05-11 21:28 ` Junio C Hamano
2016-05-11 21:39 ` Stefan Beller
2016-05-11 0:59 ` Stefan Beller [this message]
2016-05-11 1:19 ` [PATCH 4/7] submodule-config: check if a submodule is in a group Junio C Hamano
2016-05-11 0:59 ` [PATCH 5/7] submodule--helper module_list_compute: allow label or name arguments Stefan Beller
2016-05-11 1:29 ` Junio C Hamano
2016-05-11 2:24 ` Junio C Hamano
2016-05-11 0:59 ` [PATCH 6/7] submodule update: learn partial initialization Stefan Beller
2016-05-11 0:59 ` [PATCH 7/7] clone: allow specification of submodules to be cloned Stefan Beller
2016-05-11 2:08 ` [PATCH 0/7] submodule groups Junio C Hamano
2016-05-11 23:07 ` Stefan Beller
2016-05-11 23:39 ` Junio C Hamano
2016-05-11 23:48 ` Junio C Hamano
2016-05-11 23:57 ` Stefan Beller
2016-05-12 0:00 ` Junio C Hamano
2016-05-12 4:33 ` Junio C Hamano
2016-05-12 5:50 ` Junio C Hamano
2016-05-12 15:32 ` Stefan Beller
2016-05-12 15:58 ` Junio C Hamano
2016-05-12 16:35 ` Stefan Beller
2016-05-12 16:53 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1462928397-1708-5-git-send-email-sbeller@google.com \
--to=sbeller@google.com \
--cc=Jens.Lehmann@web.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jrnieder@gmail.com \
--cc=pclouds@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).