On Fri, Oct 25, 2013 at 9:10 AM, Jeff King <[email protected]> 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, <[email protected]>
www.herland.net
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html