commit:     bf9a8b7af96bb7161956fc8276d9d07f021bda8a
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Sat May 11 18:53:28 2024 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Fri May 17 06:25:48 2024 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=bf9a8b7a

cargo.eclass: Optimize crate unpacking

Unpack crates in parallel using xargs to utilize multicore systems
better.  Perform checksumming via a single sha256sum invocation.

For dev-python/watchfiles, this speeds up unpacking on my machine
from 2.6 s to 0.75 s (warm cache).

Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>
Closes: https://github.com/gentoo/gentoo/pull/36645
Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 eclass/cargo.eclass | 56 +++++++++++++++++++++++++++++++----------------------
 1 file changed, 33 insertions(+), 23 deletions(-)

diff --git a/eclass/cargo.eclass b/eclass/cargo.eclass
index 0f2da982f60c..a685cd99fb38 100644
--- a/eclass/cargo.eclass
+++ b/eclass/cargo.eclass
@@ -329,40 +329,50 @@ _cargo_gen_git_config() {
 cargo_src_unpack() {
        debug-print-function ${FUNCNAME} "$@"
 
-       mkdir -p "${ECARGO_VENDOR}" || die
-       mkdir -p "${S}" || die
+       mkdir -p "${ECARGO_VENDOR}" "${S}" || die
 
        local archive shasum pkg
+       local crates=()
        for archive in ${A}; do
                case "${archive}" in
                        *.crate)
-                               # when called by pkgdiff-mg, do not unpack 
crates
-                               [[ ${PKGBUMPING} == ${PVR} ]] && continue
-
-                               ebegin "Loading ${archive} into Cargo registry"
-                               tar -xf "${DISTDIR}"/${archive} -C 
"${ECARGO_VENDOR}/" || die
-                               # generate sha256sum of the crate itself as 
cargo needs this
-                               shasum=$(sha256sum "${DISTDIR}"/${archive} | 
cut -d ' ' -f 1)
-                               pkg=$(basename ${archive} .crate)
-                               cat <<- EOF > 
${ECARGO_VENDOR}/${pkg}/.cargo-checksum.json
-                               {
-                                       "package": "${shasum}",
-                                       "files": {}
-                               }
-                               EOF
-                               # if this is our target package we need it in 
${WORKDIR} too
-                               # to make ${S} (and handle any revisions too)
-                               if [[ ${P} == ${pkg}* ]]; then
-                                       tar -xf "${DISTDIR}"/${archive} -C 
"${WORKDIR}" || die
-                               fi
-                               eend $?
+                               crates+=( "${archive}" )
                                ;;
                        *)
-                               unpack ${archive}
+                               unpack "${archive}"
                                ;;
                esac
        done
 
+       if [[ ${PKGBUMPING} != ${PVR} && ${crates[@]} ]]; then
+               pushd "${DISTDIR}" >/dev/null || die
+
+               ebegin "Unpacking crates"
+               printf '%s\0' "${crates[@]}" |
+                       xargs -0 -P "$(makeopts_jobs)" -n 1 -t -- \
+                               tar -x -C "${ECARGO_VENDOR}" -f
+               assert
+               eend $?
+
+               while read -d '' -r shasum archive; do
+                       pkg=${archive%.crate}
+                       cat <<- EOF > 
${ECARGO_VENDOR}/${pkg}/.cargo-checksum.json || die
+                       {
+                               "package": "${shasum}",
+                               "files": {}
+                       }
+                       EOF
+
+                       # if this is our target package we need it in 
${WORKDIR} too
+                       # to make ${S} (and handle any revisions too)
+                       if [[ ${P} == ${pkg}* ]]; then
+                               tar -xf "${archive}" -C "${WORKDIR}" || die
+                       fi
+               done < <(sha256sum -z "${crates[@]}" || die)
+
+               popd >/dev/null || die
+       fi
+
        cargo_gen_config
 }
 

Reply via email to