Re: [PATCH] branch --track: code cleanup and saner handling of local branches
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:43:20
Johannes Schindelin [off-list ref] writes:
quoted hunk
@@ -349,125 +345,111 @@ static void print_ref_list(int kinds, int detached, int verbose, int abbrev, free_ref_list(&ref_list); } -static char *config_repo; -static char *config_remote; -static const char *start_ref; +static struct { + const char *ref; + int ref_len; + char *remote; + char *merge; + int matches; +} tracking; -static int get_remote_branch_name(const char *value) +static int tracking_config(const char *key, const char *value) { const char *colon; + int key_len, value_len, match_len; + char *merge = NULL; - colon = strchr(value, ':'); - if (!colon) + /* we want: remote.<nick>.fetch = <merge>:<ref> */ + if (prefixcmp(key, "remote.") || (key_len = strlen(key)) < 6 || + strcmp(key + key_len - 6, ".fetch") || + !(colon = strchr(value, ':'))) return 0; - end = value + strlen(value); + if (*value == '+') + value++; /* - * Try an exact match first. I.e. handle the case where the - * value is "$anything:refs/foo/bar/baz" and start_ref is exactly - * "refs/foo/bar/baz". Then the name at the remote is $anything. + * A remote.<name>.fetch value can have two forms: + * + * - exact: + * + * refs/heads/gnu:refs/heads/my-upstream + * + * - wildcard: + * + * refs/heads/ *:refs/remotes/gnu/ * + * + * try exact match first: */
It strikes me a bit odd if Daniel's remote.[ch] infrastructure does not give you easy access to this kind of information...