commit:     59dbfb80f748a0fc5741a8f3028f7552af28eecf
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Thu Jun 15 15:20:43 2023 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Sun Jun 18 14:57:44 2023 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=59dbfb80

cargo.eclass: Add variable alternative to $(cargo_crate_uris)

Add a helper function that sets ${CARGO_CRATE_URIS} variable to make
it possible to set SRC_URI without subshells.  This gives a slight
speedup (~20%):

```
real  300 it/s
user  324 it/s
```

Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 eclass/cargo.eclass         | 48 +++++++++++++++++++++++++++++++--------------
 eclass/tests/cargo-bench.sh |  4 +++-
 2 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/eclass/cargo.eclass b/eclass/cargo.eclass
index 991e808d453f..4e0cd1e4de70 100644
--- a/eclass/cargo.eclass
+++ b/eclass/cargo.eclass
@@ -68,7 +68,7 @@ ECARGO_VENDOR="${ECARGO_HOME}/gentoo"
 # "
 # inherit cargo
 # ...
-# SRC_URI="$(cargo_crate_uris)"
+# SRC_URI="${CARGO_CRATE_URIS}"
 # @CODE
 
 # @ECLASS_VARIABLE: GIT_CRATES
@@ -162,31 +162,31 @@ ECARGO_VENDOR="${ECARGO_HOME}/gentoo"
 # group, and then switch over to building with FEATURES=userpriv.
 # Or vice-versa.
 
-# @FUNCTION: cargo_crate_uris
+# @ECLASS_VARIABLE: CARGO_CRATE_URIS
+# @OUTPUT_VARIABLE
+# @DESCRIPTION:
+# List of URIs to put in SRC_URI created from CRATES variable.
+
+# @FUNCTION: _cargo_set_crate_uris
+# @USAGE: <crates>
 # @DESCRIPTION:
 # Generates the URIs to put in SRC_URI to help fetch dependencies.
 # Constructs a list of crates from its arguments.
 # If no arguments are provided, it uses the CRATES variable.
-cargo_crate_uris() {
+# The value is set as CARGO_CRATE_URIS.
+_cargo_set_crate_uris() {
        local -r regex='^([a-zA-Z0-9_\-]+)-([0-9]+\.[0-9]+\.[0-9]+.*)$'
-       local crate crates
-
-       if [[ -n ${@} ]]; then
-               crates="$@"
-       elif [[ -n ${CRATES} ]]; then
-               crates="${CRATES}"
-       else
-               eerror "CRATES variable is not defined and nothing passed as 
argument"
-               die "Can't generate SRC_URI from empty input"
-       fi
+       local crates=${1}
+       local crate
 
+       CARGO_CRATE_URIS=
        for crate in ${crates}; do
                local name version url
                [[ $crate =~ $regex ]] || die "Could not parse name and version 
from crate: $crate"
                name="${BASH_REMATCH[1]}"
                version="${BASH_REMATCH[2]}"
                
url="https://crates.io/api/v1/crates/${name}/${version}/download -> 
${crate}.crate"
-               echo "${url}"
+               CARGO_CRATE_URIS+="${url} "
        done
 
        local git_crates_type
@@ -214,12 +214,30 @@ cargo_crate_uris() {
                                ;;
                        esac
 
-                       printf -- '%s -> %s\n' 
"${crate_uri//%commit%/${commit}}" "${repo_name}-${commit}${repo_ext}.tar.gz"
+                       CARGO_CRATE_URIS+="${crate_uri//%commit%/${commit}} -> 
${repo_name}-${commit}${repo_ext}.tar.gz "
                done
        elif [[ -n ${git_crates_type} ]]; then
                die "GIT_CRATE must be declared as an associative array"
        fi
 }
+_cargo_set_crate_uris "${CRATES}"
+
+# @FUNCTION: cargo_crate_uris
+# @USAGE: [<crates>...]
+# @DESCRIPTION:
+# Generates the URIs to put in SRC_URI to help fetch dependencies.
+# Constructs a list of crates from its arguments.
+# If no arguments are provided, it uses the CRATES variable.
+cargo_crate_uris() {
+       local crates=${*-${CRATES}}
+       if [[ -z ${crates} ]]; then
+               eerror "CRATES variable is not defined and nothing passed as 
argument"
+               die "Can't generate SRC_URI from empty input"
+       fi
+
+       _cargo_set_crate_uris "${crates}"
+       echo "${CARGO_CRATE_URIS}"
+}
 
 # @FUNCTION: cargo_gen_config
 # @DESCRIPTION:

diff --git a/eclass/tests/cargo-bench.sh b/eclass/tests/cargo-bench.sh
index cdc5e4431c14..11b740f8dfcd 100755
--- a/eclass/tests/cargo-bench.sh
+++ b/eclass/tests/cargo-bench.sh
@@ -12,8 +12,9 @@ RUNS=3
 
 doit() {
        for (( i = 0; i < ITERATIONS; i++ )); do
+               _cargo_set_crate_uris "${CRATES}"
                SRC_URI="
-                       $(cargo_crate_uris)
+                       ${CARGO_CRATE_URIS}
                "
        done
 }
@@ -102,6 +103,7 @@ CRATES="
 "
 
 inherit cargo
+
 timeit
 
 texit

Reply via email to