Add generic scripts to import patches and sync variants
This commit is contained in:
parent
0d4177fc67
commit
1df7498ca9
|
@ -0,0 +1,122 @@
|
||||||
|
#!/usr/bin/bash
|
||||||
|
|
||||||
|
# Imports patches from a Git repository to replace all currently present patches of a PKGBUILD
|
||||||
|
|
||||||
|
# setup shell environment
|
||||||
|
#set -euxo pipefail
|
||||||
|
set -e # abort on first error
|
||||||
|
shopt -s nullglob
|
||||||
|
source /usr/share/makepkg/util/message.sh
|
||||||
|
colorize
|
||||||
|
|
||||||
|
# read arguments
|
||||||
|
if [[ ! $1 ]] || [[ ! $2 ]] || [[ ! $3 ]]; then
|
||||||
|
echo 'Imports patches from a Git repository to replace all currently present patches of a PKGBUILD'
|
||||||
|
echo "usage: $0 path/to/PKGBUILD path/to/git-repo commit-range"
|
||||||
|
echo "example: $0 ~/pkgbuilds/some-project/default/PKGBUILD ~/repos/some-project master..fixes-for-arch-package"
|
||||||
|
echo "caveats: Only supports sha256sums (so far). Variables in other source lines than the first are not preserved."
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
pkgbuild_file=$1
|
||||||
|
pkgbuild_dir=${pkgbuild_file%/*}
|
||||||
|
git_repo_path=$2
|
||||||
|
git_commit_range=$3
|
||||||
|
if [[ ! -f $pkgbuild_file ]]; then
|
||||||
|
error "The specified PKGBUILD file \"$pkgbuild_file\" does not exist."
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
if [[ ! -d $git_repo_path ]]; then
|
||||||
|
error "The specified Git repository \"$git_repo_path\" does not exist."
|
||||||
|
exit -2
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg "Sourcing $pkgbuild_file"
|
||||||
|
source "$pkgbuild_file"
|
||||||
|
|
||||||
|
msg "Determine sources/checksums to be preserved"
|
||||||
|
new_sources=()
|
||||||
|
new_sha256sums=()
|
||||||
|
file_index=0
|
||||||
|
for source in "${source[@]}"; do
|
||||||
|
# TODO: support other checksums than SHA-256
|
||||||
|
if [ "${source: -6}" != .patch ]; then
|
||||||
|
new_sources+=("$source")
|
||||||
|
new_sha256sums+=("${sha256sums[$file_index]}")
|
||||||
|
msg2 "$source; ${sha256sums[$file_index]}"
|
||||||
|
fi
|
||||||
|
file_index=$((file_index + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
msg "Removing old patches"
|
||||||
|
patches=("$pkgbuild_dir"/*.patch)
|
||||||
|
for patch in "${patches[@]}"; do
|
||||||
|
if [[ -f $patch ]]; then
|
||||||
|
msg2 "$patch"
|
||||||
|
rm "$patch"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
msg "Exporting patches"
|
||||||
|
[ "${pkgbuild_dir:0:1}" != / ] \
|
||||||
|
&& absolute_pkgbuild_dir=$PWD/$pkgbuild_dir \
|
||||||
|
|| absolute_pkgbuild_dir=$pkgbuild_dir
|
||||||
|
git -C "$git_repo_path" format-patch "$git_commit_range" --output-directory "$absolute_pkgbuild_dir"
|
||||||
|
|
||||||
|
msg "Determine new sources/checksums"
|
||||||
|
new_patches=("$pkgbuild_dir"/*.patch)
|
||||||
|
for patch in "${new_patches[@]}"; do
|
||||||
|
new_sources+=("$patch")
|
||||||
|
sum=$(sha256sum "$patch")
|
||||||
|
sum=${sum%% *}
|
||||||
|
new_sha256sums+=("$sum")
|
||||||
|
msg2 "$patch; $sum"
|
||||||
|
done
|
||||||
|
|
||||||
|
msg "Adjust PKGBUILD file"
|
||||||
|
# preserve first src line to keep variables unevaluated
|
||||||
|
# FIXME: allow this for all sources which should be preserved
|
||||||
|
newsrc=$(grep 'source=(' "$pkgbuild_file")
|
||||||
|
[[ $newsrc ]] || newsrc="source=(${new_sources[0]}"
|
||||||
|
[ "${newsrc: -1:1}" == ')' ] && newsrc="${newsrc: 0:-1}" # truncate trailing )
|
||||||
|
# add sources
|
||||||
|
for source in "${new_sources[@]:1}"; do
|
||||||
|
newsrc+="\n '${source##*/}'"
|
||||||
|
done
|
||||||
|
newsrc+=')'
|
||||||
|
# add sha256sums
|
||||||
|
newsums="sha256sums=('${new_sha256sums[0]}'"
|
||||||
|
for sum in "${new_sha256sums[@]:1}"; do
|
||||||
|
newsums+="\n '${sum}'"
|
||||||
|
done
|
||||||
|
newsums+=')'
|
||||||
|
# apply changes
|
||||||
|
mv "$pkgbuild_file" "$pkgbuild_file.bak"
|
||||||
|
awk -v newsrc="$newsrc" -v newsums="$newsums" '
|
||||||
|
/^[[:blank:]]*source(_[^=]+)?=/,/\)[[:blank:]]*(#.*)?$/ {
|
||||||
|
if (!s) {
|
||||||
|
print newsrc
|
||||||
|
s++
|
||||||
|
}
|
||||||
|
next
|
||||||
|
}
|
||||||
|
/^[[:blank:]]*(md|sha)[[:digit:]]+sums(_[^=]+)?=/,/\)[[:blank:]]*(#.*)?$/ {
|
||||||
|
if (!w) {
|
||||||
|
print newsums
|
||||||
|
w++
|
||||||
|
}
|
||||||
|
next
|
||||||
|
}
|
||||||
|
|
||||||
|
1
|
||||||
|
END {
|
||||||
|
if (!s) {
|
||||||
|
print newsrc
|
||||||
|
}
|
||||||
|
if (!w) {
|
||||||
|
print newsums
|
||||||
|
}
|
||||||
|
}
|
||||||
|
' "$pkgbuild_file.bak" > "$pkgbuild_file"
|
||||||
|
|
||||||
|
msg "Diff"
|
||||||
|
diff -Naur "$pkgbuild_file.bak" "$pkgbuild_file"
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/usr/bin/bash -e
|
||||||
|
../sync-variants.sh qt5-base mingw-w64 mingw-w64-{static,dynamic,angle}
|
|
@ -0,0 +1,91 @@
|
||||||
|
#!/usr/bin/bash
|
||||||
|
|
||||||
|
# Syncs different variants of a PKGBUILD
|
||||||
|
|
||||||
|
# setup shell environment
|
||||||
|
#set -euxo pipefail
|
||||||
|
set -e # abort on first error
|
||||||
|
shopt -s nullglob
|
||||||
|
shopt -s extglob
|
||||||
|
export BASHOPTS
|
||||||
|
source /usr/share/makepkg/util/message.sh
|
||||||
|
colorize
|
||||||
|
|
||||||
|
# declare (variant-specific) variables to be preserved
|
||||||
|
variables_to_preserve=(
|
||||||
|
pkgname
|
||||||
|
_pkg_arch
|
||||||
|
_android_arch
|
||||||
|
_android_platform
|
||||||
|
_android_platform_arch
|
||||||
|
_android_api_level
|
||||||
|
_boost_arch
|
||||||
|
_boost_address_model
|
||||||
|
)
|
||||||
|
|
||||||
|
# read arguments
|
||||||
|
if [[ ! $1 ]] || [[ ! $2 ]] || [[ ! $3 ]]; then
|
||||||
|
echo 'Syncs different variants of a PKGBUILD'
|
||||||
|
echo "Usage: $0 path/to/variants master-variant variants-to-adjust"
|
||||||
|
echo "example: $0 ~/pkgbuilds/qt5-base mingw-w64 mingw-w64-{static,angle,dynamic}"
|
||||||
|
echo "example: $0 ~/pkgbuilds/qt5-base android-aarch64 android-*"
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
path=$1
|
||||||
|
master=$2
|
||||||
|
shift 2
|
||||||
|
if [[ ! -d $path ]]; then
|
||||||
|
error "Variant-path \"$path\" does not exist."
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
if [[ ! -d $path/$master ]]; then
|
||||||
|
error "Master \"$master\" does not exist in \"$path\"."
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# determine variant dirs (using $(echo ...) to apply glob)
|
||||||
|
pushd "$path" > /dev/null
|
||||||
|
variant_dirs=("$@")
|
||||||
|
variant_dirs=($(echo ${variant_dirs[@]}))
|
||||||
|
|
||||||
|
# sync variant dirs with master
|
||||||
|
for variant_dir in "${variant_dirs[@]}"; do
|
||||||
|
# skip test packages
|
||||||
|
[[ $variant_dir == *'-test' ]] && continue
|
||||||
|
|
||||||
|
# prevent syncing master with itself
|
||||||
|
[[ $variant_dir == $master ]] && continue
|
||||||
|
|
||||||
|
msg "Sync $path/$master -> $path/$variant_dir"
|
||||||
|
|
||||||
|
# ensure variant dir exists
|
||||||
|
if [[ ! -d $variant_dir ]]; then
|
||||||
|
warning "Creating $path/$variant_dir because it doesn't exist yet"
|
||||||
|
mkdir "$variant_dir"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# read values to preserve (use sed rather than just sourcing to preserve variables)
|
||||||
|
msg2 "Saving values to preserve"
|
||||||
|
declare -A values_to_preserve=()
|
||||||
|
for variable_to_preserve in "${variables_to_preserve[@]}"; do
|
||||||
|
value=$(sed -n -e "/^${variable_to_preserve}=.*$/p" "$variant_dir/PKGBUILD" | sed -E 's/([\:#$%&\-\])/\\\1/g')
|
||||||
|
values_to_preserve[$variable_to_preserve]=${value#${variable_to_preserve}=}
|
||||||
|
[[ $value ]] && plain " - $value"
|
||||||
|
# note: Last sed to escape special characters is required because the value is later passed again to sed as replacement value.
|
||||||
|
done
|
||||||
|
|
||||||
|
msg2 "Replace files"
|
||||||
|
rm "$variant_dir/"* # clean existing files first (files might have been removed in master and we don't want any leftovers)
|
||||||
|
cp "$master/"* "$variant_dir"
|
||||||
|
|
||||||
|
msg2 "Restore values to preserve"
|
||||||
|
sed_args=()
|
||||||
|
for variable_to_preserve in "${variables_to_preserve[@]}"; do
|
||||||
|
sed_args+=('-e' "s:^${variable_to_preserve}=.*$:${variable_to_preserve}=${values_to_preserve[$variable_to_preserve]}:")
|
||||||
|
# if we would have just sourced the variant PKGBUILD:
|
||||||
|
# sed_args+=('-e' "s/^${variable_to_preserve}=.*$/${variable_to_preserve}=${!variable_to_preserve}/")
|
||||||
|
done
|
||||||
|
sed "${sed_args[@]}" "$master/PKGBUILD" > "$variant_dir/PKGBUILD"
|
||||||
|
done
|
||||||
|
|
||||||
|
popd > /dev/null
|
|
@ -1,34 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Syncs the different variants of android-openssl
|
|
||||||
|
|
||||||
set -e # abort on first error
|
|
||||||
master="${1:-android-aarch64}"
|
|
||||||
|
|
||||||
[[ -d 'openssl' ]] && pushd 'openssl' || pushd .
|
|
||||||
|
|
||||||
if [ $# -gt 1 ]; then
|
|
||||||
echo "Error: too many arguments specified"
|
|
||||||
echo "Usage: $0 master_dir"
|
|
||||||
exit -2
|
|
||||||
elif [[ ! -d $master ]]; then
|
|
||||||
echo "Error: specified master $master does not exist"
|
|
||||||
exit -3
|
|
||||||
fi
|
|
||||||
|
|
||||||
for dir in android-*; do
|
|
||||||
[[ $dir == *'-test' ]] && continue
|
|
||||||
[[ $dir == $master ]] && continue
|
|
||||||
[[ -d $dir ]] || continue
|
|
||||||
|
|
||||||
source "$dir/PKGBUILD"
|
|
||||||
rm "$dir/"* # clean first (files might have been removed in master)
|
|
||||||
cp "$master/"* "$dir"
|
|
||||||
sed -e "s/pkgname=android-.*-openssl/pkgname=$dir-openssl/" \
|
|
||||||
-e "s/_android_arch=.*/_android_arch=$_android_arch/" \
|
|
||||||
-e "s/_pkg_arch=.*/_pkg_arch=$_pkg_arch/" \
|
|
||||||
-e "s/_android_platform=.*/_android_platform=$_android_platform/" \
|
|
||||||
"$master/PKGBUILD" > "$dir/PKGBUILD"
|
|
||||||
done
|
|
||||||
|
|
||||||
popd
|
|
|
@ -1,28 +0,0 @@
|
||||||
#!/usr/bin/bash
|
|
||||||
|
|
||||||
# Syncs the different variants of mingw-w64-qt5-base
|
|
||||||
|
|
||||||
set -e # abort on first error
|
|
||||||
master="${1:-mingw-w64}"
|
|
||||||
|
|
||||||
[[ -d 'qt5-base' ]] && pushd 'qt5-base' || pushd .
|
|
||||||
|
|
||||||
if [ $# -gt 1 ]; then
|
|
||||||
echo "Error: too many arguments specified"
|
|
||||||
echo "Usage: $0 master_dir"
|
|
||||||
exit -2
|
|
||||||
elif [[ ! -d $master ]]; then
|
|
||||||
echo "Error: specified master $master does not exist"
|
|
||||||
exit -3
|
|
||||||
fi
|
|
||||||
|
|
||||||
for dir in mingw-w64 mingw-w64-*; do
|
|
||||||
[[ $dir == *'-test' ]] && continue
|
|
||||||
if [[ $dir != $master ]] && [[ -d $dir ]]; then
|
|
||||||
rm "$dir/"* # clean first (files might have been removed in master)
|
|
||||||
cp "$master/"* "$dir"
|
|
||||||
sed -e '/pkgname=mingw-w64-qt5-base/{c\pkgname=mingw-w64-qt5-base'${dir#mingw-w64} -e ';d}' "$master/PKGBUILD" > "$dir/PKGBUILD"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
popd
|
|
Loading…
Reference in New Issue