git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* broken bash completion
@ 2012-05-02 14:09 Rolf Leggewie
  2012-05-04 23:32 ` SZEDER Gábor
  0 siblings, 1 reply; 8+ messages in thread
From: Rolf Leggewie @ 2012-05-02 14:09 UTC (permalink / raw)
  To: git

forward from http://code.google.com/p/git-core/issues/detail?id=11
and https://bugs.launchpad.net/bugs/853081


Hello,

not sure you guys pay much attention to the issue tracker over on 
code.google.com so I'll try my luck here.

Current bash completion works the following way.

1) only tag-completion possible: complete tag as much as possible
2) only file/dir-completion possible: complete path as much as possible
3) all of tag/file/dir-completion possible: complete tag (!) as much as 
possible

1 and 2 are fine, but for #3 git should really stop at the lowest common 
denominator for all of tags, files and directories. This is explained 
better in above tickets, but I'll also include an example here for 
illustration.  Let's say I had tags debian/1.4.9-1 and debian/1.4.9-2 as 
well as debian/changelog file (as is common when using git-buildpackage, 
this is a real life example).  Current bash-completion behavior for "git 
log debiTAB" is to complete to "git log debian/1.4.9-" when it really 
should be "git log debian/".

Thank you for your attention.

Regards

Rolf

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: broken bash completion
  2012-05-02 14:09 broken bash completion Rolf Leggewie
@ 2012-05-04 23:32 ` SZEDER Gábor
  2012-05-05  4:24   ` Rolf Leggewie
  0 siblings, 1 reply; 8+ messages in thread
From: SZEDER Gábor @ 2012-05-04 23:32 UTC (permalink / raw)
  To: Rolf Leggewie; +Cc: git

Hi,


On Wed, May 02, 2012 at 10:09:26PM +0800, Rolf Leggewie wrote:
> Current bash completion works the following way.
> 
> 1) only tag-completion possible: complete tag as much as possible
> 2) only file/dir-completion possible: complete path as much as possible
> 3) all of tag/file/dir-completion possible: complete tag (!) as much
> as possible
> 
> 1 and 2 are fine, but for #3 git should really stop at the lowest
> common denominator for all of tags, files and directories. This is
> explained better in above tickets, but I'll also include an example
> here for illustration.  Let's say I had tags debian/1.4.9-1 and
> debian/1.4.9-2 as well as debian/changelog file (as is common when
> using git-buildpackage, this is a real life example).  Current
> bash-completion behavior for "git log debiTAB" is to complete to
> "git log debian/1.4.9-"

Yeah, there are a lot of git commands that accept refs (not just tags)
and files as well.  When completing a non-option word (i.e. a word
that does not begin with a double dash) for such a command, git's
completion script offers only refs, but when none of the refs matches
the word to be completed, then COMPREPLY remains empty and Bash falls
back to the default filename completion.

Now, to resolve ambiguity between options/refs and paths, the '--'
separator should be used before the first path to separate options and
refs from paths.  The completion script recognizes this separator, and
lets Bash perform filename completion for subsequent words.  So if you
know that you want to complete a file, then 'git log -- d<TAB>' will
give you 'debian/'.  Alternatively, you can just prefix './' to the
path, e.g. write 'git log ./d<TAB>' to get './debian/'.

> when it really should be "git log debian/".

I understand why you think that offering 'debian/' there would be the
correct behavior.  However, in this case being correct is perhaps not
the right thing.  Currently 'git log c<TAB>' offers me a couple of
completion-related branches, but with your correct behavior that would
be cluttered by all files and directories starting with 'c'.  I for
one would find that inconvenient and annoying, especially because,
while there are easy ways to get filename completion instead of refs,
as shown above, there is no similarly easy way to get only refs
completion.  


Best,
Gábor

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: broken bash completion
  2012-05-04 23:32 ` SZEDER Gábor
@ 2012-05-05  4:24   ` Rolf Leggewie
  2012-05-05 12:13     ` SZEDER Gábor
  0 siblings, 1 reply; 8+ messages in thread
From: Rolf Leggewie @ 2012-05-05  4:24 UTC (permalink / raw)
  To: SZEDER Gábor; +Cc: git

Dear Gábor,

thank you for taking the time to write up an analysis and offer some 
workarounds to the bash-completion issue I reported.  That is much 
appreciated.

After all is said and done, though, the bash-completion remains 
inconsistent and thus broken.  It's great that your life is currently 
more convenient but in the end you are relying on broken behaviour.

Affected commands:
git log
git diff
git whatchanged
git branch (why offer tags OR files here at all)
[...]

Unaffected programs, i.e. working correctly:
git commit
[...]

Some consistency would be great.  In a perfect world bash-completion 
ought to work on all possible completion targets but at the same time it 
should exclude all that make no sense, too.  Neither of the two seems to 
be currently the case.

