git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 1/1] completion: load completion file for external subcommand

From
Florian Gamböck <mail@floga.de>
Date
Apr 19, 2018, 19:07 UTC
Message-ID
<20180419190725.GA8555@furore>
In-Reply-To
<CAM0VKj=pDVxfJtUZx7c6uCmPxwQFPBOQYdd7NH=YnVG86iK0Pw@mail.gmail.com>
On 2018-04-18 21:51, SZEDER Gábor wrote:
Show 24 quoted lines
> On Tue, Apr 10, 2018 at 10:28 PM, Florian Gamböck <mail@floga.de> 
> wrote:
>> Adding external subcommands to Git is as easy as to put an executable 
>> file git-foo into PATH. Packaging such subcommands for a Linux 
>> distribution can be achieved by unpacking the executable into 
>> /usr/bin of the user's system. Adding system-wide completion scripts 
>> for new subcommands, however, can be a bit tricky.
>>
>> Since bash-completion started to use dynamical loading of completion 
>> scripts since v1.90 (preview of v2.0),
>
> I believe the main bash-completion repository can be found at:
>
>  https://github.com/scop/bash-completion.git
>
> This repository still contains the branch 'dynamic-loading'; for the 
> record it points to 3b029892f6f9db3b7210a7f66d636be3e5ec5fa2.
>
> Two commits on that branch are worth mentioning:
>
>   20c05b43 (Load completions in separate files dynamically, get rid of
>             have()., 2011-10-12)
>   5baebf81 (Add _xfunc for loading and calling functions on demand,
>             use it in apt-get, cvsps, rsync, and sshfs., 2011-10-13)
Nice, thanks for the pointers!
Show 9 quoted lines
>> (...)
>>
>> I think the easiest method is to use a function that is defined by 
>> bash-completion v2.0+, namely __load_completion.
>
> This is wrong, __load_completion() was introduced in cad3abfc 
> (__load_completion: New function, use in _completion_loader and 
> _xfunc, 2015-07-15), and the first release tag containg it is '2.2' 
> from 2016-03-03.

Dang, I thought it was introduced at the same time. Sorry for that. I guess, 2016 is a bit too young to take it for granted then?

Show 8 quoted lines
> The release tags '1.90' and '2.0' are from 2011-11-03 and 2012-06-17, 
> respectively.  This leaves a couple of years long hole where 
> completions were already loaded dynamically but there was no 
> __load_completion() function.
>
> Would it be possible to use _xfunc() instead to plug that hole?  It 
> seems the be tricky, because that function not only sources but also 
> _calls_ the completion function.

But isn't this exactly what we want? Lucky us, we can replace the whole if-fi block with a simpler:

    _xfunc git-$command $completion_func 2>/dev/null && return

If _xfunc is not defined -- as in, bashcomp is not installed / loaded -- then the return will not get called and the original completion will continue:

    declare -f $completion_func >/dev/null 2>/dev/null &&
        $completion_func && return

Since this would be redundant, we could define a fall-back for _xfunc like so:

    declare -f _xfunc || _xfunc() {
        declare -f $completion_func >/dev/null 2>/dev/null &&
            $completion_func && return
    }

This way, we retain the "old" behavior and get dynamic loading if bashcomp is available. The actual call to get the completions would just be _xfunc like in my first example above.

What do you think?
-- 
Regards

Florian
Previous: SZEDER GáborNext: SZEDER Gábor
Message 4 of 10 in “completion: dynamic completion loading”
  1. 0/1 completion: dynamic completion loadingFlorian Gamböck, Apr 10, 2018
  2. 1/1 completion: load completion file for external subcommandFlorian Gamböck, Apr 10, 2018
  3. SZEDER GáborApr 18, 2018
  4. Florian GamböckApr 19, 2018
  5. SZEDER GáborApr 23, 2018
  6. Florian GamböckApr 23, 2018
  7. SZEDER GáborApr 25, 2018
  8. Florian GamböckApr 29, 2018
  9. SZEDER GáborApr 29, 2018
  10. Florian GamböckApr 29, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.