summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2017-03-28 13:52:18 -0700
committerJunio C Hamano <gitster@pobox.com>2017-03-28 13:52:19 -0700
commitc772d1bcdc058d655e6cd3518440a721433cb511 (patch)
treeb9712dd52d14728c5c23fa83a49f95dab49324f9
parent8f9aeb0d36c6cbfb849946bb272fa0d3c4611547 (diff)
parentad8c7cdadd96c66d0adf894250c8f4dd77bb2bee (diff)
downloadgit-c772d1bcdc058d655e6cd3518440a721433cb511.tar.gz
Merge branch 'jk/parse-config-key-cleanup' into maint
The "parse_config_key()" API function has been cleaned up. * jk/parse-config-key-cleanup: parse_hide_refs_config: tell parse_config_key we don't want a subsection parse_config_key: allow matching single-level config parse_config_key: use skip_prefix instead of starts_with refs: parse_hide_refs_config to use parse_config_key
-rw-r--r--cache.h5
-rw-r--r--config.c15
-rw-r--r--refs.c6
3 files changed, 16 insertions, 10 deletions
diff --git a/cache.h b/cache.h
index 8a9069dc9f..d76d0896bb 100644
--- a/cache.h
+++ b/cache.h
@@ -1816,8 +1816,11 @@ extern int git_config_include(const char *name, const char *value, void *data);
*
* (i.e., what gets handed to a config_fn_t). The caller provides the section;
* we return -1 if it does not match, 0 otherwise. The subsection and key
- * out-parameters are filled by the function (and subsection is NULL if it is
+ * out-parameters are filled by the function (and *subsection is NULL if it is
* missing).
+ *
+ * If the subsection pointer-to-pointer passed in is NULL, returns 0 only if
+ * there is no subsection at all.
*/
extern int parse_config_key(const char *var,
const char *section,
diff --git a/config.c b/config.c
index 48edc6a384..0e9e1ebefc 100644
--- a/config.c
+++ b/config.c
@@ -2540,11 +2540,10 @@ int parse_config_key(const char *var,
const char **subsection, int *subsection_len,
const char **key)
{
- int section_len = strlen(section);
const char *dot;
/* Does it start with "section." ? */
- if (!starts_with(var, section) || var[section_len] != '.')
+ if (!skip_prefix(var, section, &var) || *var != '.')
return -1;
/*
@@ -2556,12 +2555,16 @@ int parse_config_key(const char *var,
*key = dot + 1;
/* Did we have a subsection at all? */
- if (dot == var + section_len) {
- *subsection = NULL;
- *subsection_len = 0;
+ if (dot == var) {
+ if (subsection) {
+ *subsection = NULL;
+ *subsection_len = 0;
+ }
}
else {
- *subsection = var + section_len + 1;
+ if (!subsection)
+ return -1;
+ *subsection = var + 1;
*subsection_len = dot - *subsection;
}
diff --git a/refs.c b/refs.c
index cd36b64ed9..b9188908b2 100644
--- a/refs.c
+++ b/refs.c
@@ -1034,10 +1034,10 @@ static struct string_list *hide_refs;
int parse_hide_refs_config(const char *var, const char *value, const char *section)
{
+ const char *key;
if (!strcmp("transfer.hiderefs", var) ||
- /* NEEDSWORK: use parse_config_key() once both are merged */
- (starts_with(var, section) && var[strlen(section)] == '.' &&
- !strcmp(var + strlen(section), ".hiderefs"))) {
+ (!parse_config_key(var, section, NULL, NULL, &key) &&
+ !strcmp(key, "hiderefs"))) {
char *ref;
int len;