I had a look at /etc/bash_completion.d/git to see if there was some work 
I could do to cook up a patch, but unfortunately, it's all greek to me 
in there.

Regards

Rolf

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: broken bash completion
  2012-05-05  4:24   ` Rolf Leggewie
@ 2012-05-05 12:13     ` SZEDER Gábor
  2012-05-05 12:22       ` Andreas Schwab
  2012-05-05 13:11       ` Felipe Contreras
  0 siblings, 2 replies; 8+ messages in thread
From: SZEDER Gábor @ 2012-05-05 12:13 UTC (permalink / raw)
  To: Rolf Leggewie; +Cc: git

Hi Rolf,


On Sat, May 05, 2012 at 12:24:38PM +0800, Rolf Leggewie wrote:
> After all is said and done, though, the bash-completion remains
> inconsistent and thus broken.  It's great that your life is
> currently more convenient but in the end you are relying on broken
> behaviour.

Well, git's completion script is consistent with itself: whenever
there is no matching subcommand, option, parameter for an option, or
ref, it falls back to filename completion.  I wouldn't consider this
behavior as broken.

> Affected commands:
> git log
> git diff
> git whatchanged
> git branch (why offer tags OR files here at all)

While files and tags make no sense for 'git branch' itself, completing
them can be helpful to construct the name of a new branch.  I did the
following at dayjob just the other day:

# there are route_calculation.c and .h files in that project, and
# there were some nasty bugs in there
$ git branch ro<TAB>
# which gave me
$ git branch route_calculation.
# just deleted the '.' and completed the new branch name by hand
$ git branch route_calculation_fixes


Anyway, I see two ways to fix this if we want to be anal, but none of
them is actually applicable:

- When registering _git() as the completion function for the git
  command, we specify some options to tell Bash to do filename
  completion when we can't find any matches to the word to be
  completed.  Recent Bash versions provide the 'compopt' builtin to
  allow modifying completion options for the currently executed
  completion.  We could do a 'compopt +o bashdefault +o default'
  to disable the filename completion fallback wherever we deem it
  inappropriate.

  'compopt' was introduced in Bash 4.0, but unfortunately msysgit
  still includes an older version, so this is a no go.

- We don't specify the options to ask Bash to fall back to filename
  completion when registering _git(). This will disable filename
  completion for the whole git completion script, so we must roll our
  own helper functions to do filename completion, which we would
  invoke wherever filename completion is explicitly desired.

  This should work on any Bash version, but would inherently include
  some fork()+exec()s, adding significant delays especially on
  msysgit.

> Unaffected programs, i.e. working correctly:
> git commit
> [...]

You haven't tried it hard enough ;)

$ git commit --fixup=e<TAB>
editor.c       entry.c        environment.c  exec_cmd.c     exec_cmd.o
editor.o       entry.o        environment.o  exec_cmd.h     

although at that point only a commit is accepted.

> Some consistency would be great.  In a perfect world bash-completion
> ought to work on all possible completion targets but at the same
> time it should exclude all that make no sense, too.  Neither of the
> two seems to be currently the case.

Yeah, in that perfect world 'git rm <TAB>', 'git bisect -- <TAB>', and
'git log -- <TAB>' whould offer only tracked files, 'git (add|commit)
<TAB>' only modified or untracked files, and 'git diff <TAB>' would
read your mind to find out whether you want to diff a ref or a file,
etc. etc.

