Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLevente Polyak <anthraxx@archlinux.org>2023-09-10 00:00:27 +0200
committerLevente Polyak <anthraxx@archlinux.org>2024-01-10 00:14:01 +0100
commitb264c7f1c771790c53561f5d3f4de589e0000c05 (patch)
tree9209cbd4900e7143bee5724fd048213bf5a16996
parent2b8033b91132d303603f370a54eef02949703750 (diff)
feat(util): parallelize srcinfo generation
Heavily improve the runtime of huge split packages, by creating an own parallelized high level implementation of the makepkg low level building blocks for srcinfo generation. This reduces the runtine to generate the srcinfo file for thunderbird from 24 seconds down to 1 second.
-rw-r--r--src/commitpkg.in10
-rw-r--r--src/lib/build/build.sh5
-rw-r--r--src/lib/util/srcinfo.sh69
3 files changed, 78 insertions, 6 deletions
diff --git a/src/commitpkg.in b/src/commitpkg.in
index 016ab22..e17b270 100644
--- a/src/commitpkg.in
+++ b/src/commitpkg.in
@@ -5,9 +5,12 @@
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
+# shellcheck source=src/lib/util/srcinfo.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/srcinfo.sh
source /usr/share/makepkg/util/util.sh
-source /usr/share/makepkg/srcinfo.sh
+
+set -eo pipefail
check_pkgbuild_validity() {
@@ -185,10 +188,9 @@ done
check_pkgbuild_validity
# auto generate .SRCINFO
-stat_busy 'Generating .SRCINFO'
-write_srcinfo_content > .SRCINFO
+# shellcheck disable=SC2119
+write_srcinfo_file
git add --force .SRCINFO
-stat_done
if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
stat_busy 'Staging files'
diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh
index e0982e4..8b4240c 100644
--- a/src/lib/build/build.sh
+++ b/src/lib/build/build.sh
@@ -14,6 +14,8 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/db/update.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/release.sh
# shellcheck source=src/lib/util/git.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh
+# shellcheck source=src/lib/util/srcinfo.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/srcinfo.sh
# shellcheck source=src/lib/util/pacman.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pacman.sh
# shellcheck source=src/lib/valid-repos.sh
@@ -26,8 +28,7 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-inspect.sh
source /usr/share/makepkg/util/config.sh
source /usr/share/makepkg/util/message.sh
-set -e
-set -o pipefail
+set -eo pipefail
pkgctl_build_usage() {
diff --git a/src/lib/util/srcinfo.sh b/src/lib/util/srcinfo.sh
new file mode 100644
index 0000000..b646dc3
--- /dev/null
+++ b/src/lib/util/srcinfo.sh
@@ -0,0 +1,69 @@
+#!/hint/bash
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+[[ -z ${DEVTOOLS_INCLUDE_UTIL_SRCINFO_SH:-} ]] || return 0
+DEVTOOLS_INCLUDE_UTIL_SRCINFO_SH=1
+
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+# shellcheck source=src/lib/common.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
+
+source /usr/share/makepkg/util/util.sh
+source /usr/share/makepkg/srcinfo.sh
+
+set -eo pipefail
+
+
+print_srcinfo() {
+ local pkgpath=${1:-.}
+ local outdir pkg pid
+ local pids=()
+
+ # source the PKGBUILD
+ # shellcheck source=contrib/makepkg/PKGBUILD.proto
+ . "${pkgpath}"/PKGBUILD
+
+ # run without parallelization for single packages
+ if (( ${#pkgname[@]} == 1 )); then
+ write_srcinfo_content
+ return 0
+ fi
+
+ [[ -z ${WORKDIR:-} ]] && setup_workdir
+ outdir=$(mktemp --directory --tmpdir="${WORKDIR}" pkgctl-srcinfo.XXXXXXXXXX)
+
+ # fork workload for each split pkgname
+ for pkg in "${pkgname[@]}"; do
+ (
+ # deactivate errexit to avoid makepkg abort on grep_function
+ set +e
+ srcinfo_write_package "$pkg" > "${outdir}/${pkg}"
+ )&
+ pids+=($!)
+ done
+
+ # join workload
+ for pid in "${pids[@]}"; do
+ if ! wait "${pid}"; then
+ return 1
+ fi
+ done
+
+ # collect output
+ srcinfo_write_global
+ for pkg in "${pkgname[@]}"; do
+ srcinfo_separate_section
+ cat "${outdir}/${pkg}"
+ done
+}
+
+write_srcinfo_file() {
+ local pkgpath=${1:-.}
+ stat_busy 'Generating .SRCINFO'
+ if ! print_srcinfo "${pkgpath}" > "${pkgpath}"/.SRCINFO; then
+ error 'Failed to write .SRCINFO file'
+ return 1
+ fi
+ stat_done
+}