Re: Fwd: Errors when diff'ing arbitrary upstream remotes are not intuitive if git pull --all hasn't been done
- From
Johan Herland <johan@herland.net>
- Date
- Oct 25, 2013, 07:25 UTC
- Message-ID
- <CALKQrgdfcDzq+M4Pi=DdbSPXCDCcXRtk6qV7qhvyHviJoJXA8A@mail.gmail.com>
- In-Reply-To
- <20131025071048.GA16856@sigill.intra.peff.net>
On Fri, Oct 25, 2013 at 9:10 AM, Jeff King <peff@peff.net> wrote:
Show 22 quoted lines
> 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. :(
Show 9 quoted lines
> 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@herland.net> www.herland.net