From 12ab6ca3d654d25a79c8ef8a40c1d5a2ed671771 Mon Sep 17 00:00:00 2001 From: Michał Górny Date: Thu, 15 Jun 2023 17:23:21 +0200 Subject: cargo.eclass: Optimize GIT_CRATES check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Optimize the GIT_CRATES check to call `declare -p` only if the variable is actually set. In the vast majority of ebuilds using cargo.eclass, it's not set, so the subshell-first approach is slowing things down. With this change, the speed improves by another ~20%: ``` real 363 it/s user 365 it/s ``` Signed-off-by: Michał Górny --- eclass/cargo.eclass | 58 ++++++++++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) (limited to 'eclass') diff --git a/eclass/cargo.eclass b/eclass/cargo.eclass index 4e0cd1e4de70..d97bb0df9348 100644 --- a/eclass/cargo.eclass +++ b/eclass/cargo.eclass @@ -189,35 +189,35 @@ _cargo_set_crate_uris() { CARGO_CRATE_URIS+="${url} " done - local git_crates_type - git_crates_type="$(declare -p GIT_CRATES 2>&-)" - if [[ ${git_crates_type} == "declare -A "* ]]; then - local crate commit crate_uri crate_dir repo_ext feat_expr - - for crate in "${!GIT_CRATES[@]}"; do - IFS=';' read -r crate_uri commit crate_dir <<< "${GIT_CRATES[${crate}]}" - - case "${crate_uri}" in - https://github.com/*) - repo_ext=".gh" - repo_name="${crate_uri##*/}" - crate_uri="${crate_uri%/}/archive/%commit%.tar.gz" - ;; - https://gitlab.com/*) - repo_ext=".gl" - repo_name="${crate_uri##*/}" - crate_uri="${crate_uri%/}/-/archive/%commit%/${repo_name}-%commit%.tar.gz" - ;; - *) - repo_ext= - repo_name="${crate}" - ;; - esac - - 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" + if declare -p GIT_CRATES &>/dev/null; then + if [[ $(declare -p GIT_CRATES) == "declare -A"* ]]; then + local crate commit crate_uri crate_dir repo_ext feat_expr + + for crate in "${!GIT_CRATES[@]}"; do + IFS=';' read -r crate_uri commit crate_dir <<< "${GIT_CRATES[${crate}]}" + + case "${crate_uri}" in + https://github.com/*) + repo_ext=".gh" + repo_name="${crate_uri##*/}" + crate_uri="${crate_uri%/}/archive/%commit%.tar.gz" + ;; + https://gitlab.com/*) + repo_ext=".gl" + repo_name="${crate_uri##*/}" + crate_uri="${crate_uri%/}/-/archive/%commit%/${repo_name}-%commit%.tar.gz" + ;; + *) + repo_ext= + repo_name="${crate}" + ;; + esac + + CARGO_CRATE_URIS+="${crate_uri//%commit%/${commit}} -> ${repo_name}-${commit}${repo_ext}.tar.gz " + done + else + die "GIT_CRATE must be declared as an associative array" + fi fi } _cargo_set_crate_uris "${CRATES}" -- cgit v1.2.3-65-gdbad