On Tue, Jul 08, 2008 at 06:49:13AM +0000, Junio C Hamano wrote:
Show 39 quoted lines
> e8b404c (git-branch: add support for --merged and --no-merged, 2008-04-17)
> introduced "git branch --merged" to show the branches that are contained
> within the current HEAD. I.e. the ones that you can say "git branch -d"
> and do not have to say "-D" to delete.
>
> Currently "git branch --merged master" fails with a message:
>
> fatal: A branch named 'master' already exists.
>
> but --merged and its opposite --no-merged are in spirit very similar to
> another option --contains in that it is meant to be used as a way to
> influence which branches are _reported_, and not about creating a new
> branch.
>
> Perhaps we should change them to default to HEAD (to retain the current
> behaviour) but take a commit, and show branches that are merged to the
> commit or not yet fully merged to the commit, respectively?
>
> Incidentally, "git branch --with" fails without the mandatory commit
> argument, and if we are going to do the above, we probably should default
> the argument to HEAD as well.
>
> Here is an attempt to update --with but I am not happy with it.
>
> The patch makes
>
> $ git branch --contains
>
> work as expected, but breaks
>
> $ git branch --contains master
>
> You need to spell "git branch --contains=master" instead. Which means it
> is a regression and cannot be applied. I suspect I am not using
> parse_options() in an optimal way, but I did not find a way for my
> callback to tell "I consumed the next parameter and it was mine" or "The
> next one is not my optional parameter" back to the parse_options(), so
> probably parse_options() need to be fixed to update this without
> regression, I suspect.
I actually see three ways.
(1) quick and dirty: if we see at argv[argc - 1]
--contains/--merge/--no-merge/... we do: argv[argc] = "HEAD" and use parse-options with a mandatory
argument for --merge/--contains/... Okay this leaves the issue of
the fact that we must NULL-terminate argv, but that's trivial
(even if quite despisable). (2) big update of parse-options: we refactor callbacks so that they
can decide if they take their argument or not. This removes the
need for --long-opt=foo for options with optional arguments, but
the refactor will be heavy. That's more or less what you suggest
in your last § but I don't like it for many reasons so I wont
enter the details. (3) inspired from (1) and (2), have a flag for options that says "I do
take an argument, but if I'm the last option on the command line,
please fake this argument for me. I really like (3) more FWIW as it doesn't generate ambiguous parsers
like (2) would, and it's not horrible like (1). And cherry on top it's
pretty trivial to implement I think.