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

[PATCH v2 0/5] stash completion miscellany

From
D. Ben Knoble <ben.knoble@gmail.com>
Date
Oct 23, 2026, 13:20 UTC
Message-ID
<cover.1792761643.git.ben.knoble@gmail.com>
In-Reply-To
<cover.1791827304.git.ben.knoble@gmail.com>
Hi all,

This short patch series takes care of a few paper cuts in stash completion. The first patch is a small code cleanup I noticed a while back while working on bfc1b34859 (completion: add stash import, export, 2026-02-07), I think. The next 2 take care of a problem I've been having with Zsh's completion of stashes (cf. Unix & Linux SE [1]).

[1]: https://unix.stackexchange.com/q/807580/301073
Changes in v2:
• Reworded a few commit messages thanks to Patrick
• Clarify the behavior of the final patches with completion for "git
  stash save" (also thanks to Patrick)

The final 2 are not only about completion; I noticed we were special-casing save completion, did some digging, and was a bit confused by the status of "git stash save". So, I figured while I was here I would start a conversation about (a) restoring the git-stash(1) manual to it's "no save" version and (b) ripping out the special case.

These last 2 may be controversial, and I'm not particularly attached to them, so if they need to be dropped I won't really complain. OTOH, what's the point of a deprecated subcommand we still advertise? ;)

Generated-with: git format-patch @{u}.. -o p -v2 --range-diff=@{u}..d1d0bf2d9a7d380d10771b5d1bceb8db91c5f05e --in-reply-to=cover.1791827304.git.ben.knoble@gmail.com --cc='Patrick Steinhardt <ps@pks.im>'

I accidentally left the above line in v1, but I'm considering leaving it in from now on? It's the exact command I run to generate patches; I store it as a "trailer" in the branch description, then run "git generated-with"† which (effectively) does

    eval "$(git bdesc | git interpret-trailers --parse | grep ^Generated-with | cut -d: -f 2-)"
where "bdesc" is an alias for
    git -c core.editor=cat branch --edit-description | git stripspace -s

Anyway, I've been hand-editing them out of cover letters for the last few series, but if it doesn't bother anyone I'll just leave it around. Might be helpful for new folks learning how to format patches?

†: https://github.com/benknoble/Dotfiles/blob/master/links/bin/git-generated-with

[1/5] completion: simplify stash subcommand completion [2/5] Completion: extract common stash listing code [3/5] completion: fix Zsh handling of stash names [4/5] doc: drop usage mentions of "git stash save" [5/5] completion: drop "stash save" completion altogether

 Documentation/git-stash.adoc           |  2 --
 builtin/stash.c                        |  1 -
 contrib/completion/git-completion.bash | 22 +++++++++++++---------
 contrib/completion/git-completion.zsh  |  5 +++++
 4 files changed, 18 insertions(+), 12 deletions(-)
Diff-intervalle contre v1 :
1:  d0e461a14a ! 1:  90d36b6445 completion: simplify stash subcommand completion
    @@ Commit message
         The stash completion helper contains a hard-coded list of commands, but
         git-stash provides a mechanism to list such commands
         (--git-completion-helper). The pattern for using it is wrapped by
    -    __git_resolve_builtins, so use it, bring _git_stash closer in line with
    -    other completion helpers.
    +    __git_resolve_builtins, so use it, bringing _git_stash closer in line
    +    with other completion helpers. As a nice side-benefit, this also adds
    +    "store" subcommand completion, which is missing from the explicit list
    +    of subcommands.
     
    -    Note that we maintain the "save" special case, since it was removed from
    +    Note that we maintain the "save" special case†, since it was removed from
         default completion in 0eb5a4f911 (completion: stop showing 'save' for
    -    stash by default, 2018-04-20). We don't have to do anything special with
    -    the exclude (3rd) argument to __git_resolve_builtins, though, because
    -    save is already marked PARSE_OPT_NOCOMPLETE.
    +    stash by default, 2018-04-20). One might think we need to give "save" to
    +    __git_resolve_builtins' 3rd exclude argument to prevent it from
    +    showing up, but we don't: "save" is already marked PARSE_OPT_NOCOMPLETE.
    +
    +    †We don't complete the "save" subcommand unless at least "sa" has been
    +    typed, but we do complete its options if explicitly typed. With this
    +    change, we will complete "save" if GIT_COMPLETION_SHOW_ALL=1.
     
      ## contrib/completion/git-completion.bash ##
     @@ contrib/completion/git-completion.bash: _git_sparse_checkout ()
