Re: [gentoo-dev] [PATCH 4/5] cargo.eclass: Support separating crate names/versions via slash

2023-06-16 Thread Sam James

Michał Górny  writes:

> On Fri, 2023-06-16 at 17:48 +0300, Denis Lisov wrote:
>> Hello Michał,
>> 
>> On Fri, Jun 16, 2023 at 3:09 PM Michał Górny  wrote:
>> > 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:
>> 
>> As a developer using Rust I want to note that Cargo has a concept of
>> "package ID specification"[1] that usually uses pkgname@version
>> syntax, but AFAIK there's no prior art for using pkgname/version in
>> the ecosystem. Could it make sense to use pkgname@version for
>> consistency?
>> 
>
> I suppose so.  The only reason I've used slash is because that could be
> used directly in URL.

I think we should do it (@ delimiter) - it looks more natural in a Rust/cargo 
context.

Thanks for the suggestion!


signature.asc
Description: PGP signature


Re: [gentoo-dev] [PATCH 4/5] cargo.eclass: Support separating crate names/versions via slash

2023-06-16 Thread Michał Górny
On Fri, 2023-06-16 at 17:48 +0300, Denis Lisov wrote:
> Hello Michał,
> 
> On Fri, Jun 16, 2023 at 3:09 PM Michał Górny  wrote:
> > 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:
> 
> As a developer using Rust I want to note that Cargo has a concept of
> "package ID specification"[1] that usually uses pkgname@version
> syntax, but AFAIK there's no prior art for using pkgname/version in
> the ecosystem. Could it make sense to use pkgname@version for
> consistency?
> 

I suppose so.  The only reason I've used slash is because that could be
used directly in URL.

-- 
Best regards,
Michał Górny




Re: [gentoo-dev] [PATCH 4/5] cargo.eclass: Support separating crate names/versions via slash

2023-06-16 Thread Denis Lisov
Hello Michał,

On Fri, Jun 16, 2023 at 3:09 PM Michał Górny  wrote:
> 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:

As a developer using Rust I want to note that Cargo has a concept of
"package ID specification"[1] that usually uses pkgname@version
syntax, but AFAIK there's no prior art for using pkgname/version in
the ecosystem. Could it make sense to use pkgname@version for
consistency?

Regards,
Denis Lisov.

[1]: https://doc.rust-lang.org/cargo/reference/pkgid-spec.html



[gentoo-dev] [PATCH 4/5] cargo.eclass: Support separating crate names/versions via slash

2023-06-16 Thread Michał Górny
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