* [gentoo-dev] [PATCH 1/7] pypi.eclass: Move setting globals to a function
2023-06-13 6:45 [gentoo-dev] [PATCH 0/7] pypi.eclass: performance optimizations Michał Górny
@ 2023-06-13 6:45 ` Michał Górny
2023-06-13 6:45 ` [gentoo-dev] [PATCH 2/7] eclass/tests: Add pypi-bench.sh for global scope logic Michał Górny
` (5 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Michał Górny @ 2023-06-13 6:45 UTC (permalink / raw
To: gentoo-dev; +Cc: Michał Górny
Signed-off-by: Michał Górny <mgorny@gentoo.org>
---
eclass/pypi.eclass | 22 +++++++++++++++-------
1 file changed, 15 insertions(+), 7 deletions(-)
diff --git a/eclass/pypi.eclass b/eclass/pypi.eclass
index 13dd56fa4fec..732b0c6184ef 100644
--- a/eclass/pypi.eclass
+++ b/eclass/pypi.eclass
@@ -221,12 +221,20 @@ pypi_wheel_url() {
fi
}
-if [[ ${PYPI_NO_NORMALIZE} ]]; then
- SRC_URI="$(pypi_sdist_url --no-normalize)"
- S="${WORKDIR}/${PYPI_PN}-$(pypi_translate_version "${PV}")"
-else
- SRC_URI="$(pypi_sdist_url)"
- S="${WORKDIR}/$(pypi_normalize_name "${PYPI_PN}")-$(pypi_translate_version "${PV}")"
-fi
+# @FUNCTION: _pypi_set_globals
+# @INTERNAL
+# @DESCRIPTION:
+# Set global variables, SRC_URI and S.
+_pypi_set_globals() {
+ if [[ ${PYPI_NO_NORMALIZE} ]]; then
+ SRC_URI="$(pypi_sdist_url --no-normalize)"
+ S="${WORKDIR}/${PYPI_PN}-$(pypi_translate_version "${PV}")"
+ else
+ SRC_URI="$(pypi_sdist_url)"
+ S="${WORKDIR}/$(pypi_normalize_name "${PYPI_PN}")-$(pypi_translate_version "${PV}")"
+ fi
+}
+
+_pypi_set_globals
fi
--
2.41.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [gentoo-dev] [PATCH 2/7] eclass/tests: Add pypi-bench.sh for global scope logic
2023-06-13 6:45 [gentoo-dev] [PATCH 0/7] pypi.eclass: performance optimizations Michał Górny
2023-06-13 6:45 ` [gentoo-dev] [PATCH 1/7] pypi.eclass: Move setting globals to a function Michał Górny
@ 2023-06-13 6:45 ` Michał Górny
2023-06-13 6:45 ` [gentoo-dev] [PATCH 3/7] pypi.eclass: Translate version once in the default scenario Michał Górny
` (4 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Michał Górny @ 2023-06-13 6:45 UTC (permalink / raw
To: gentoo-dev; +Cc: Michał Górny
The benchmark yield roughly 327 ops / s on my machine.
Signed-off-by: Michał Górny <mgorny@gentoo.org>
---
eclass/tests/pypi-bench.sh | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
create mode 100755 eclass/tests/pypi-bench.sh
diff --git a/eclass/tests/pypi-bench.sh b/eclass/tests/pypi-bench.sh
new file mode 100755
index 000000000000..6c4696c19fcb
--- /dev/null
+++ b/eclass/tests/pypi-bench.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+# Copyright 2023 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+source tests-common.sh || exit
+
+PN=foo-bar
+PYPI_PN=Foo.Bar
+PV=1.2.3_beta2
+WORKDIR='<WORKDIR>'
+
+inherit pypi
+
+doit() {
+ for (( i = 0; i < 1000; i++ )); do
+ _pypi_set_globals
+ done
+}
+
+time doit
+
+texit
--
2.41.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [gentoo-dev] [PATCH 3/7] pypi.eclass: Translate version once in the default scenario
2023-06-13 6:45 [gentoo-dev] [PATCH 0/7] pypi.eclass: performance optimizations Michał Górny
2023-06-13 6:45 ` [gentoo-dev] [PATCH 1/7] pypi.eclass: Move setting globals to a function Michał Górny
2023-06-13 6:45 ` [gentoo-dev] [PATCH 2/7] eclass/tests: Add pypi-bench.sh for global scope logic Michał Górny
@ 2023-06-13 6:45 ` Michał Górny
2023-06-13 6:45 ` [gentoo-dev] [PATCH 4/7] pypi.eclass: Normalize names without subshell Michał Górny
` (3 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Michał Górny @ 2023-06-13 6:45 UTC (permalink / raw
To: gentoo-dev; +Cc: Michał Górny
Instead of translating version two times, once in pypi_sdist_url
and then when setting S, do it once and store the result. This gives
roughly 371 ops / s, i.e. a 13% speedup.
Signed-off-by: Michał Górny <mgorny@gentoo.org>
---
eclass/pypi.eclass | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/eclass/pypi.eclass b/eclass/pypi.eclass
index 732b0c6184ef..a8a179d5a3a4 100644
--- a/eclass/pypi.eclass
+++ b/eclass/pypi.eclass
@@ -226,12 +226,14 @@ pypi_wheel_url() {
# @DESCRIPTION:
# Set global variables, SRC_URI and S.
_pypi_set_globals() {
+ local version=$(pypi_translate_version "${PV}")
+
if [[ ${PYPI_NO_NORMALIZE} ]]; then
- SRC_URI="$(pypi_sdist_url --no-normalize)"
- S="${WORKDIR}/${PYPI_PN}-$(pypi_translate_version "${PV}")"
+ SRC_URI="$(pypi_sdist_url --no-normalize "${PYPI_PN}" "${version}")"
+ S="${WORKDIR}/${PYPI_PN}-${version}"
else
- SRC_URI="$(pypi_sdist_url)"
- S="${WORKDIR}/$(pypi_normalize_name "${PYPI_PN}")-$(pypi_translate_version "${PV}")"
+ SRC_URI="$(pypi_sdist_url "${PYPI_PN}" "${version}")"
+ S="${WORKDIR}/$(pypi_normalize_name "${PYPI_PN}")-${version}"
fi
}
--
2.41.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [gentoo-dev] [PATCH 4/7] pypi.eclass: Normalize names without subshell
2023-06-13 6:45 [gentoo-dev] [PATCH 0/7] pypi.eclass: performance optimizations Michał Górny
` (2 preceding siblings ...)
2023-06-13 6:45 ` [gentoo-dev] [PATCH 3/7] pypi.eclass: Translate version once in the default scenario Michał Górny
@ 2023-06-13 6:45 ` Michał Górny
2023-06-13 6:45 ` [gentoo-dev] [PATCH 5/7] pypi.eclass: Translate version without subshell in common case Michał Górny
` (2 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Michał Górny @ 2023-06-13 6:45 UTC (permalink / raw
To: gentoo-dev; +Cc: Michał Górny
Provide an internal helper to normalize names without a subshell.
This gives 535 ops / s, so a further 44% speedup.
Signed-off-by: Michał Górny <mgorny@gentoo.org>
---
eclass/pypi.eclass | 39 +++++++++++++++++++++++++++------------
1 file changed, 27 insertions(+), 12 deletions(-)
diff --git a/eclass/pypi.eclass b/eclass/pypi.eclass
index a8a179d5a3a4..d79e6f06fc1b 100644
--- a/eclass/pypi.eclass
+++ b/eclass/pypi.eclass
@@ -63,6 +63,21 @@ _PYPI_ECLASS=1
# @CODE
: "${PYPI_PN:=${PN}}"
+# @FUNCTION: _pypi_normalize_name
+# @INTERNAL
+# @USAGE: <name>
+# @DESCRIPTION:
+# Internal normalization function, returns the result
+# via _PYPI_NORMALIZED_NAME variable.
+_pypi_normalize_name() {
+ local name=${1}
+ local shopt_save=$(shopt -p extglob)
+ shopt -s extglob
+ name=${name//+([._-])/_}
+ ${shopt_save}
+ _PYPI_NORMALIZED_NAME="${name,,}"
+}
+
# @FUNCTION: pypi_normalize_name
# @USAGE: <name>
# @DESCRIPTION:
@@ -75,12 +90,9 @@ _PYPI_ECLASS=1
pypi_normalize_name() {
[[ ${#} -ne 1 ]] && die "Usage: ${FUNCNAME} <name>"
- local name=${1}
- local shopt_save=$(shopt -p extglob)
- shopt -s extglob
- name=${name//+([._-])/_}
- ${shopt_save}
- echo "${name,,}"
+ local _PYPI_NORMALIZED_NAME
+ _pypi_normalize_name "${@}"
+ echo "${_PYPI_NORMALIZED_NAME}"
}
# @FUNCTION: pypi_translate_version
@@ -137,10 +149,10 @@ pypi_sdist_url() {
local project=${1-"${PYPI_PN}"}
local version=${2-"$(pypi_translate_version "${PV}")"}
local suffix=${3-.tar.gz}
- local fn_project=${project}
- [[ ${normalize} ]] && fn_project=$(pypi_normalize_name "${project}")
+ local _PYPI_NORMALIZED_NAME=${project}
+ [[ ${normalize} ]] && _pypi_normalize_name "${_PYPI_NORMALIZED_NAME}"
printf "https://files.pythonhosted.org/packages/source/%s" \
- "${project::1}/${project}/${fn_project}-${version}${suffix}"
+ "${project::1}/${project}/${_PYPI_NORMALIZED_NAME}-${version}${suffix}"
}
# @FUNCTION: pypi_wheel_name
@@ -167,11 +179,12 @@ pypi_wheel_name() {
die "Usage: ${FUNCNAME} <project> [<version> [<python-tag> [<abi-platform-tag>]]]"
fi
- local project=$(pypi_normalize_name "${1-"${PYPI_PN}"}")
+ local _PYPI_NORMALIZED_NAME
+ _pypi_normalize_name "${1:-"${PYPI_PN}"}"
local version=${2-"$(pypi_translate_version "${PV}")"}
local pytag=${3-py3}
local abitag=${4-none-any}
- echo "${project}-${version}-${pytag}-${abitag}.whl"
+ echo "${_PYPI_NORMALIZED_NAME}-${version}-${pytag}-${abitag}.whl"
}
# @FUNCTION: pypi_wheel_url
@@ -232,8 +245,10 @@ _pypi_set_globals() {
SRC_URI="$(pypi_sdist_url --no-normalize "${PYPI_PN}" "${version}")"
S="${WORKDIR}/${PYPI_PN}-${version}"
else
+ local _PYPI_NORMALIZED_NAME
+ _pypi_normalize_name "${PYPI_PN}"
SRC_URI="$(pypi_sdist_url "${PYPI_PN}" "${version}")"
- S="${WORKDIR}/$(pypi_normalize_name "${PYPI_PN}")-${version}"
+ S="${WORKDIR}/${_PYPI_NORMALIZED_NAME}-${version}"
fi
}
--
2.41.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [gentoo-dev] [PATCH 5/7] pypi.eclass: Translate version without subshell in common case
2023-06-13 6:45 [gentoo-dev] [PATCH 0/7] pypi.eclass: performance optimizations Michał Górny
` (3 preceding siblings ...)
2023-06-13 6:45 ` [gentoo-dev] [PATCH 4/7] pypi.eclass: Normalize names without subshell Michał Górny
@ 2023-06-13 6:45 ` Michał Górny
2023-06-13 6:45 ` [gentoo-dev] [PATCH 6/7] pypi.eclass: Replace pypi_sdist_url in global scope Michał Górny
2023-06-13 6:45 ` [gentoo-dev] [PATCH 7/7] pypi.eclass: Avoid subshell for extglob setting Michał Górny
6 siblings, 0 replies; 10+ messages in thread
From: Michał Górny @ 2023-06-13 6:45 UTC (permalink / raw
To: gentoo-dev; +Cc: Michał Górny
Provide an internal helper to translate versions without a subshell,
and use it in the common case. Now the benchmark gives 685 ops / s,
which means it's another 28% speedup.
Signed-off-by: Michał Górny <mgorny@gentoo.org>
---
eclass/pypi.eclass | 31 +++++++++++++++++++++----------
1 file changed, 21 insertions(+), 10 deletions(-)
diff --git a/eclass/pypi.eclass b/eclass/pypi.eclass
index d79e6f06fc1b..c8ad2e03d6e8 100644
--- a/eclass/pypi.eclass
+++ b/eclass/pypi.eclass
@@ -95,6 +95,19 @@ pypi_normalize_name() {
echo "${_PYPI_NORMALIZED_NAME}"
}
+# @FUNCTION: _pypi_translate_version
+# @USAGE: <version>
+# @DESCRIPTION:
+# Internal version translation function, returns the result
+# via _PYPI_TRANSLATED_VERSION variable.
+_pypi_translate_version() {
+ local version=${1}
+ version=${version/_alpha/a}
+ version=${version/_beta/b}
+ version=${version/_rc/rc}
+ _PYPI_TRANSLATED_VERSION=${version/_p/.post}
+}
+
# @FUNCTION: pypi_translate_version
# @USAGE: <version>
# @DESCRIPTION:
@@ -106,12 +119,9 @@ pypi_normalize_name() {
pypi_translate_version() {
[[ ${#} -ne 1 ]] && die "Usage: ${FUNCNAME} <version>"
- local version=${1}
- version=${version/_alpha/a}
- version=${version/_beta/b}
- version=${version/_rc/rc}
- version=${version/_p/.post}
- echo "${version}"
+ local _PYPI_TRANSLATED_VERSION
+ _pypi_translate_version "${@}"
+ echo "${_PYPI_TRANSLATED_VERSION}"
}
# @FUNCTION: pypi_sdist_url
@@ -239,16 +249,17 @@ pypi_wheel_url() {
# @DESCRIPTION:
# Set global variables, SRC_URI and S.
_pypi_set_globals() {
- local version=$(pypi_translate_version "${PV}")
+ local _PYPI_TRANSLATED_VERSION
+ _pypi_translate_version "${PV}"
if [[ ${PYPI_NO_NORMALIZE} ]]; then
- SRC_URI="$(pypi_sdist_url --no-normalize "${PYPI_PN}" "${version}")"
+ SRC_URI="$(pypi_sdist_url --no-normalize "${PYPI_PN}" "${_PYPI_TRANSLATED_VERSION}")"
S="${WORKDIR}/${PYPI_PN}-${version}"
else
local _PYPI_NORMALIZED_NAME
_pypi_normalize_name "${PYPI_PN}"
- SRC_URI="$(pypi_sdist_url "${PYPI_PN}" "${version}")"
- S="${WORKDIR}/${_PYPI_NORMALIZED_NAME}-${version}"
+ SRC_URI="$(pypi_sdist_url "${PYPI_PN}" "${_PYPI_TRANSLATED_VERSION}")"
+ S="${WORKDIR}/${_PYPI_NORMALIZED_NAME}-${_PYPI_TRANSLATED_VERSION}"
fi
}
--
2.41.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [gentoo-dev] [PATCH 6/7] pypi.eclass: Replace pypi_sdist_url in global scope
2023-06-13 6:45 [gentoo-dev] [PATCH 0/7] pypi.eclass: performance optimizations Michał Górny
` (4 preceding siblings ...)
2023-06-13 6:45 ` [gentoo-dev] [PATCH 5/7] pypi.eclass: Translate version without subshell in common case Michał Górny
@ 2023-06-13 6:45 ` Michał Górny
2023-06-13 6:45 ` [gentoo-dev] [PATCH 7/7] pypi.eclass: Avoid subshell for extglob setting Michał Górny
6 siblings, 0 replies; 10+ messages in thread
From: Michał Górny @ 2023-06-13 6:45 UTC (permalink / raw
To: gentoo-dev; +Cc: Michał Górny
Introduce an internal helper for _pypi_sdist_url that doesn't require
subshell, and therefore eliminate all subshells from global scope.
We're nearing 952 ops / s, further 39% speedup.
Signed-off-by: Michał Górny <mgorny@gentoo.org>
---
eclass/pypi.eclass | 53 +++++++++++++++++++++++++++++-----------------
1 file changed, 33 insertions(+), 20 deletions(-)
diff --git a/eclass/pypi.eclass b/eclass/pypi.eclass
index c8ad2e03d6e8..eade3d955ab5 100644
--- a/eclass/pypi.eclass
+++ b/eclass/pypi.eclass
@@ -124,6 +124,31 @@ pypi_translate_version() {
echo "${_PYPI_TRANSLATED_VERSION}"
}
+# @FUNCTION: _pypi_sdist_url
+# @INTERNAL
+# @USAGE: [--no-normalize] [<project> [<version> [<suffix>]]]
+# @DESCRIPTION:
+# Internal sdist generated, returns the result via _PYPI_SDIST_URL
+# variable.
+_pypi_sdist_url() {
+ local normalize=1
+ if [[ ${1} == --no-normalize ]]; then
+ normalize=
+ shift
+ fi
+
+ if [[ ${#} -gt 3 ]]; then
+ die "Usage: ${FUNCNAME} [--no-normalize] <project> [<version> [<suffix>]]"
+ fi
+
+ local project=${1-"${PYPI_PN}"}
+ local version=${2-"$(pypi_translate_version "${PV}")"}
+ local suffix=${3-.tar.gz}
+ local _PYPI_NORMALIZED_NAME=${project}
+ [[ ${normalize} ]] && _pypi_normalize_name "${_PYPI_NORMALIZED_NAME}"
+ _PYPI_SDIST_URL="https://files.pythonhosted.org/packages/source/${project::1}/${project}/${_PYPI_NORMALIZED_NAME}-${version}${suffix}"
+}
+
# @FUNCTION: pypi_sdist_url
# @USAGE: [--no-normalize] [<project> [<version> [<suffix>]]]
# @DESCRIPTION:
@@ -146,23 +171,9 @@ pypi_translate_version() {
# If <format> is unspecified, it defaults to ".tar.gz". Another valid
# value is ".zip" (please remember to add a BDEPEND on app-arch/unzip).
pypi_sdist_url() {
- local normalize=1
- if [[ ${1} == --no-normalize ]]; then
- normalize=
- shift
- fi
-
- if [[ ${#} -gt 3 ]]; then
- die "Usage: ${FUNCNAME} [--no-normalize] <project> [<version> [<suffix>]]"
- fi
-
- local project=${1-"${PYPI_PN}"}
- local version=${2-"$(pypi_translate_version "${PV}")"}
- local suffix=${3-.tar.gz}
- local _PYPI_NORMALIZED_NAME=${project}
- [[ ${normalize} ]] && _pypi_normalize_name "${_PYPI_NORMALIZED_NAME}"
- printf "https://files.pythonhosted.org/packages/source/%s" \
- "${project::1}/${project}/${_PYPI_NORMALIZED_NAME}-${version}${suffix}"
+ local _PYPI_SDIST_URL
+ _pypi_sdist_url "${@}"
+ echo "${_PYPI_SDIST_URL}"
}
# @FUNCTION: pypi_wheel_name
@@ -249,18 +260,20 @@ pypi_wheel_url() {
# @DESCRIPTION:
# Set global variables, SRC_URI and S.
_pypi_set_globals() {
- local _PYPI_TRANSLATED_VERSION
+ local _PYPI_SDIST_URL _PYPI_TRANSLATED_VERSION
_pypi_translate_version "${PV}"
if [[ ${PYPI_NO_NORMALIZE} ]]; then
- SRC_URI="$(pypi_sdist_url --no-normalize "${PYPI_PN}" "${_PYPI_TRANSLATED_VERSION}")"
+ _pypi_sdist_url --no-normalize "${PYPI_PN}" "${_PYPI_TRANSLATED_VERSION}"
S="${WORKDIR}/${PYPI_PN}-${version}"
else
local _PYPI_NORMALIZED_NAME
_pypi_normalize_name "${PYPI_PN}"
- SRC_URI="$(pypi_sdist_url "${PYPI_PN}" "${_PYPI_TRANSLATED_VERSION}")"
+ _pypi_sdist_url "${PYPI_PN}" "${_PYPI_TRANSLATED_VERSION}"
S="${WORKDIR}/${_PYPI_NORMALIZED_NAME}-${_PYPI_TRANSLATED_VERSION}"
fi
+
+ SRC_URI=${_PYPI_SDIST_URL}
}
_pypi_set_globals
--
2.41.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [gentoo-dev] [PATCH 7/7] pypi.eclass: Avoid subshell for extglob setting
2023-06-13 6:45 [gentoo-dev] [PATCH 0/7] pypi.eclass: performance optimizations Michał Górny
` (5 preceding siblings ...)
2023-06-13 6:45 ` [gentoo-dev] [PATCH 6/7] pypi.eclass: Replace pypi_sdist_url in global scope Michał Górny
@ 2023-06-13 6:45 ` Michał Górny
2023-06-13 9:07 ` Ulrich Mueller
6 siblings, 1 reply; 10+ messages in thread
From: Michał Górny @ 2023-06-13 6:45 UTC (permalink / raw
To: gentoo-dev; +Cc: Michał Górny
Suggested by Eli Schwartz. This gives roughly 5260 ops / s, over 550%
speedup.
The complete patch series therefore increases the speed from roughly
326 ops / s to 5260 ops / s, making the common case 16 times faster.
Closes: https://bugs.gentoo.org/908411
Closes: https://github.com/gentoo/gentoo/pull/31404
Signed-off-by: Michał Górny <mgorny@gentoo.org>
---
eclass/pypi.eclass | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/eclass/pypi.eclass b/eclass/pypi.eclass
index eade3d955ab5..618fde5e3de8 100644
--- a/eclass/pypi.eclass
+++ b/eclass/pypi.eclass
@@ -71,10 +71,13 @@ _PYPI_ECLASS=1
# via _PYPI_NORMALIZED_NAME variable.
_pypi_normalize_name() {
local name=${1}
- local shopt_save=$(shopt -p extglob)
- shopt -s extglob
+ local prev_extglob=-s
+ if ! shopt -p extglob >/dev/null; then
+ prev_extglob=-u
+ shopt -s extglob
+ fi
name=${name//+([._-])/_}
- ${shopt_save}
+ shopt "${prev_extglob}" extglob
_PYPI_NORMALIZED_NAME="${name,,}"
}
--
2.41.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [gentoo-dev] [PATCH 7/7] pypi.eclass: Avoid subshell for extglob setting
2023-06-13 6:45 ` [gentoo-dev] [PATCH 7/7] pypi.eclass: Avoid subshell for extglob setting Michał Górny
@ 2023-06-13 9:07 ` Ulrich Mueller
2023-06-13 13:37 ` Michał Górny
0 siblings, 1 reply; 10+ messages in thread
From: Ulrich Mueller @ 2023-06-13 9:07 UTC (permalink / raw
To: Michał Górny; +Cc: gentoo-dev
[-- Attachment #1: Type: text/plain, Size: 792 bytes --]
>>>>> On Tue, 13 Jun 2023, Michał Górny wrote:
> _pypi_normalize_name() {
> local name=${1}
> - local shopt_save=$(shopt -p extglob)
> - shopt -s extglob
> + local prev_extglob=-s
> + if ! shopt -p extglob >/dev/null; then
> + prev_extglob=-u
> + shopt -s extglob
> + fi
> name=${name//+([._-])/_}
> - ${shopt_save}
> + shopt "${prev_extglob}" extglob
> _PYPI_NORMALIZED_NAME="${name,,}"
> }
In principle you could also do something like this:
if shopt -pq extglob; then
name=${name//+([._-])/_}
else
shopt -s extglob
name=${name//+([._-])/_}
shopt -u extglob
fi
It duplicates one line of code, but saves a variable and IMHO the code
would be easier to understand.
Also, with the -q option no output redirection is needed.
Ulrich
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 507 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [gentoo-dev] [PATCH 7/7] pypi.eclass: Avoid subshell for extglob setting
2023-06-13 9:07 ` Ulrich Mueller
@ 2023-06-13 13:37 ` Michał Górny
0 siblings, 0 replies; 10+ messages in thread
From: Michał Górny @ 2023-06-13 13:37 UTC (permalink / raw
To: gentoo-dev
On Tue, 2023-06-13 at 11:07 +0200, Ulrich Mueller wrote:
> > > > > > On Tue, 13 Jun 2023, Michał Górny wrote:
>
> > _pypi_normalize_name() {
> > local name=${1}
> > - local shopt_save=$(shopt -p extglob)
> > - shopt -s extglob
> > + local prev_extglob=-s
> > + if ! shopt -p extglob >/dev/null; then
> > + prev_extglob=-u
> > + shopt -s extglob
> > + fi
> > name=${name//+([._-])/_}
> > - ${shopt_save}
> > + shopt "${prev_extglob}" extglob
> > _PYPI_NORMALIZED_NAME="${name,,}"
> > }
>
> In principle you could also do something like this:
>
> if shopt -pq extglob; then
> name=${name//+([._-])/_}
> else
> shopt -s extglob
> name=${name//+([._-])/_}
> shopt -u extglob
> fi
>
> It duplicates one line of code, but saves a variable and IMHO the code
> would be easier to understand.
>
I was thinking about this but I really dislike repeating the logic
twice. In my opinion, having such block would be confusing: why are
there two logics for extglob on and off? Why are both the same? Is
this some mistake?
Even though this is unlikely, someone could actually end up creating
a missync there, and things would go downhill from there.
-q is a good idea though.
Ideally, we'd avoid extglob at all but I can't think of another pure
bash way of doing this.
--
Best regards,
Michał Górny
^ permalink raw reply [flat|nested] 10+ messages in thread