vim-patch.sh: list related missing Vim patches [ci skip] #11514

* scripts/vim-patch.sh: factor out _set_tokens_and_tags

This allows for caching `$tokens` and `$vim_commit_tags`, which will
become relevant with the next commit adding
`list_missing_previous_vimpatches_for_patch`.
This commit is contained in:
Daniel Hahler 2019-12-24 08:15:18 +01:00 committed by Justin M. Keyes
parent b3686b1597
commit 34abe8fd23

View File

@ -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