• [gentoo-dev] [PATCH] go-module.eclass: inline _go-module_gomod_encode()

    From Florian Schmaus@21:1/5 to All on Mon Jun 12 13:30:01 2023
    The only call site of _go-module_gomod_encode() was using $() in a loop
    over EGO_SUM. This caused bash to fork() for every loop iteration, which significantly affected the time it takes to "source" an ebuild using
    EGO_SUM.

    For example, "pkg pkg source =sys-cluster/k3s-1.23.3_p1" previously took
    2.4 seconds. Inlining _go-module_gomod_encode() reduces this to
    236 milliseconds.

    This also adds missing 'local' declarations for some variables.

    Signed-off-by: Florian Schmaus <[email protected]>
    ---
    eclass/go-module.eclass | 44 +++++++++++++++--------------------------
    1 file changed, 16 insertions(+), 28 deletions(-)

    diff --git a/eclass/go-module.eclass b/eclass/go-module.eclass
    index f97b69f591c8..6c58d7f26f07 100644
    --- a/eclass/go-module.eclass
    +++ b/eclass/go-module.eclass
    @@ -262,7 +262,22 @@ go-module_set_globals() {
    continue
    fi

    - _dir=$(_go-module_gomod_encode "${module}")
    + # Encode the name(path) of a Golang module in the format expected by Goproxy.
    + # Upper letters are replaced by their lowercase version with a '!' prefix.
    + # The transformed result of 'module' is stored in the '_dir' variable.
    + #
    + ## Python:
    + # return re.sub('([A-Z]{1})', r'!\1', s).lower()
    + ## Sed:
    + ## This uses GNU Sed extension \l to downcase the match
    + # echo "${module}" |sed 's,[A-Z],!\l&,g'
    + local re _dir lower
    + _dir="${module}"
    + re='(.*)([A-Z])(.*)'
    + while [[ ${_dir} =~ ${re} ]]; do
    + lower='!'"${BASH_REMATCH[2],}"
    + _dir="${BASH_REMATCH[1]}${lower}
  • From Sam James@21:1/5 to Florian Schmaus on Mon Jun 12 16:20:01 2023
    Florian Schmaus <[email protected]> writes:

    The only call site of _go-module_gomod_encode() was using $() in a loop
    over EGO_SUM. This caused bash to fork() for every loop iteration, which significantly affected the time it takes to "source" an ebuild using
    EGO_SUM.

    For example, "pkg pkg source =sys-cluster/k3s-1.23.3_p1" previously took
    2.4 seconds. Inlining _go-module_gomod_encode() reduces this to
    236 milliseconds.

    This also adds missing 'local' declarations for some variables.

    Nice one & lgtm, thanks!

    But please remember to CC eclass maintainers (done now). If you did and
    I missed it, apologies.


    Signed-off-by: Florian Schmaus <[email protected]>
    ---
    eclass/go-module.eclass | 44 +++++++++++++++--------------------------
    1 file changed, 16 insertions(+), 28 deletions(-)

    diff --git a/eclass/go-module.eclass b/eclass/go-module.eclass
    index f97b69f591c8..6c58d7f26f07 100644
    --- a/eclass/go-module.eclass
    +++ b/eclass/go-module.eclass
    @@ -262,7 +262,22 @@ go-module_set_globals() {
    continue
    fi

    - _dir=$(_go-module_gomod_encode "${module}")
    + # Encode the name(path) of a Golang module in the format expected by Goproxy.
    + # Upper letters are replaced by their lowercase version with a '!' prefix.
    + # The transformed result of 'module' is stored in the '_dir' variable.
    + #
    + ## Python:
    + # return re.sub('([A-Z]{1})', r'!\1', s).lower()
    + ## Sed:
    + ## This uses GNU Sed extension \l to downcase the match
    + # echo "${module}" |sed 's,[A-Z],!\l&,g'
    + local re _dir lower
    + _dir="${module}"
    + re='(.*)([A-Z])(.*)'
    + while [[ ${_dir} =~ ${re} ]]; do
    + lower='!'"${BASH_REMATCH[2],}"
    + _dir="${BASH_REMATCH[1]}${lower}${BASH_REMATCH[3]}"
    + done

    for _ext in "${exts[@]}" ; do
    # Relative URI within a GOPROXY for a file
    @@ -496,33 +511,6 @@ go-module_live_vendor() {
    popd >& /dev/null || die
    }

    -# @FUNCTION: _go-module_gomod_encode
    -# @DEPRECATED: none
    -# @DESCRIPTION:
    -# Encode the name(path) of a Golang module in the format expected by Goproxy.
    -#
    -# Upper letters are replaced by their lowercase version with a '!' prefix. -#
    -_go-module_gomod_encode() {
    - ## Python:
    - # return re.sub('([A-Z]{1})', r'!\1', s).lower()
    -
    - ## Sed:
    - ## This uses GNU Sed extension \l to downcase the match
    - #echo "${module}" |sed 's,[A-Z],!\l&,g'
    - #
    - # Bash variant:
    - debug-print-function "${FUNCNAME}" "$@"
    - #local re input lower
    - re='(.*)([A-Z])(.*)'
    - input="${1}"
    - while [[ ${input} =~ ${re} ]]; do
    - lower='!'"${BASH_REMATCH[2],}"
    - input="${BASH_REMATCH[1]}${lower}${BASH_REMATCH[3]}"
    - done
    - echo "${input}"
    -}
    -
    fi

    if [[ ! ${GO_OPTIONAL} ]]; then


    --=-=-Content-Type: application/pgp-signature; name="signature.asc"

    -----BEGIN PGP SIGNATURE-----

    iOUEARYKAI0WIQQlpruI3Zt2TGtVQcJzhAn1IN+RkAUCZIcn4F8UgAAAAAAuAChp c3N1ZXItZnByQG5vdGF0aW9ucy5vcGVucGdwLmZpZnRoaG9yc2VtYW4ubmV0MjVB NkJCODhERDlCNzY0QzZCNTU0MUMyNzM4NDA5RjUyMERGOTE5MA8cc2FtQGdlbnRv by5vcmcACgkQc4QJ9SDfkZDODAEAy9BPfolrgoRYvBh2kM/IWkZ0Cki9ym4baGu5 MfbTapABAMiR4K1/Ef09XDDt+wX8vZvRLDPhazZ/OG61DO0b+XUI
    =j6KY
    -----END PGP SIGNATURE-----

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From William Hubbs@21:1/5 to Florian Schmaus on Mon Jun 12 22:40:02 2023
    This is applied.

    Thanks,

    William

    On Mon, Jun 12, 2023 at 01:22:57PM +0200, Florian Schmaus wrote:
    The only call site of _go-module_gomod_encode() was using $() in a loop
    over EGO_SUM. This caused bash to fork() for every loop iteration, which significantly affected the time it takes to "source" an ebuild using
    EGO_SUM.

    For example, "pkg pkg source =sys-cluster/k3s-1.23.3_p1" previously took
    2.4 seconds. Inlining _go-module_gomod_encode() reduces this to
    236 milliseconds.

    This also adds missing 'local' declarations for some variables.

    Signed-off-by: Florian Schmaus <[email protected]>
    ---
    eclass/go-module.eclass | 44 +++++++++++++++--------------------------
    1 file changed, 16 insertions(+), 28 deletions(-)

    diff --git a/eclass/go-module.eclass b/eclass/go-module.eclass
    index f97b69f591c8..6c58d7f26f07 100644
    --- a/eclass/go-module.eclass
    +++ b/eclass/go-module.eclass
    @@ -262,7 +262,22 @@ go-module_set_globals() {
    continue
    fi

    - _dir=$(_go-module_gomod_encode "${module}")
    + # Encode the name(path) of a Golang module in the format expected by Goproxy.
    + # Upper letters are replaced by their lowercase version with a '!' prefix.
    + # The transformed result of 'module' is stored in the '_dir' variable.
    + #
    + ## Python:
    + # return re.sub('([A-Z]{1})', r'!\1', s).lower()
    + ## Sed:
    + ## This uses GNU Sed extension \l to downcase the match
    + # echo "${module}" |sed 's,[A-Z],!\l&,g'
    + local re _dir lower
    + _dir="${module}"
    + re='(.*)([A-Z])(.*)'
    + while [[ ${_dir} =~ ${re} ]]; do
    + lower='!'"${BASH_REMATCH[2],}"
    + _dir="${BASH_REMATCH[1]}${lower}${BASH_REMATCH[3]}"
    + done

    for _ext in "${exts[@]}" ; do
    # Relative URI within a GOPROXY for a file
    @@ -496,33 +511,6 @@ go-module_live_vendor() {
    popd >& /dev/null || die
    }

    -# @FUNCTION: _go-module_gomod_encode
    -# @DEPRECATED: none
    -# @DESCRIPTION:
    -# Encode the name(path) of a Golang module in the format expected by Goproxy.
    -#
    -# Upper letters are replaced by their lowercase version with a '!' prefix. -#
    -_go-module_gomod_encode() {
    - ## Python:
    - # return re.sub('([A-Z]{1})', r'!\1', s).lower()
    -
    - ## Sed:
    - ## This uses GNU Sed extension \l to downcase the match
    - #echo "${module}" |sed 's,[A-Z],!\l&,g'
    - #
    - # Bash variant:
    - debug-print-function "${FUNCNAME}" "$@"
    - #local re input lower
    - re='(.*)([A-Z])(.*)'
    - input="${1}"
    - while [[ ${input} =~ ${re} ]]; do
    - lower='!'"${BASH_REMATCH[2],}"
    - input="${BASH_REMATCH[1]}${lower}${BASH_REMATCH[3]}"
    - done
    - echo "${input}"
    -}
    -
    fi

    if [[ ! ${GO_OPTIONAL} ]]; then
    --
    2.39.3



    -----BEGIN PGP SIGNATURE-----

    iF0EABECAB0WIQTVeuxEZo4uUHOkQAluVBb0MMRlOAUCZIeA1wAKCRBuVBb0MMRl OBgTAJ4lBG3KmMx8XQYaFaCE4W90eEwW9QCeJieYLC82mXa0Eml9nSkq0S5/t3A=
    =bUGn
    -----END PGP SIGNATURE-----

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)