On Fri, Oct 25, 2013 at 9:10 AM, Jeff King <peff@xxxxxxxx> wrote: > On Fri, Oct 25, 2013 at 09:03:41AM +0200, Johan Herland wrote: >> 1. Split the input on the first '/' into $remote/$branch, and use the >> preceding part ($remote) as a potential remote name, and the following >> part ($branch) as a potential branch name. (Although it is >> theoretically possible to have remote names containing slashes, I >> don't think anybody uses them, and we have considered disallowing >> them, mainly because of this very issue: it makes "$remote/$branch" >> parsing (even more) ambiguous) > > What I specifically meant is that this breaks with a remote like: > > [remote "foo"] > fetch = +refs/heads/*:refs/remotes/bar/* > > The correct advice for "bar/branch" is to recommend "git fetch foo", and > the correct advice for "foo/branch" is nothing at all. > > I know such config is unusual, but I thought there was a recent push for > us to be accurate about finding the local side of remote tracking > branches, rather than just assuming they start with "$remote". Maybe I > am misremembering, though; I thought it was related to potentially > shifting the default refspecs. Obviously, you're right. Sorry about that, haven't had my morning coffee yet. :( > The procedure along those lines would be: > > for each remote > for each fetch-refspec in remote > if refspec.rhs contains "refs/remotes/$failed_branch" > recommend "git fetch $remote" > > I was just wondering if we had something to make that "does this refspec > contain this ref" part easier. Yes, I found the following code in branch.c (added in 41c21f2), which does a similar thing. Might want to refactor that into something more general: +static int check_tracking_branch(struct remote *remote, void *cb_data) +{ + char *tracking_branch = cb_data; + struct refspec query; + memset(&query, 0, sizeof(struct refspec)); + query.dst = tracking_branch; + return !(remote_find_tracking(remote, &query) || + prefixcmp(query.src, "refs/heads/")); +} + +static int validate_remote_tracking_branch(char *ref) +{ + return !for_each_remote(check_tracking_branch, ref); +} Hope this helps, ...Johan -- Johan Herland, <johan@xxxxxxxxxxx> www.herland.net -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html