about summary refs log tree commit diff
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
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.
-rw-r--r--ChangeLog5
-rw-r--r--Functions/VCS_Info/Backends/VCS_INFO_get_data_git19
2 files changed, 24 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index f6d0af294..af9107e62 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2018-10-07  Daniel Shahaf  <d.s@daniel.shahaf.name>
 
+	* 43587: Functions/VCS_Info/Backends/VCS_INFO_get_data_git:
+	vcs_info git: In 'git rebase -i', when computing subjects
+	of applied-patches, handle an edge case where the subject is
+	not available.
+
 	* 43588: Functions/VCS_Info/Backends/VCS_INFO_get_data_git:
 	vcs_info git: Make sure applied-patches is of the form "$hash
 	$subject" --- that is, has a space and a non-empty second
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