diff options
author | Daniel Shahaf <d.s@daniel.shahaf.name> | 2016-06-07 06:20:40 +0000 |
---|---|---|
committer | Daniel Shahaf <d.s@daniel.shahaf.name> | 2016-06-07 22:53:51 +0000 |
commit | 0516736eae23f5dd3839e3a5abe250d48c4d7d3c (patch) | |
tree | d3851dd28c102fee2fa1c9cc413a9d887856a83f /Completion/Unix/Command | |
parent | 6e834587eb3ade36241f5803daa7aa0148e324fc (diff) | |
download | zsh-0516736eae23f5dd3839e3a5abe250d48c4d7d3c.tar.gz zsh-0516736eae23f5dd3839e3a5abe250d48c4d7d3c.tar.xz zsh-0516736eae23f5dd3839e3a5abe250d48c4d7d3c.zip |
38624: _git: Optimize the last commit's __git_recent_branches__names as suggested by Matthew.
Diffstat (limited to 'Completion/Unix/Command')
-rw-r--r-- | Completion/Unix/Command/_git | 33 |
1 files changed, 9 insertions, 24 deletions
diff --git a/Completion/Unix/Command/_git b/Completion/Unix/Command/_git index 9e572e25d..cc38d4bcf 100644 --- a/Completion/Unix/Command/_git +++ b/Completion/Unix/Command/_git @@ -5645,30 +5645,15 @@ __git_commit_objects_prefer_recent () { (( $+functions[__git_recent_branches__names] )) || __git_recent_branches__names() { - local -a reflog - local reflog_subject - local new_head - local -A seen - reply=() - - reflog=(${(ps:\0:)"$(_call_program reflog git reflog -1000 -z --grep-reflog='\^checkout:\ moving\ from\ ' --pretty='%gs' 2>/dev/null)"}) - for reflog_subject in $reflog; do - new_head=${${=reflog_subject}[4]} - - # Skip values added in previous iterations. - if (( ${+seen[$new_head]} )); then - continue - fi - seen[$new_head]="" # value is ignored - - # Filter out hashes, to leave only ref names. - if [[ $new_head =~ '^[0-9a-f]{40}$' ]]; then - continue - fi - - # All checks passed. Add it. - reply+=( $new_head ) - done + # This parameter expansion does the following: + # 1. Obtains the last 1000 'checkout' operations from the reflog + # 2. Extracts the move-source from each + # 3. Eliminates duplicates + # 4. Eliminates commit hashes (leaving only ref names) + # + # See workers/38592 for an equivalent long-hand implementation, and the rest + # of that thread for why this implementation was chosen instead. + reply=(${${(u)${${(0)"$(_call_program reflog git reflog -1000 -z --grep-reflog='\^checkout:\ moving\ from\ ' --pretty='%gs')"}#checkout: moving from }%% *}:#[[:xdigit:]](#c40)}) } (( $+functions[__git_recent_branches] )) || |