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

Re: [PATCH 00/11] completion: general cleanups

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
Apr 27, 2013, 13:07 UTC
Message-ID
<CAMP44s3h43S=A7+QEWuv0iefxbXyKZsiJ2QMdc-XiouoO3yYng@mail.gmail.com>
In-Reply-To
<CAMP44s1od7W0OufMhn2TCZTAo0aK9D+7VLzwVy7BSGNxAMuk6w@mail.gmail.com>

On Sat, Apr 27, 2013 at 7:36 AM, Felipe Contreras <felipe.contreras@gmail.com> wrote:

Show 65 quoted lines
> On Sat, Apr 27, 2013 at 6:33 AM, Manlio Perillo
> <manlio.perillo@gmail.com> wrote:
>> -----BEGIN PGP SIGNED MESSAGE-----
>> Hash: SHA1
>>
>> Il 27/04/2013 12:19, Felipe Contreras ha scritto:
>>> Hi,
>>>
>>> Basically while trying to understand the code for path completion, I found that
>>> a lot of code was duplicated, and for not much gain.
>>>
>>> I also noticed that doing 'git add file' doesn't add the trailing space as
>>> before. It's not clear if it should be possible to do that with -o filenames,
>>> but after all, what do -o filenames gives us? Nothing we can't do ourselves,
>>> apparently.
>>>
>>
>> No, you can not do it yourself, as far as I know.
>>
>> I added the `compopt -o filenames` on Junio request for something like
>> "It  would be nice if completion for real files would behave like
>> builtin bash completion", if I remember correctly.
>>
>> Try `git rm contrib/completion/<TAB>`, in the git reporitory.
>>
>> Using the new feature, bash will suggest:
>> "git-completion.bash  git-completion.tcsh  git-completion.zsh
>> git-prompt.sh"
>>
>> Old behaviour, instead, was to suggest:
>> "contrib/completion/git-completion.bash
>> contrib/completion/git-completion.zsh
>> contrib/completion/git-completion.tcsh  contrib/completion/git-prompt.sh"
>>
>> I tried several things, but I was unable to emulate Bash builtin file
>> completion, whithout having to use `compopt -o filenames`.
>
> I see. I'm not convinced it's such a great feature, but it would be
> nice to have.
>
> Anyway, 'compopt -o filenames +o nospace' should restore the old
> behavior to add a space after the completion.
>
>> As far as the "double slash" problem with the
>> __git_index_file_list_filter_bash function, please try
>> `git rm contrib<TAB>`.
>>
>> With current code, Bash will suggest:
>> "blameview/ diffall/ git-shell-commands/"
>>
>> If you remove the __git_index_file_list_filter_bash function and use
>> __git_index_file_list_filter_compat instead, Bash will suggest:
>>
>> "blameview// diffall// git-shell-commands//"
>>
>> I can confirm this on my system, and it was confirmed by another user.
>> It only happens when you use `compopt -o filenames`. I don't know if
>> this is a bug or a feature, but I can try to ask to Bash mailing list,
>> so that we can update the comment to make more clear why a separate
>> function was needed.
>
> I've managed to reproduce the issue. The slash doesn't appear in the
> completion, it appears on the list of completions.
>
> I'll see what I can think to fix the issues while still keep the code simple.
This should do the trick. No?
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -262,16 +262,17 @@ __git_ls_files_helper ()
 #    If provided, only files within the specified directory are listed.
 #    Sub directories are never recursed.  Path must have a trailing
 #    slash.
+# 3. Compat mode; set to enable.
 __git_index_files ()
 {
-       local dir="$(__gitdir)" root="${2-.}" file
+       local dir="$(__gitdir)" root="${2-.}" file old="${3-}"

        if [ -d "$dir" ]; then
                __git_ls_files_helper "$root" "$1" |
                while read -r file; do
                        case "$file" in
-                       ?*/*) echo "${file%%/*}/" ;;
-                       *) echo "$file " ;;
+                       ?*/*) echo "${file%%/*}${old:+/}" ;;
+                       *) echo "${file}${old:+ }" ;;
                        esac
                done | sort | uniq
        fi
@@ -480,7 +481,7 @@ __git_complete_revlist_file ()
 # The exception is --committable, which finds the files appropriate commit.
 __git_complete_index_file ()
 {
-       local pfx="" cur_="$cur"
+       local pfx="" cur_="$cur" old

        case "$cur_" in
        ?*/*)
@@ -490,7 +491,8 @@ __git_complete_index_file ()
                ;;
        esac

-       __gitcomp_nl "$(__git_index_files "$1" "$pfx")" "$pfx" "$cur_" ""
+       compopt -o filenames +o nospace 2> /dev/null || old=1
+       __gitcomp_nl "$(__git_index_files "$1" "$pfx" "$old")" "$pfx" "$cur_" ""
 }

 __git_complete_file ()
-- 
Felipe Contreras
Previous: Felipe ContrerasNext: Manlio Perillo
Message 15 of 19 in “completion: general cleanups”
  1. 00/11 completion: general cleanupsFelipe Contreras, Apr 27, 2013
  2. 01/11 completion: add file completion testsFelipe Contreras, Apr 27, 2013
  3. 02/11 completion: document tilde expansion failure in testsFelipe Contreras, Apr 27, 2013
  4. 03/11 completion; remove unuseful commentsFelipe Contreras, Apr 27, 2013
  5. 04/11 completion: use __gitcompadd for __gitcomp_fileFelipe Contreras, Apr 27, 2013
  6. 05/11 completion: refactor diff_index wrappersFelipe Contreras, Apr 27, 2013
  7. 06/11 completion: refactor __git_complete_index_file()Felipe Contreras, Apr 27, 2013
  8. 07/11 completion: avoid compopt -o filenamesFelipe Contreras, Apr 27, 2013
  9. 08/11 completion: get rid of __gitcomp_file()Felipe Contreras, Apr 27, 2013
  10. 09/11 completion: add space after completed filenameFelipe Contreras, Apr 27, 2013
  11. 10/11 completion: remove __git_index_file_list_filter()Felipe Contreras, Apr 27, 2013
  12. 11/11 completion: zsh: add proper file supportFelipe Contreras, Apr 27, 2013
  13. Manlio PerilloApr 27, 2013
  14. Felipe ContrerasApr 27, 2013
  15. Felipe ContrerasApr 27, 2013
  16. Manlio PerilloApr 27, 2013
  17. Felipe ContrerasApr 27, 2013
  18. Felipe ContrerasApr 27, 2013
  19. Manlio PerilloApr 27, 2013

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.