From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4650 invoked by alias); 1 Apr 2015 09:41:23 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 34831 Received: (qmail 12535 invoked from network); 1 Apr 2015 09:41:19 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= daniel.shahaf.name; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-sasl-enc :x-sasl-enc; s=mesmtp; bh=dDArKSJDOZDIeU1nXL1Gll7f3XU=; b=Nq846r KXIv7GneeQyT6M851EyYsAUCe1beeTz4X3RdPurfMtMVisQxYSE/GrLawvlyRrta 3pq4QSaQRjgMroZKqlY+Oz3v+FlpZ0/m3vk8FCE2CJuB+ipTlFPMrkah0epjKXGP muygfYXKkKFuzFGbm9UezndghQRANONxgi0TA= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-sasl-enc :x-sasl-enc; s=smtpout; bh=dDArKSJDOZDIeU1nXL1Gll7f3XU=; b=dZdda WLDwp7L0I2SQalNU4DDO+wbpALTUCKeV05QXllEKLHi9dW6L9KpcDTJVExT5TV63 U0JZDGwpxjKwAJI1g0IPWoesu8H65xlD95fhGxE3bWL9fswZ+j6ihC+1xlimrq+/ UyzApgxEdPCWG/LP7KvpnxRu+Po7Nouyf3U49w= X-Sasl-enc: dr6JiNzAS7gEGw1uc95RjhhCGbAud89j2QrEH4k/EJgC 1427881276 Date: Wed, 1 Apr 2015 09:41:13 +0000 From: Daniel Shahaf To: Robbie Gates Cc: zsh-workers@zsh.org Subject: Re: git checkout @... completion Message-ID: <20150401094113.GF2168@tarsus.local2> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) 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. Daniel (I'm going to be on-and-off AFK for the next couple of weeks, so I might be late to reply.)