build: preprocess vim patches with uncrustify #20786

This will enable a larger amount of chunks being automatically included
due to fewer formatting differences between the vim and neovim files.

The strategy is straightforward, if a bit tedious:

- Get a list of all changed files.
- Checkout parent commit. Copy all relevant files to a temporary
  location.
- Checkout patch commit. Copy all relevant files to a temporary
  location.
- Format .c and .h files with uncrustify.
- Generate a diff from from these files.

Closes https://github.com/neovim/neovim/issues/6226
This commit is contained in:
dundargoc
2022-10-24 15:27:52 +02:00
committed by GitHub
parent 4573cfa3ad
commit 69ffbda84d

View File

@ -279,6 +279,53 @@ preprocess_patch() {
LC_ALL=C sed -e 's/\( [ab]\/runtime\/doc\)\/terminal\.txt/\1\/nvim_terminal_emulator.txt/g' \
"$file" > "$file".tmp && mv "$file".tmp "$file"
# Rename test_urls.vim to check_urls.vim
LC_ALL=C sed -e 's@\( [ab]\)/runtime/doc/test\(_urls\.vim\)@\1/scripts/check\2@g' \
"$file" > "$file".tmp && mv "$file".tmp "$file"
# Rename path to check_colors.vim
LC_ALL=C sed -e 's@\( [ab]/runtime\)/colors/\(tools/check_colors\.vim\)@\1/\2@g' \
"$file" > "$file".tmp && mv "$file".tmp "$file"
}
uncrustify_patch() {
local commit="$1"
local changed_files=()
while IFS='' read -r file; do changed_files+=("$file"); done < <(git diff-tree --name-only --no-commit-id -r "${commit}")
local patch_path=$NVIM_SOURCE_DIR/build/vim_patch
rm -rf "$patch_path"
mkdir -p "$patch_path"/{before,after,patch}
git checkout --quiet "$commit"~
for file in "${changed_files[@]}"; do
if [[ -e $file ]]; then
cp "$file" "$patch_path"/before
fi
done
git checkout --quiet "$commit"
for file in "${changed_files[@]}"; do
if [[ -e $file ]]; then
cp "$file" "$patch_path"/after
fi
done
# If the difference are drastic enough uncrustify may need to be used more
# than once. This is obviously a bug that needs to be fixed on uncrustify's
# end, but in the meantime this workaround is sufficient.
for _ in {1..2}; do
uncrustify -c "$NVIM_SOURCE_DIR"/src/uncrustify.cfg -q --replace --no-backup "$patch_path"/{before,after}/*.[ch]
done
for file in "${changed_files[@]}"; do
local basename
basename=$(basename "$file")
local before=$patch_path/before/$basename
local after=$patch_path/after/$basename
local patchfile="$patch_path"/patch/"$basename".patch
if [[ ! -e $before ]] || [[ ! -e $after ]]; then
continue
fi
git --no-pager diff --no-index --patch --unified=5 --color=never "$before" "$after" > "$patchfile"
sed -E "s|$before|/$file|g" -i "$patchfile"
@ -287,7 +334,12 @@ get_vimpatch() {
cat "$patch_path"/patch/*.patch
}
get_vimpatch() {
get_vim_sources
assign_commit_details "${1}"
msg_ok "Found Vim revision '${vim_commit}'."
local patch_content