From: Kyle J. McKay Date: Tue, 30 Jul 2013 19:14:03 GMT Subject: Re: [PATCH 3/3] config: --get-urlmatch Message-ID: In-Reply-To: <1375138150-19520-4-git-send-email-gitster@pobox.com> On Jul 29, 2013, at 15:49, Junio C Hamano wrote: > "git config --get-urlmatch $section[.$variable] $url" is a way to > learn what the configured value for $section.$variable is for the > given URL, using the logic introduced by the http..config > topic. In addition to $section.$variable, entries in the > configuration file(s) that match $section..$variable are > looked up and the one with that matches the given $url > the best is used to answer the query. > > This can still be further refactored to remove code from > http_options() > in http.c, I think. > > Signed-off-by: Junio C Hamano > --- > builtin/config.c | 141 ++++++++++++++++++++++++++++++++++++++++++++++ > +++++++++ > 1 file changed, 141 insertions(+) > > diff --git a/builtin/config.c b/builtin/config.c > index 12c5073..c1d32ae 100644 > --- a/builtin/config.c > +++ b/builtin/config.c [...] > +static int get_urlmatch(const char *var, const char *url) > +{ > + const char *section_tail; > + struct string_list_item *item; > + struct urlmatch_collect collect = { STRING_LIST_INIT_DUP }; > + > + if (!url_normalize(url, &collect.url)) > + die(collect.url.err); The value now stored in collect.url.url is never freed. > + > + section_tail = strchr(var, '.'); > + if (section_tail) { > + collect.section = xmemdupz(var, section_tail - var); > + collect.key = strrchr(var, '.') + 1; > + show_keys = 0; > + } else { > + collect.section = var; > + collect.key = NULL; > + show_keys = 1; > + } > + > + git_config_with_options(urlmatch_collect, &collect, > + given_config_file, respect_includes); > + > + for_each_string_list_item(item, &collect.vars) { > + struct urlmatch_item *matched = item->util; > + struct strbuf key = STRBUF_INIT; > + struct strbuf buf = STRBUF_INIT; > + > + strbuf_addstr(&key, collect.section); > + strbuf_addch(&key, '.'); > + strbuf_addstr(&key, item->string); > + format_config(&buf, key.buf, > + matched->value_is_null ? NULL : matched->value.buf); > + fwrite(buf.buf, 1, buf.len, stdout); > + strbuf_release(&key); > + strbuf_release(&buf); > + > + strbuf_release(&matched->value); > + } > + string_list_clear(&collect.vars, 1); Needs something like this here: + free(collect.url.url); > + > + /* > + * section name may have been copied to replace the dot, in which > + * case it needs to be freed. key name is either NULL (e.g. 'http' > + * alone) or points into var (e.g. 'http.savecookies'), and we do > + * not own the storage. > + */ > + if (collect.section != var) > + free((void *)collect.section); > + return 0; > +} Still needed after 4/3 except it's now config.url.url instead.