aboutsummaryrefslogtreecommitdiff
path: root/scripts/vim-patch.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/vim-patch.sh')
-rwxr-xr-xscripts/vim-patch.sh122
1 files changed, 100 insertions, 22 deletions
diff --git a/scripts/vim-patch.sh b/scripts/vim-patch.sh
index b6a0df4649..483264415e 100755
--- a/scripts/vim-patch.sh
+++ b/scripts/vim-patch.sh
@@ -395,13 +395,48 @@ list_vimpatch_numbers() {
done
}
+declare -A tokens
+declare -A vim_commit_tags
+
+_set_tokens_and_tags() {
+ if [[ -n "${tokens[*]}" ]]; then
+ return
+ fi
+
+ # Find all "vim-patch:xxx" tokens in the Nvim git log.
+ for token in $(list_vimpatch_tokens); do
+ tokens[$token]=1
+ done
+
+ # Create an associative array mapping Vim commits to tags.
+ eval "vim_commit_tags=(
+ $(git -C "${VIM_SOURCE_DIR}" for-each-ref refs/tags \
+ --format '[%(objectname)]=%(refname:strip=2)' \
+ --sort='-*authordate' \
+ --shell)
+ )"
+ # Exit in case of errors from the above eval (empty vim_commit_tags).
+ if ! (( "${#vim_commit_tags[@]}" )); then
+ msg_err "Could not get Vim commits/tags."
+ exit 1
+ fi
+}
+
# Prints a newline-delimited list of Vim commits, for use by scripts.
# "$1": use extended format?
# "$@" is passed to list_vim_commits, as extra arguments to git-log.
list_missing_vimpatches() {
+ local -a missing_vim_patches=()
+ _set_missing_vimpatches "$@"
+ for line in "${missing_vim_patches[@]}"; do
+ printf '%s\n' "$line"
+ done
+}
+
+# Sets / appends to missing_vim_patches (useful to avoid a subshell when
+# used multiple times to cache tokens/vim_commit_tags).
+_set_missing_vimpatches() {
local token vim_commit vim_tag patch_number
- declare -A tokens
- declare -A vim_commit_tags
declare -a git_log_args
local extended_format=$1; shift
@@ -416,6 +451,7 @@ list_missing_vimpatches() {
[^\(.*/\)?src/nvim/\(.*\)]="\${BASH_REMATCH[1]}src/\${BASH_REMATCH[2]}"
[^\(.*/\)?\.vim-src/\(.*\)]="\${BASH_REMATCH[2]}"
)
+ local i j
for i in "$@"; do
for j in "${!git_log_replacements[@]}"; do
if [[ "$i" =~ $j ]]; then
@@ -426,23 +462,7 @@ list_missing_vimpatches() {
git_log_args+=("$i")
done
- # Find all "vim-patch:xxx" tokens in the Nvim git log.
- for token in $(list_vimpatch_tokens); do
- tokens[$token]=1
- done
-
- # Create an associative array mapping Vim commits to tags.
- eval "declare -A vim_commit_tags=(
- $(git -C "${VIM_SOURCE_DIR}" for-each-ref refs/tags \
- --format '[%(objectname)]=%(refname:strip=2)' \
- --sort='-*authordate' \
- --shell)
- )"
- # Exit in case of errors from the above eval (empty vim_commit_tags).
- if ! (( "${#vim_commit_tags[@]}" )); then
- msg_err "Could not get Vim commits/tags."
- exit 1
- fi
+ _set_tokens_and_tags
# Get missing Vim commits
set +u # Avoid "unbound variable" with bash < 4.4 below.
@@ -474,9 +494,9 @@ list_missing_vimpatches() {
if [[ "${tokens[$patch_number]-}" ]]; then
continue
fi
- printf '%s%s\n' "$vim_tag" "$info"
+ missing_vim_patches+=("$vim_tag$info")
else
- printf '%s%s\n' "$vim_commit" "$info"
+ missing_vim_patches+=("$vim_commit$info")
fi
done < <(list_vim_commits "${git_log_args[@]}")
set -u
@@ -512,6 +532,59 @@ Instructions:
EOF
}
+list_missing_previous_vimpatches_for_patch() {
+ local for_vim_patch="${1}"
+ local vim_commit vim_tag
+ assign_commit_details "${for_vim_patch}"
+
+ local file
+ local -a missing_list
+ local -a fnames
+ while IFS= read -r line ; do
+ fnames+=("$line")
+ done < <(git -C "${VIM_SOURCE_DIR}" diff-tree --no-commit-id --name-only -r "${vim_commit}")
+ local i=0
+ local n=${#fnames[@]}
+ printf '=== getting missing patches for %d files ===\n' "$n"
+ if [[ -z "${vim_tag}" ]]; then
+ printf 'NOTE: "%s" is not a Vim tag - listing all oldest missing patches\n' "${for_vim_patch}" >&2
+ fi
+ for fname in "${fnames[@]}"; do
+ i=$(( i+1 ))
+ printf '[%.*d/%d] %s: ' "${#n}" "$i" "$n" "$fname"
+
+ local -a missing_vim_patches=()
+ _set_missing_vimpatches 1 -- "${fname}"
+
+ local missing_vim_commit_info="${missing_vim_patches[0]}"
+ if [[ -z "${missing_vim_commit_info}" ]]; then
+ printf -- "-\n"
+ else
+ local missing_vim_commit="${missing_vim_commit_info%%:*}"
+ if [[ -z "${vim_tag}" ]] || [[ "${missing_vim_commit}" < "${vim_tag}" ]]; then
+ printf -- "%s\n" "$missing_vim_commit_info"
+ missing_list+=("$missing_vim_commit_info")
+ else
+ printf -- "-\n"
+ fi
+ fi
+ done
+
+ if [[ -z "${missing_list[*]}" ]]; then
+ msg_ok 'no missing previous Vim patches'
+ return 0
+ fi
+
+ local -a missing_unique
+ while IFS= read -r line; do
+ missing_unique+=("$line")
+ done < <(printf '%s\n' "${missing_list[@]}" | sort -u)
+
+ msg_err "$(printf '%d missing previous Vim patches:' ${#missing_unique[@]})"
+ printf ' - %s\n' "${missing_unique[@]}"
+ return 1
+}
+
review_commit() {
local nvim_commit_url="${1}"
local nvim_patch_url="${nvim_commit_url}.patch"
@@ -609,7 +682,7 @@ review_pr() {
clean_files
}
-while getopts "hlLMVp:P:g:r:s" opt; do
+while getopts "hlLmMVp:P:g:r:s" opt; do
case ${opt} in
h)
usage
@@ -629,6 +702,11 @@ while getopts "hlLMVp:P:g:r:s" opt; do
list_vimpatch_numbers
exit 0
;;
+ m)
+ shift # remove opt
+ list_missing_previous_vimpatches_for_patch "$@"
+ exit 0
+ ;;
p)
stage_patch "${OPTARG}"
exit