about summary refs log tree commit diff
path: root/Functions
diff options
context:
space:
mode:
authorDaniel Shahaf <d.s@daniel.shahaf.name>2018-10-02 15:20:54 +0000
committerDaniel Shahaf <d.s@daniel.shahaf.name>2018-10-07 15:05:19 +0000
commit5c9ef1a1faf42136ce330aa6f8e2123e83497239 (patch)
treee074a201175cb92d2b780fa6939a638d8ab77dac /Functions
parent0c00eed4c77aee7af64e9272bfd1cddb8663e477 (diff)
downloadzsh-5c9ef1a1faf42136ce330aa6f8e2123e83497239.tar.gz
zsh-5c9ef1a1faf42136ce330aa6f8e2123e83497239.tar.xz
zsh-5c9ef1a1faf42136ce330aa6f8e2123e83497239.zip
43587: vcs_info git: In 'git rebase -i', when computing subjects of applied-patches, handle an edge case where the subject is not available.
Diffstat (limited to 'Functions')
-rw-r--r--Functions/VCS_Info/Backends/VCS_INFO_get_data_git19
1 files changed, 19 insertions, 0 deletions
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git
index 087a8a283..04d15bb4a 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git
@@ -196,6 +196,24 @@ elif [[ -d "${gitdir}/rebase-merge" ]]; then
                 # The line is of the form "pick $hash $subject".
                 # Just strip the verb and we're good to go.
                 p=${p#* }
+                # Special case: in an interactive rebase, if the user wrote "p $shorthash\n"
+                # in the editor (without a description after the hash), then the .../done
+                # file will contain "p $longhash $shorthash\n" (git 2.11.0) or "pick $longhash\n"
+                # (git 2.19.0).
+                if [[ $p != *\ * ]]; then
+                        # The line is of the form "pick $longhash\n"
+                        #
+                        # Mark the log message subject as unknown.
+                        # TODO: Can we performantly obtain the subject?
+                        p+=" ?"
+                elif (( ${#${p//[^ ]}} == 1 )) && [[ ${p%% *} == ${p#* }* ]]; then
+                        # The line is of the form "p $longhash $shorthash\n"
+                        #
+                        # The shorthash is superfluous, so discard it, and mark
+                        # the log message subject as unknown.
+                        # TODO: Can we performantly obtain the subject?
+                        p="${p%% *} ?"
+                fi
                 ;;
             (x *)
                 # The line is of the form 'exec foo bar baz' where 'foo bar
@@ -212,6 +230,7 @@ elif [[ -d "${gitdir}/rebase-merge" ]]; then
         git_patches_applied+=("$p")
     done
     if [[ -f "${patchdir}/git-rebase-todo" ]] ; then
+        # TODO: Process ${patchdir}/git-rebase-todo lines like ${patchdir}/done lines are
         git_patches_unapplied=( ${${(f)${"$(<"${patchdir}/git-rebase-todo")"}}:#[#]*} )
     fi
     VCS_INFO_git_handle_patches