summaryrefslogtreecommitdiff
path: root/Functions/VCS_Info
diff options
context:
space:
mode:
authorAxel Beckert <abe@deuxchevaux.org>2016-12-04 04:32:03 +0100
committerAxel Beckert <abe@deuxchevaux.org>2016-12-04 04:32:03 +0100
commit3e439c3863f14c82f70666804c8570a13b3732e6 (patch)
tree07036c43e0f3f9242bb6dd42cd2a849ec8ea8aca /Functions/VCS_Info
parent2aedc4b88fd0e87b89583983951b04b96f48efd3 (diff)
parent7b7e84f0815ed22a0ee348a217776529035dccf3 (diff)
downloadzsh-3e439c3863f14c82f70666804c8570a13b3732e6.tar.gz
zsh-3e439c3863f14c82f70666804c8570a13b3732e6.zip
Merge tag 'zsh-5.2-test-1' into debian
Diffstat (limited to 'Functions/VCS_Info')
-rw-r--r--Functions/VCS_Info/Backends/VCS_INFO_get_data_git8
-rw-r--r--Functions/VCS_Info/Backends/VCS_INFO_get_data_hg7
-rw-r--r--Functions/VCS_Info/VCS_INFO_hexdump16
-rw-r--r--Functions/VCS_Info/VCS_INFO_patch2subject50
-rw-r--r--Functions/VCS_Info/VCS_INFO_quilt24
-rw-r--r--Functions/VCS_Info/vcs_info2
6 files changed, 88 insertions, 19 deletions
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git
index 472c10d5d..18ba89a9a 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_git
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_git
@@ -213,8 +213,12 @@ elif [[ -d "${gitdir}/rebase-merge" ]]; then
local p
[[ -f "${patchdir}/done" ]] &&
for p in ${(f)"$(< "${patchdir}/done")"}; do
- # remove action
- git_patches_applied+=("${${(s: :)p}[2,-1]}")
+ # pick/edit/fixup/squash/reword: Add "$hash $subject" to $git_patches_applied.
+ # exec: Add "exec ${command}" to $git_patches_applied.
+ # (anything else): As 'exec'.
+ p=${p/(#s)(p|pick|e|edit|r|reword|f|fixup|s|squash) /}
+ p=${p/(#s)x /exec }
+ git_patches_applied+=("$p")
done
if [[ -f "${patchdir}/git-rebase-todo" ]] ; then
git_patches_unapplied=(${(f)"$(grep -v '^$' "${patchdir}/git-rebase-todo" | grep -v '^#')"})
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg b/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg
index f35ad5965..69b7db304 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg
@@ -40,9 +40,10 @@ VCS_INFO_adjust
# Disabled by default anyway, so no harm done.
if zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" get-revision ; then
if zstyle -t ":vcs_info:${vcs}:${usercontext}:${rrn}" use-simple \
- && ( VCS_INFO_check_com hexdump ) && [[ -r ${dirstatefile} ]] ; then
- # Calling hexdump is (much) faster than hg but doesn't get the local rev
- r_csetid=$(hexdump -n 20 -e '1/1 "%02x"' ${dirstatefile})
+ && VCS_INFO_hexdump ${dirstatefile} 20 ; then
+ # Calling VCS_INFO_hexdump is (much) faster than hg but doesn't get
+ # the local rev
+ r_csetid=$REPLY
else
# Settling for a short (but unique!) hash because getting the full
# 40-char hash in addition to all the other info we want isn't
diff --git a/Functions/VCS_Info/VCS_INFO_hexdump b/Functions/VCS_Info/VCS_INFO_hexdump
new file mode 100644
index 000000000..11f1c1a50
--- /dev/null
+++ b/Functions/VCS_Info/VCS_INFO_hexdump
@@ -0,0 +1,16 @@
+## vim:ft=zsh
+
+# VCS_INFO_hexdump FILENAME BYTECOUNT
+#
+# Return in $REPLY a hexadecimal representation (lowercase, no whitespace)
+# of the first BYTECOUNT bytes of FILENAME.
+
+if [[ -r $1 ]]; then
+ setopt localoptions nomultibyte extendedglob
+ local val
+ read -k $2 -u 0 val <$1
+ REPLY=${(Lj::)${(l:2::0:)${(@s//)val}//(#m)*/$(( [##16] ##$MATCH ))}}
+else
+ return 1
+fi
+
diff --git a/Functions/VCS_Info/VCS_INFO_patch2subject b/Functions/VCS_Info/VCS_INFO_patch2subject
new file mode 100644
index 000000000..583467bc8
--- /dev/null
+++ b/Functions/VCS_Info/VCS_INFO_patch2subject
@@ -0,0 +1,50 @@
+# This function takes as an argument a filename of a patch and sets $REPLY to
+# a single-line "subject", or unsets it if no subject could be extracted.
+{
+ integer i
+ integer -r LIMIT=10
+ local -a lines
+ local needle
+ if [[ -f "$1" ]]; then
+ # Extract the first LIMIT lines, or up to the first empty line or the start of the unidiffs,
+ # whichever comes first.
+ while (( i++ < LIMIT )); do
+ IFS= read -r "lines[$i]"
+ if [[ -z ${lines[$i]} ]] || [[ ${lines[$i]} == (#b)(---|Index:)* ]]; then
+ lines[$i]=()
+ break
+ fi
+ done < "$1"
+
+ if needle=${lines[(i)Subject:*]}; (( needle <= $#lines )); then
+ # "Subject: foo" line, plus rfc822 whitespace unfolding.
+ #
+ # Example: 'git format-patch' patches.
+ REPLY=${lines[needle]}
+ REPLY=${REPLY#*: }
+ REPLY=${REPLY#\[PATCH\] }
+ while [[ ${${lines[++needle]}[1]} == ' ' ]]; do
+ REPLY+=${lines[needle]}
+ done
+ elif needle=${lines[(r)Description:*]}; [[ -n $needle ]]; then
+ # "Description: foo" line.
+ #
+ # Example: DEP-3 patches.
+ REPLY=${needle#*: }
+ elif [[ ${lines[1]} == '# HG changeset patch' ]] && { needle=${${lines:#([#]*)}[1]}; [[ -n $needle ]] }; then
+ # Mercurial patch
+ REPLY=$needle
+ elif (( ${+lines[1]} )); then
+ # The first line of the file is not part of the diff.
+ REPLY=${lines[1]}
+ else
+ # The patch has no subject.
+ unset REPLY
+ return 0
+ fi
+ else
+ # The patch cannot be examined, or invalid arguments.
+ unset REPLY
+ return 1
+ fi
+}
diff --git a/Functions/VCS_Info/VCS_INFO_quilt b/Functions/VCS_Info/VCS_INFO_quilt
index c3c3d864d..4c61506cd 100644
--- a/Functions/VCS_Info/VCS_INFO_quilt
+++ b/Functions/VCS_Info/VCS_INFO_quilt
@@ -80,6 +80,10 @@ function VCS_INFO_quilt-dirfind() {
return ${ret}
}
+function VCS_INFO_quilt-patch2subject() {
+ VCS_INFO_patch2subject "$@"
+}
+
function VCS_INFO_quilt() {
emulate -L zsh
setopt extendedglob
@@ -119,7 +123,7 @@ function VCS_INFO_quilt() {
applied=()
fi
patches=$(<$pc/.quilt_patches)
- patches=`builtin cd -q "${pc:h}" && print -r - ${patches:A}`
+ patches=`builtin cd -q "${pc:h}" && print -r - ${patches:P}`
fi
if zstyle -t "${context}" get-unapplied; then
# This zstyle call needs to be moved further up if `quilt' needs
@@ -147,27 +151,19 @@ function VCS_INFO_quilt() {
if [[ -n $patches ]]; then
() {
- local i line
+ local i
for ((i=1; i<=$#applied; i++)); do
- if [[ -f "$patches/$applied[$i]" ]] &&
- read -r line < "$patches/$applied[$i]" &&
- [[ $line != (#b)(---|Index:)* ]] &&
- true
- ;
+ if VCS_INFO_quilt-patch2subject "$patches/$applied[$i]" && (( $+REPLY ))
then
- applied[$i]+=" $line"
+ applied[$i]+=" $REPLY"
else
applied[$i]+=" ?"
fi
done
for ((i=1; i<=$#unapplied; i++)); do
- if [[ -f "$patches/$unapplied[$i]" ]] &&
- read -r line < "$patches/$unapplied[$i]" &&
- [[ $line != (#b)(---|Index:)* ]] &&
- true
- ;
+ if VCS_INFO_quilt-patch2subject "$patches/$unapplied[$i]" && (( $+REPLY ))
then
- unapplied[$i]+=" $line"
+ unapplied[$i]+=" $REPLY"
else
unapplied[$i]+=" ?"
fi
diff --git a/Functions/VCS_Info/vcs_info b/Functions/VCS_Info/vcs_info
index f13f6b501..24ae98e52 100644
--- a/Functions/VCS_Info/vcs_info
+++ b/Functions/VCS_Info/vcs_info
@@ -19,9 +19,11 @@ static_functions=(
VCS_INFO_check_com
VCS_INFO_formats
VCS_INFO_get_cmd
+ VCS_INFO_hexdump
VCS_INFO_hook
VCS_INFO_maxexports
VCS_INFO_nvcsformats
+ VCS_INFO_patch2subject
VCS_INFO_quilt
VCS_INFO_realpath
VCS_INFO_reposub