But you miss an important point here: users expect the completion to
be pretty fast, because delays are quite noticeable and annoying while
typing a command.  So there's a trade-off between correctness and
usability.  Unfortunately, in the real world all that filtering costs
a great deal, so git's completion script does that only if it can be
done cheaply (e.g. 'git rebase --<TAB>' won't offer you '--abort' and
'--continue' if you're not in the middle of an ongoing rebase).  And
as pointed out above, something might be nonsense for a command, but
still be useful for the user.


Best,
Gábor

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: broken bash completion
  2012-05-05 12:13     ` SZEDER Gábor
@ 2012-05-05 12:22       ` Andreas Schwab
  2012-05-05 13:11       ` Felipe Contreras
  1 sibling, 0 replies; 8+ messages in thread
From: Andreas Schwab @ 2012-05-05 12:22 UTC (permalink / raw)
  To: SZEDER Gábor; +Cc: Rolf Leggewie, git

SZEDER Gábor <szeder@ira.uka.de> writes:

> While files and tags make no sense for 'git branch' itself, completing
> them can be helpful to construct the name of a new branch.  I did the
> following at dayjob just the other day:
>
> # there are route_calculation.c and .h files in that project, and
> # there were some nasty bugs in there
> $ git branch ro<TAB>

You can force filename completion with M-/.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: broken bash completion
  2012-05-05 12:13     ` SZEDER Gábor
  2012-05-05 12:22       ` Andreas Schwab
@ 2012-05-05 13:11       ` Felipe Contreras
  2012-05-05 13:57         ` fREW Schmidt
  1 sibling, 1 reply; 8+ messages in thread
From: Felipe Contreras @ 2012-05-05 13:11 UTC (permalink / raw)
  To: SZEDER Gábor; +Cc: Rolf Leggewie, git

On Sat, May 5, 2012 at 2:13 PM, SZEDER Gábor <szeder@ira.uka.de> wrote:

> But you miss an important point here: users expect the completion to
> be pretty fast, because delays are quite noticeable and annoying while
> typing a command.  So there's a trade-off between correctness and
> usability.  Unfortunately, in the real world all that filtering costs
> a great deal, so git's completion script does that only if it can be
> done cheaply (e.g. 'git rebase --<TAB>' won't offer you '--abort' and
> '--continue' if you're not in the middle of an ongoing rebase).  And
> as pointed out above, something might be nonsense for a command, but
> still be useful for the user.

Completely agree with this.

The reason I started to use the bash completion in zsh is that the zsh
completion goes for 100% correctness, that means 'git checkout <TAB>'
took literally *minutes* in my machine on the Linux kernel repo. The
zsh developers said that was OK, and my patch to solve the problem was
not, because it would make the result less than 100% correct.

The whole point of completion is to avoid typing as much as possible,
and if typing something is faster than doing the completion; the
completion is pointless. It has to be fast.

Cheers.

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: broken bash completion
  2012-05-05 13:11       ` Felipe Contreras
@ 2012-05-05 13:57         ` fREW Schmidt
  2012-05-05 14:26           ` Felipe Contreras
  0 siblings, 1 reply; 8+ messages in thread
From: fREW Schmidt @ 2012-05-05 13:57 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: SZEDER Gábor, Rolf Leggewie, git

On Sat, May 5, 2012 at 8:11 AM, Felipe Contreras
<felipe.contreras@gmail.com> wrote:
>
> On Sat, May 5, 2012 at 2:13 PM, SZEDER Gábor <szeder@ira.uka.de> wrote:
>
> The reason I started to use the bash completion in zsh is that the zsh
> completion goes for 100% correctness, that means 'git checkout <TAB>'
> took literally *minutes* in my machine on the Linux kernel repo. The
> zsh developers said that was OK, and my patch to solve the problem was
> not, because it would make the result less than 100% correct.

Could you elaborate on how you did that?  I'm suffering from the same
thing and don't see an obvious way to use bash-completion in zsh.

--
fREW Schmidt
http://blog.afoolishmanifesto.com

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: broken bash completion
  2012-05-05 13:57         ` fREW Schmidt
@ 2012-05-05 14:26           ` Felipe Contreras
  0 siblings, 0 replies; 8+ messages in thread
From: Felipe Contreras @ 2012-05-05 14:26 UTC (permalink / raw)
  To: fREW Schmidt; +Cc: SZEDER Gábor, Rolf Leggewie, git

On Sat, May 5, 2012 at 3:57 PM, fREW Schmidt <frioux@gmail.com> wrote:
> On Sat, May 5, 2012 at 8:11 AM, Felipe Contreras
> <felipe.contreras@gmail.com> wrote:
>>
>> On Sat, May 5, 2012 at 2:13 PM, SZEDER Gábor <szeder@ira.uka.de> wrote:
>>
>> The reason I started to use the bash completion in zsh is that the zsh
>> completion goes for 100% correctness, that means 'git checkout <TAB>'
>> took literally *minutes* in my machine on the Linux kernel repo. The
>> zsh developers said that was OK, and my patch to solve the problem was
>> not, because it would make the result less than 100% correct.
>
> Could you elaborate on how you did that?  I'm suffering from the same
> thing and don't see an obvious way to use bash-completion in zsh.

Just source the bash script:
http://git.kernel.org/?p=git/git.git;a=blob;f=contrib/completion/git-completion.bash

Alternatively you can use my wrapper that works better than zsh's bash
completion[1], but you still need the bash script anyway.

Cheers.

[1] https://github.com/felipec/git-zsh/blob/master/git-completion.zsh

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2012-05-05 14:26 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-05-02 14:09 broken bash completion Rolf Leggewie
2012-05-04 23:32 ` SZEDER Gábor
2012-05-05  4:24   ` Rolf Leggewie
2012-05-05 12:13     ` SZEDER Gábor
2012-05-05 12:22       ` Andreas Schwab
2012-05-05 13:11       ` Felipe Contreras
2012-05-05 13:57         ` fREW Schmidt
2012-05-05 14:26           ` Felipe Contreras

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).