Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: git checkout @... completion

Robbie Gates wrote on Tue, Mar 31, 2015 at 22:10:42 +1100:
> I've attached a patch (against a local copy) - please let me
> know if it's better to submit changes as a PR and i'll do that.

Patches are preferred.

>   In particular, it could be rewritten to loop over git check-ref-format
> --branch "@{-$i}" for increasing i until a given (by completion style
> maybe, or environment variable) number of unique previous branches was

The number of external command invocations should be minimized,
therefore, this doesn't sound like a good approach.

> Any pointers to completions with a configurable depth / length that
> i could use to glean the right way to do this kind of thing welcome.

I don't have a concrete example in mind, but grepping for uses of
'zstyle -s' might turn one up.

I'm unsure this should be made configurable.  Hardcoding a small
constant might be better.  I suspect 9 is too small, but not having used
this patch "in the field" that's just a guess.

On the other hand, __git_recent_commits had exactly the same problem:
what argument to pass to 'git log --limit=N'.  So perhaps a "limit"
style, or some such, would be justified, which both of these (and other
places) could use.

> diff --git a/functions/_git b/functions/_git

Please ensure attachments have the text/plain MIME type.  Usually naming
them with a "*.txt" extension does that.  Thanks.

> index c4e386b..884756c 100644
> --- a/functions/_git
> +++ b/functions/_git

What is the patch relative to?  There is no "functions/_git" in zsh's
repository [git://git.code.sf.net/p/zsh/code].

> @@ -5769,6 +5779,14 @@ __git_notes_refs () {
>    _wanted notes-refs expl 'notes ref' compadd $* - $notes_refs
>  }
> +(( $+functions[__git_previous_branches] )) ||
> +__git_previous_branches () {
> +  declare -a previous_branches
> +  # We don't need to escape : in branch names, because they can't be there (see git help check-ref-format)
> +  previous_branches=(${(f)"$(_call_program previous-branches "git log --max-count=9 --walk-reflogs --grep-reflog '^checkout: moving from .* to' --format='%gs' 2>/dev/null" | awk '{if (!seen[$4]) { seen[$4]=1 ; print "@{-" NR "}:" $4 } }')"})

I see some other completions use awk, but I think it would be better to
avoid it, if possible; and here it's easily possible.  Perhaps something
like this:

    previous_branches=( ${${(f)"$(git reflog -9 --grep-reflog checkout: )"}##* } )

and then arrange the uniquification and @{-N} prefixes in zsh code,
through a unique array ('local -Ua') or an associative array.

> +  _describe "previous branch" previous_branches

Note that if the limit would be greater than 9, _describe would by
default sort the matches alphabetically, not numerically.  See
__git_recent_commits for an example of using _describe while retaining
the array sort order (in this case, the numerical order).  The problem
discussed in workers/34768 won't be a concern here because you already
uniquify the descriptions.

When reflog contains a detached head, the patch prints the full 40-digit
hash.  Is there a cheap way to shorten it into an unambiguous prefix?

I imagine in the future this could be extended to print not just
"checkout:" reflog entries, but also other entries.  Use-case: going to
the point before a rebase (which may be a commit, rather than
a checkout).

Thanks for the patch.  Looking forward to the revised version.

(I'm going to be on-and-off AFK for the next couple of weeks, so I might
be late to reply.)

Messages sorted by: Reverse Date, Date, Thread, Author