On Mon, Feb 27, 2017 at 01:19:29PM -0800, Junio C Hamano wrote: > Jeff King <peff@xxxxxxxx> writes: > > > I suspect there are a lot of other places that are less clear cut. E.g., > > I think just: > > > > git branch foo bar > > > > will put "foo" through the same interpretation. So you could do: > > > > git branch -f @{-1} bar > > > > Is that insane? Maybe. But it does work now. > > No, it _is_ very sensible, so is "git checkout -B @{-1} <someplace>" > > Perhaps interpret-branch-name that does not error out when given "@" > is what is broken? I suspect that calling interpret_empty_at() from > that function is fundamentally flawed. The "@" end user types never > means refs/heads/HEAD, and HEAD@{either reflog or -1} would not mean > anything that should be taken as a branch_name, either. > > So perhaps what interpret_empty_at() does is necessary for the "four > capital letters is too many to type, so just type one key while > holding a shift", but it should be called from somewhere else, and > not from interpret_branch_name()? I think _most_ of interpret_branch_name() is in the same boat. The "@{upstream}" mark is not likely to give you a branch in refs/heads either. So in practice, I think strbuf_check_branch_ref() could probably get by with just calling interpret_nth_prior_checkout(). Or if you prefer, to rip everything out of interpret_branch_name() except that. :) But that other stuff has to go somewhere, and there are some challenges with the recursion from reinterpret(). The "other" stuff could sometimes be useful, I guess. It's not _always_ wrong to do: git branch -f @{upstream} foo It depends on what your @{upstream} resolves to. Switching to just using interpret_nth_prior_checkout() would break the case when it resolves to a local branch. I'm not sure if we're OK with that or not. If we want to keep all the existing cases working, I think we need something like the "not_in_refs_heads" patch I posted elsewhere. -Peff