public inbox for gentoo-dev@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Michał Górny" <mgorny@gentoo.org>
To: gentoo-dev@lists.gentoo.org
Cc: "Michał Górny" <mgorny@gentoo.org>
Subject: [gentoo-dev] [PATCH 4/5] cargo.eclass: Support separating crate names/versions via slash
Date: Fri, 16 Jun 2023 14:01:07 +0200	[thread overview]
Message-ID: <20230616120739.8656-5-mgorny@gentoo.org> (raw)
In-Reply-To: <20230616120739.8656-1-mgorny@gentoo.org>

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 <mgorny@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..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/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 slashes"
+timeit
+
+einfo "CRATES with hyphens"
+CRATES=${CRATES//\//-}
 timeit
 
 texit
-- 
2.41.0



  parent reply	other threads:[~2023-06-16 12:09 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-16 12:01 [gentoo-dev] [PATCH 0/5] cargo.eclass: optimizations Michał Górny
2023-06-16 12:01 ` [gentoo-dev] [PATCH 1/5] eclass/tests: Add a minimal benchmark for cargo.eclass Michał Górny
2023-06-16 12:01 ` [gentoo-dev] [PATCH 2/5] cargo.eclass: Add variable alternative to $(cargo_crate_uris) Michał Górny
2023-06-16 12:01 ` [gentoo-dev] [PATCH 3/5] cargo.eclass: Optimize GIT_CRATES check Michał Górny
2023-06-16 12:01 ` Michał Górny [this message]
2023-06-16 14:48   ` [gentoo-dev] [PATCH 4/5] cargo.eclass: Support separating crate names/versions via slash Denis Lisov
2023-06-16 15:52     ` Michał Górny
2023-06-16 18:06       ` Sam James
2023-06-16 12:01 ` [gentoo-dev] [PATCH 5/5] cargo.eclass: Mark GIT_CRATES as pre-inherit Michał Górny

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230616120739.8656-5-mgorny@gentoo.org \
    --to=mgorny@gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox