PKGBUILDs/devel/qt5/update-patches.sh

168 lines
4.4 KiB
Bash
Executable File

#!/usr/bin/bash
# Copies patches from QT_GIT_REPOS_DIR to default
# variant of specified repo and updates sources and checksums
#set -euxo pipefail
set -e # abort on first error
shopt -s nullglob
source /usr/share/makepkg/util/message.sh
colorize
if ! [[ $1 ]]; then
echo 'No Qt repo specified - must be specified like eg. base or multimedia.'
echo "Usage: $0 repo [branch=\$pkgver-\$variant] [variant=mingw-w64] [qtver=qt5] [tag=v\$pkgver]"
echo "Note: DEFAULT_PKGBUILDS_DIR and QT_GIT_REPOS_DIR must point to directories containing PKGBUILDs and the Qt repos."
exit -1
fi
pkgbuildsdirs=()
if [[ $DEFAULT_PKGBUILDS_DIR ]]; then
# split colon separated path
OIFS=$IFS
IFS=':'
for dir in $DEFAULT_PKGBUILDS_DIR; do
pkgbuildsdirs+=("$dir")
done
IFS=$OIFS
else
pkgbuildsdirs+=("$PWD/pkgbuilds")
fi
qtver="${4:-qt5}"
pkg="$qtver-$1"
repo="qt$1"
branch="${2}"
variant="${3:-mingw-w64}"
tag=$5
# find dest dir
pkgdir=
for dir in "${pkgbuildsdirs[@]}"; do
for _pkgdir in "$pkg" "qt5"; do
dest="${dir}/${_pkgdir}/${variant}"
pkgdir=$_pkgdir
[[ -d $dest ]] && break 2 || dest=
done
done
if ! [[ $dest ]]; then
warning "\$DEFAULT_PKGBUILDS_DIR/$pkg/${variant} or \$DEFAULT_PKGBUILDS_DIR/qt5/${variant} is no directory - skipping repository $repo."
exit 0
fi
# find repo dir
wd="${QT_GIT_REPOS_DIR}/${repo}"
if ! [[ -d $wd ]]; then
error "\$QT_GIT_REPOS_DIR/$repo is no directory."
exit -2
fi
pkgbuild_path=$dest/PKGBUILD
if ! [[ -f $pkgbuild_path ]]; then
warning "PKGBUILD does not exist in \"$dest\" - skipping directory"
exit 0
fi
template=$pkgbuild_path.sh.ep has_template=
[[ -f $template ]] && has_template=1
source "$pkgbuild_path"
tag=${tag:-v$pkgver}
tag=${tag%+kde+*}
new_sources=()
new_md5sums=()
file_index=0
for source in "${source[@]}"; do
[ "${source: -6}" != .patch ] && \
new_sources+=("$source") \
new_md5sums+=("${sha256sums[$file_index]}")
file_index=$((file_index + 1))
done
if [[ $pkgdir != qt5 ]]; then
patches=("$dest"/*.patch)
for patch in "${patches[@]}"; do
[[ -f $patch ]] && rm "$patch"
done
fi
pushd "$wd" > /dev/null
git status # do some Git stuff just to check whether it is a Git repo
if ! [[ $branch ]]; then
branch="${pkgver}-${variant}"
fi
if ! git checkout "${branch}"; then
msg2 "No patches required for $1, skipping."
exit 0
fi
msg2 "Exporting patches for branch '$branch' (based on '$tag')"
git format-patch "$tag" --output-directory "$dest"
new_patches=("$dest"/*.patch)
also_covered_variants=none # for sake of simplicity: use same set of patches also for android packages
[[ $variant == mingw-w64 ]] && also_covered_variants=android-
for other_variant_dir in "$dest/../$variant"?* "$dest/../$also_covered_variants"?*; do
[[ -d $other_variant_dir ]] || continue
find "$other_variant_dir" -iname '*.patch' -delete
if [[ ${#new_patches[@]} -gt 0 ]]; then
ln --symbolic --relative --target-directory="$other_variant_dir" "${new_patches[@]}"
fi
done
popd > /dev/null
# skip if building all Qt modules in one package (currently used for Android target)
[[ $pkgdir == qt5 ]] && exit 0
# skip if a template file is present (then the patch list is generated by the template
# system)
[[ -f $has_template ]] && exit 0
for patch in "${new_patches[@]}"; do
new_sources+=("$patch")
sum=$(sha256sum "$patch")
new_md5sums+=(${sum%% *})
done
# preserve first src line to keep variables unevaluated
newsrc=$(grep 'source=(' "$pkgbuild_path")
[[ $newsrc ]] || newsrc="source=(${new_sources[0]}"
[ "${newsrc: -1:1}" == ')' ] && newsrc="${newsrc: 0:-1}" # truncate trailing )
for source in "${new_sources[@]:1}"; do
newsrc+="\n '${source##*/}'"
done
newsrc+=')'
newsums="sha256sums=('${new_md5sums[0]}'"
for sum in "${new_md5sums[@]:1}"; do
newsums+="\n '${sum}'"
done
newsums+=')'
# apply changes
mv "$pkgbuild_path" "$pkgbuild_path.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_path.bak" > "$pkgbuild_path"