Support specifying crate names and versions separated by forward slashes
rather than hyphens. Since slashes are not valid in crate names, this
makes splitting the tokens trivial and free of regular expressions.
Effectively, the slash variant is roughly 180% faster:
```
* CRATES with slashes
real 952 it/s
user 952 it/s
* CRATES with hyphens
real 339 it/s
user 339 it/s
```
Signed-off-by: Michał Górny
---
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..54a1edd36c28 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 forward
+# slash. 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..cb346178f0a2 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