2:  6c24a833fc = 2:  abf8efb792 Completion: extract common stash listing code
3:  22283a1d5f ! 3:  f4f6b89ff6 completion: fix Zsh handling of stash names
    @@ Commit message
     
         From here, the list-choices widget (on Ctrl-D by default) will show
         stash@{0} and stash@{1}, but the complete-word widget (Tab) will just
    -    add another brace. Zsh things we're trying to do a brace expansion, I
    +    add another brace. Zsh thinks we're trying to do a brace expansion, I
         think! Interestingly, using menu-complete (Ctrl-N) does cycle through
         matches, since it's taking a slightly different completion path in Zsh.
     
         We might try to fix this by passing surrounding single quotes (using the
    -    -S/-p arguments of compadd, which we can do via __gitcomp_nl's other
    -    parameters), and indeed Zsh will generate
    +    -S/-p arguments of compadd, which we can do from Bash in our code via
    +    __gitcomp_nl's other parameters), and indeed Zsh will generate
     
             git stash show 'stash@{
                             cursor ^
4:  985a14f18e = 4:  3762f9d5bb doc: drop usage mentions of "git stash save"
5:  d1d0bf2d9a ! 5:  0266646fb4 completion: drop "stash save" completion altogether
    @@ Commit message
         further documentation suggesting to use it.
     
         Since we recommend push instead, stop completing for "save" and remove a
    -    special case in completion code.
    +    special case in completion code. It still appears for "git stash <tab>"
    +    when GIT_COMPLETION_SHOW_ALL=1, and when typed explicitly we still
    +    complete options for
    +
    +        git stash save --<tab>
    +
    +    which is helpful for folks with finger-memory for save.
     
      ## contrib/completion/git-completion.bash ##
     @@ contrib/completion/git-completion.bash: _git_stash ()
base-commit: 6de20f6092dcf9bdb1c8efe03db4b70c82b423dd
-- 
2.56.0.237.g5414b88716.dirty
Previous: Patrick SteinhardtNext: D. Ben Knoble
Message 17 of 28 in “stash completion miscellany”
  1. 0/5 stash completion miscellanyD. Ben Knoble, Oct 12, 2026
  2. 1/5 completion: simplify stash subcommand completionD. Ben Knoble, Oct 12, 2026
  3. Patrick SteinhardtOct 16, 2026
  4. Ben KnobleOct 19, 2026
  5. 2/5 completion: extract common stash listing codeD. Ben Knoble, Oct 12, 2026
  6. 3/5 completion: fix Zsh handling of stash namesD. Ben Knoble, Oct 12, 2026
  7. Patrick SteinhardtOct 16, 2026
  8. Ben KnobleOct 19, 2026
  9. 4/5 doc: drop usage mentions of "git stash save"D. Ben Knoble, Oct 12, 2026
  10. Patrick SteinhardtOct 16, 2026
  11. 5/5 completion: drop "stash save" completion altogetherD. Ben Knoble, Oct 12, 2026
  12. Patrick SteinhardtOct 16, 2026
  13. Ben KnobleOct 19, 2026
  14. Patrick SteinhardtOct 20, 2026
  15. D. Ben KnobleOct 22, 2026
  16. Patrick SteinhardtOct 23, 2026
  17. 0/5 stash completion miscellanyD. Ben Knoble, Oct 23, 2026
  18. 1/5 completion: simplify stash subcommand completionD. Ben Knoble, Oct 23, 2026
  19. 2/5 Completion: extract common stash listing codeD. Ben Knoble, Oct 23, 2026
  20. Junio C HamanoOct 23, 2026
  21. 3/5 completion: fix Zsh handling of stash namesD. Ben Knoble, Oct 23, 2026
  22. 4/5 doc: drop usage mentions of "git stash save"D. Ben Knoble, Oct 23, 2026
  23. 5/5 completion: drop "stash save" completion altogetherD. Ben Knoble, Oct 23, 2026
  24. Junio C HamanoOct 23, 2026
  25. Ben KnobleOct 23, 2026
  26. Kristoffer HaugsbakkOct 23, 2026
  27. Patrick SteinhardtOct 26, 2026
  28. Junio C HamanoOct 26, 2026

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.