diff options
author | Daniel Shahaf <d.s@daniel.shahaf.name> | 2016-11-12 01:01:28 +0000 |
---|---|---|
committer | Daniel Shahaf <d.s@daniel.shahaf.name> | 2016-11-17 15:32:04 +0000 |
commit | d7b57cc9576648020f4f68b52cce5c7e59548258 (patch) | |
tree | f36bb01e5eb20755f9f80d495b5fd5af72debe9b /Completion | |
parent | 307da989d898510750d0d40b39fbc321c8b4e853 (diff) | |
download | zsh-d7b57cc9576648020f4f68b52cce5c7e59548258.tar.gz zsh-d7b57cc9576648020f4f68b52cce5c7e59548258.tar.xz zsh-d7b57cc9576648020f4f68b52cce5c7e59548258.zip |
39922: __git_recent_branches: Fix an 'assertion' failure when two branches (refs) point to the same commit.
Diffstat (limited to 'Completion')
-rw-r--r-- | Completion/Unix/Command/_git | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/Completion/Unix/Command/_git b/Completion/Unix/Command/_git index 17a7b1e07..94457fce2 100644 --- a/Completion/Unix/Command/_git +++ b/Completion/Unix/Command/_git @@ -6076,7 +6076,8 @@ __git_recent_branches__names() (( $+functions[__git_recent_branches] )) || __git_recent_branches() { - local -a branches descriptions + local -a branches + local -A descriptions local -a reply local -aU valid_ref_names_munged=( ${"${(f)"$(_call_program valid-ref-names 'git for-each-ref --format="%(refname)" refs/heads/ refs/tags/')"}"#refs/(heads|tags)/} ) @@ -6093,19 +6094,15 @@ __git_recent_branches() { fi # 4. Obtain log messages for all of them in one shot. - descriptions=( ${(f)"$(_call_program all-descriptions git --no-pager log --no-walk=unsorted --pretty=%s ${(q)branches} --)"} ) - - if (( $#branches != $#descriptions )); then - # ### Trouble... - zle -M "__git_recent_branches: \$#branches != \$#descriptions" - return 1 - fi + # TODO: we'd really like --sort=none here... but git doesn't support such a thing. + # The \n removal is because for-each-ref prints a \n after each entry. + descriptions=( ${(0)"$(_call_program all-descriptions "git --no-pager for-each-ref --format='%(refname)%00%(subject)%00'" refs/heads/${(q)^branches} refs/tags/${(q)^branches} "--")"//$'\n'} ) # 5. Synthesize the data structure _describe wants. local -a branches_colon_descriptions - local branch description - for branch description in ${branches:^descriptions} ; do - branches_colon_descriptions+="${branch//:/\:}:${description}" + local branch + for branch in ${branches} ; do + branches_colon_descriptions+="${branch//:/\:}:${(v)descriptions[(I)(refs/heads/|refs/tags/)${(b)branch}]}" done _describe -V -t recent-branches "recent branches" branches_colon_descriptions |