threads / discuss / 60866

[RFH] "git -C there add foo" completes, s/add/diff/ does not

Subject: [RFH] "git -C there add foo" completes, s/add/diff/ does not

## tl;dr

3 messages between Feb 7, 2024 and Feb 8, 2024.

replies: 2people: 2as markdown or json

Junio C Hamano· Feb 7, 2024, 18:34 UTC · lore

As some of you may already know, I keep an untracked directory called "Meta" at the top-level of the working tree of the Git source tree. This "Meta" directory is actually a single-branch clone of the git.kernel.org/pub/scm/git/git.git that checks out its "todo" branch, where files like whats-cooking.txt lives.

So, what I often would do is
    $ git -C Meta add whats-cooking.txt

after updating the draft of the next issue of the "What's cooking" report. The command line completion support for "git add" knows how to complete this when I stopped typing the above after whats-" and hit <TAB>. It seems that __git_find_repo_path helper function that notices "-C there" and discovers the $GIT_DIR, and _git_add helper uses __git_complete_index_file that honors the discovered $GIT_DIR to find paths in the correct index, which is wonderful.

But the same does not work for the step before I can decide to actually "add" the contents, which is to "diff", i.e.

    $ git -C Meta diff whats-<TAB>
does not complete.
Anybody wants to take a crack at it?
Thanks.
Kyle Lippincott· Feb 8, 2024, 02:50 UTC · re: Junio C Hamano · lore

Re: [RFH] "git -C there add foo" completes, s/add/diff/ does not

On Wed, Feb 7, 2024 at 10:35 AM Junio C Hamano <gitster@pobox.com> wrote:
Show 25 quoted lines
>
> As some of you may already know, I keep an untracked directory
> called "Meta" at the top-level of the working tree of the Git
> source tree.  This "Meta" directory is actually a single-branch
> clone of the git.kernel.org/pub/scm/git/git.git that checks out
> its "todo" branch, where files like whats-cooking.txt lives.
>
> So, what I often would do is
>
>     $ git -C Meta add whats-cooking.txt
>
> after updating the draft of the next issue of the "What's cooking"
> report.  The command line completion support for "git add" knows how
> to complete this when I stopped typing the above after whats-" and
> hit <TAB>.  It seems that __git_find_repo_path helper function that
> notices "-C there" and discovers the $GIT_DIR, and _git_add helper
> uses __git_complete_index_file that honors the discovered $GIT_DIR
> to find paths in the correct index, which is wonderful.
>
> But the same does not work for the step before I can decide to
> actually "add" the contents, which is to "diff", i.e.
>
>     $ git -C Meta diff whats-<TAB>
>
> does not complete.

I'm not a completions expert, but I think what's happening is that the completions for `git diff` aren't producing anything, so it (where "it" here might be the shell?) falls back to just doing normal path completion. For `git add`, it's checking the `git status` output to filter the list to things that need to be added, so it respects the `-C` option when calling into git to get that list, but there's no such logic for `git diff` (the git-specific logic treats the [optional] positional argument as a ref, not a file).

Show 6 quoted lines
>
> Anybody wants to take a crack at it?
>
> Thanks.
>
>
Junio C Hamano· Feb 8, 2024, 06:04 UTC · re: Kyle Lippincott · lore

Re: [RFH] "git -C there add foo" completes, s/add/diff/ does not

Kyle Lippincott <spectral@google.com> writes:
Show 12 quoted lines
>> ...
>> But the same does not work for the step before I can decide to
>> actually "add" the contents, which is to "diff", i.e.
>>
>>     $ git -C Meta diff whats-<TAB>
>>
>> does not complete.
>
> I'm not a completions expert, but I think what's happening is that the
> completions for `git diff` aren't producing anything, so it (where
> "it" here might be the shell?) falls back to just doing normal path
> completion.
Yes, that seems to be the case.
> For `git add`, it's checking the `git status` output to
> filter the list to things that need to be added,...
Not exactly, but a close enough description, I think.

__git_complete_index_file does not run `git status` but asks ls-files the paths it knows about (including "--others" so that a path that is untracked can become a candidate to be added), then massages the list of paths with a custom awk script.

For "git diff", depending on what two sets of contents are being compared, the source of possible paths may differ, but the list of paths obtained from ls-files (without --others) would be appropriate when comparing the index and the working tree files, or comparing a tree-ish and the working tree files. The necessary ingredient to do so may be pretty much the same as what is used by _git_add completion.

When comparing two tree-ishes, the candidate would ideally come from union of paths in these two tree-ishes, but I offhand do not know if there already is a support for choosing from such a set.

Thanks.

← back to recent threads