Support specifying crate names and versions separated by `@` character
rather than `-`.  Since `@` are not valid in crate names, this
makes splitting the tokens trivial and free of regular expressions.
Effectively, the `@` variant is roughly 180% faster:

```
 * CRATES with '@' separator
real  952 it/s
user  952 it/s
 * CRATES with '-' separator
real  339 it/s
user  339 it/s
```

Signed-off-by: Michał Górny <mgo...@gentoo.org>
---
 eclass/cargo.eclass         |  24 +++++---
 eclass/tests/cargo-bench.sh | 111 +++++++++++++++++++-----------------
 2 files changed, 75 insertions(+), 60 deletions(-)

diff --git a/eclass/cargo.eclass b/eclass/cargo.eclass
index d97bb0df9348..8618c90bd986 100644
--- a/eclass/cargo.eclass
+++ b/eclass/cargo.eclass
@@ -59,12 +59,16 @@ ECARGO_VENDOR="${ECARGO_HOME}/gentoo"
 # Bash string containing all crates that are to be downloaded.
 # It is used by cargo_crate_uris.
 #
+# Ideally, crate names and versions should be separated by a `@`
+# character.  A legacy syntax using hyphen is also supported but it is
+# much slower.
+#
 # Example:
 # @CODE
 # CRATES="
-# metal-1.2.3
-# bar-4.5.6
-# iron_oxide-0.0.1
+# metal@1.2.3
+# bar@4.5.6
+# iron_oxide@0.0.1
 # "
 # inherit cargo
 # ...
@@ -182,10 +186,16 @@ _cargo_set_crate_uris() {
        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"
+               if [[ ${crate} == *@* ]]; then
+                       name=${crate%@*}
+                       version=${crate##*@}
+               else
+                       [[ ${crate} =~ ${regex} ]] ||
+                               die "Could not parse name and version from 
crate: ${crate}"
+                       name="${BASH_REMATCH[1]}"
+                       version="${BASH_REMATCH[2]}"
+               fi
+               
url="https://crates.io/api/v1/crates/${name}/${version}/download -> 
${name}-${version}.crate"
                CARGO_CRATE_URIS+="${url} "
        done
 
diff --git a/eclass/tests/cargo-bench.sh b/eclass/tests/cargo-bench.sh
index 11b740f8dfcd..d30b04569905 100755
--- a/eclass/tests/cargo-bench.sh
+++ b/eclass/tests/cargo-bench.sh
@@ -47,63 +47,68 @@ timeit() {
 
 # taken from cryptograpy-41.0.1
 CRATES="
-       Inflector-0.11.4
-       aliasable-0.1.3
-       asn1-0.15.2
-       asn1_derive-0.15.2
-       autocfg-1.1.0
-       base64-0.13.1
-       bitflags-1.3.2
-       cc-1.0.79
-       cfg-if-1.0.0
-       foreign-types-0.3.2
-       foreign-types-shared-0.1.1
-       indoc-1.0.9
-       libc-0.2.144
-       lock_api-0.4.9
-       memoffset-0.8.0
-       once_cell-1.17.2
-       openssl-0.10.54
-       openssl-macros-0.1.1
-       openssl-sys-0.9.88
-       ouroboros-0.15.6
-       ouroboros_macro-0.15.6
-       parking_lot-0.12.1
-       parking_lot_core-0.9.7
-       pem-1.1.1
-       pkg-config-0.3.27
-       proc-macro-error-1.0.4
-       proc-macro-error-attr-1.0.4
-       proc-macro2-1.0.59
-       pyo3-0.18.3
-       pyo3-build-config-0.18.3
-       pyo3-ffi-0.18.3
-       pyo3-macros-0.18.3
-       pyo3-macros-backend-0.18.3
-       quote-1.0.28
-       redox_syscall-0.2.16
-       scopeguard-1.1.0
-       smallvec-1.10.0
-       syn-1.0.109
-       syn-2.0.18
-       target-lexicon-0.12.7
-       unicode-ident-1.0.9
-       unindent-0.1.11
-       vcpkg-0.2.15
-       version_check-0.9.4
-       windows-sys-0.45.0
-       windows-targets-0.42.2
-       windows_aarch64_gnullvm-0.42.2
-       windows_aarch64_msvc-0.42.2
-       windows_i686_gnu-0.42.2
-       windows_i686_msvc-0.42.2
-       windows_x86_64_gnu-0.42.2
-       windows_x86_64_gnullvm-0.42.2
-       windows_x86_64_msvc-0.42.2
+       Inflector@0.11.4
+       aliasable@0.1.3
+       asn1@0.15.2
+       asn1_derive@0.15.2
+       autocfg@1.1.0
+       base64@0.13.1
+       bitflags@1.3.2
+       cc@1.0.79
+       cfg-if@1.0.0
+       foreign-types@0.3.2
+       foreign-types-shared@0.1.1
+       indoc@1.0.9
+       libc@0.2.144
+       lock_api@0.4.9
+       memoffset@0.8.0
+       once_cell@1.17.2
+       openssl@0.10.54
+       openssl-macros@0.1.1
+       openssl-sys@0.9.88
+       ouroboros@0.15.6
+       ouroboros_macro@0.15.6
+       parking_lot@0.12.1
+       parking_lot_core@0.9.7
+       pem@1.1.1
+       pkg-config@0.3.27
+       proc-macro-error@1.0.4
+       proc-macro-error-attr@1.0.4
+       proc-macro2@1.0.59
+       pyo3@0.18.3
+       pyo3-build-config@0.18.3
+       pyo3-ffi@0.18.3
+       pyo3-macros@0.18.3
+       pyo3-macros-backend@0.18.3
+       quote@1.0.28
+       redox_syscall@0.2.16
+       scopeguard@1.1.0
+       smallvec@1.10.0
+       syn@1.0.109
+       syn@2.0.18
+       target-lexicon@0.12.7
+       unicode-ident@1.0.9
+       unindent@0.1.11
+       vcpkg@0.2.15
+       version_check@0.9.4
+       windows-sys@0.45.0
+       windows-targets@0.42.2
+       windows_aarch64_gnullvm@0.42.2
+       windows_aarch64_msvc@0.42.2
+       windows_i686_gnu@0.42.2
+       windows_i686_msvc@0.42.2
+       windows_x86_64_gnu@0.42.2
+       windows_x86_64_gnullvm@0.42.2
+       windows_x86_64_msvc@0.42.2
 "
 
 inherit cargo
 
+einfo "CRATES with '@' separator"
+timeit
+
+einfo "CRATES with '-' separator"
+CRATES=${CRATES//@/-}
 timeit
 
 texit
-- 
2.41.0


Reply via email to