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.<url>.config
topic.  In addition to $section.$variable, entries in the
configuration file(s) that match $section.<urlpattern>.$variable are
looked up and the one with <urlpattern> 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 <gits...@pobox.com>
---
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.
--
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

Reply via email to