On Fri, 2022-02-25 at 20:50 -0600, William Hubbs wrote:
> EGO_SUM can be thousands of lines long in ebuilds, and it leads to
> creating Manifest files that are thousands of lines long.
> It has been determined that vendor tarballs are a better solution if
> upstream doesn't vendor their dependencies.
> 
> Also, call the ego helper function instead of calling go directly.
> 
> Signed-off-by: William Hubbs <willi...@gentoo.org>
> ---
>  eclass/go-module.eclass | 140 ++++++++++------------------------------
>  1 file changed, 34 insertions(+), 106 deletions(-)
> 
> diff --git a/eclass/go-module.eclass b/eclass/go-module.eclass
> index 66fe52c9ad7..7f0d766f444 100644
> --- a/eclass/go-module.eclass
> +++ b/eclass/go-module.eclass
> @@ -25,8 +25,18 @@
>  #
>  # If the software has a directory named vendor in its
>  # top level directory, the only thing you need to do is inherit the
> -# eclass. Otherwise, you need to also populate
> -# EGO_SUM and call go-module_set_globals as discussed below.
> +# eclass.  If it doesn't, you need to also create a vendor tarball and
> +# host it somewhere, for example in your dev space.
> +#
> +# Here are the commands to create a vendor tarball.
> +#
> +# @CODE
> +#
> +# $ cd /path/to/project
> +# $ go mod vendor
> +# $ tar -acf project-1.0.tar.xz vendor

Why not 'cd ..' first and create a tarball that doesn't require custom
src_unpack()?  Also, shouldn't the name be 'project-1.0-vendor.tar'? 
Also, you're mising -J.

> +#
> +# @CODE
>  #
>  # Since Go programs are statically linked, it is important that your ebuild's
>  # LICENSE= setting includes the licenses of all statically linked
> @@ -40,15 +50,9 @@
>  #
>  # inherit go-module
>  #
> -# EGO_SUM=(
> -#   "github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod"
> -#   "github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59"
> -# )
> -#
> -# go-module_set_globals
> -#
> -# SRC_URI="https://github.com/example/${PN}/archive/v${PV}.tar.gz -> 
> ${P}.tar.gz
> -#               ${EGO_SUM_SRC_URI}"
> +# SRC_URI="https://github.com/example/${PN}/archive/v${PV}.tar.gz -> 
> ${P}.tar.gz"
> +# Do not add the next line if you don't have a vendor tarball
> +# SRC_URI+="${P}-vendor.tar.gz"
>  #
>  # @CODE
>  
> @@ -100,72 +104,6 @@ QA_FLAGS_IGNORED='.*'
>  # Go packages should not be stripped with strip(1).
>  RESTRICT+=" strip"
>  
> -# @ECLASS-VARIABLE: EGO_SUM
> -# @DESCRIPTION:
> -# This array is based on the contents of the go.sum file from the top
> -# level directory of the software you are packaging. Each entry must be
> -# quoted and contain the first two fields of a line from go.sum.
> -#
> -# You can use some combination of sed/awk/cut to extract the
> -# contents of EGO_SUM or use the dev-go/get-ego-vendor tool.
> -# 
> -# One manual way to do this is the following:
> -#
> -# @CODE
> -#
> -# cat go.sum | cut -d" " -f1,2 | awk '{print "\t\"" $0 "\""}'
> -# 
> -# @CODE
> -#
> -# The format of go.sum is described upstream here:
> -# https://go.dev/ref/mod#go-sum-files
> -#
> -# For inclusion in EGO_SUM, the h1: value and other future extensions SHOULD 
> be
> -# omitted at this time. The EGO_SUM parser will accept them for ease of 
> ebuild
> -# creation.
> -#
> -# h1:<hash> is the Hash1 structure used by upstream Go
> -# The Hash1 is MORE stable than Gentoo distfile hashing, and upstream warns
> -# that it's conceptually possible for the Hash1 value to remain stable while
> -# the upstream zipfiles change. Here are examples that do NOT change the h1:
> -# hash, but do change a regular checksum over all bytes of the file:
> -# - Differing mtimes within zipfile
> -# - Differing filename ordering with the zipfile
> -# - Differing zipfile compression parameters
> -# - Differing zipfile extra fields
> -#
> -# For Gentoo usage, the authors of this eclass feel that the h1: hash should
> -# NOT be included in the EGO_SUM at this time in order to reduce size of the
> -# ebuilds. This position will be reconsidered in future when a Go module
> -# distfile collision comes to light, where the Hash1 value of two distfiles 
> is
> -# the same, but checksums over the file as a byte stream consider the files 
> to
> -# be different.
> -#
> -# This decision  does NOT weaken Go module security, as Go will verify the
> -# go.sum copy of the Hash1 values during building of the package.
> -
> -# @ECLASS-VARIABLE: _GOMODULE_GOPROXY_BASEURI
> -# @DESCRIPTION:
> -# Golang module proxy service to fetch module files from. Note that the 
> module
> -# proxy generally verifies modules via the Hash1 code.
> -#
> -# Users in China may find some mirrors in the default list blocked, and 
> should
> -# explicitly set an entry in /etc/portage/mirrors for goproxy to
> -# https://goproxy.cn/ or another mirror that is not blocked in China.
> -# See https://arslan.io/2019/08/02/why-you-should-use-a-go-module-proxy/ for
> -# further details
> -#
> -# This variable is NOT intended for user-level configuration of mirrors, but
> -# rather to cover go modules that might exist only on specific Goproxy
> -# servers for non-technical reasons.
> -#
> -# This variable should NOT be present in user-level configuration e.g.
> -# /etc/portage/make.conf, as it will violate metadata immutability!
> -#
> -# I am considering removing this and just hard coding mirror://goproxy
> -# below, so please do not rely on it.
> -: "${_GOMODULE_GOPROXY_BASEURI:=mirror://goproxy/}"
> -
>  # @ECLASS-VARIABLE: _GOMODULE_GOSUM_REVERSE_MAP
>  # @DESCRIPTION:
>  # Mapping back from Gentoo distfile name to upstream distfile path.
> @@ -181,7 +119,7 @@ declare -A -g _GOMODULE_GOSUM_REVERSE_MAP
>  # ebuild will be considered optional. No dependencies will be added and
>  # no phase functions will be exported.
>  #
> -# If you enable GO_OPTIONAL, you have to set BDEPEND on >=dev-lang/go-1.12
> +# If you enable GO_OPTIONAL, you have to set BDEPEND on >=dev-lang/go-1.16
>  # for your package and call go-module_src_unpack manually.
>  
>  # @FUNCTION: ego
> @@ -199,11 +137,7 @@ ego() {
>  
>  # @FUNCTION: go-module_set_globals
>  # @DESCRIPTION:
> -# Convert the information in EGO_SUM for other usage in the ebuild.
> -# - Populates EGO_SUM_SRC_URI that can be added to SRC_URI
> -# - Exports _GOMODULE_GOSUM_REVERSE_MAP which provides reverse mapping from
> -#   distfile back to the relative part of SRC_URI, as needed for
> -#   GOPROXY=file:///...
> +# This function is deprecated.
>  go-module_set_globals() {
>       local line exts
>       # for tracking go.sum errors
> @@ -256,7 +190,7 @@ go-module_set_globals() {
>                       # Relative URI within a GOPROXY for a file
>                       _reluri="${_dir}/@v/${version}.${_ext}"
>                       # SRC_URI: LHS entry
> -                     _uri="${_GOMODULE_GOPROXY_BASEURI}/${_reluri}"
> +                     _uri="mirror://goproxy/${_reluri}"
>  #                    _uri="mirror://goproxy/${_reluri}"
>                       # SRC_URI: RHS entry, encode any slash in the path as
>                       # %2F in the filename
> @@ -289,9 +223,7 @@ go-module_set_globals() {
>  
>  # @FUNCTION: go-module_setup_proxy
>  # @DESCRIPTION:
> -# If your ebuild redefines src_unpack and uses EGO_SUM you need to call
> -# this function in src_unpack.
> -# It sets up the go module proxy in the appropriate location.
> +# This function is deprecated.
>  go-module_setup_proxy() {
>       # shellcheck disable=SC2120
>       debug-print-function "${FUNCNAME}" "$@"
> @@ -331,27 +263,30 @@ go-module_setup_proxy() {
>  # @FUNCTION: go-module_src_unpack
>  # @DESCRIPTION:
>  # If EGO_SUM is set, unpack the base tarball(s) and set up the
> -#   local go proxy.
> +#   local go proxy. Also warn that this usage is deprecated.
>  # - Otherwise, if EGO_VENDOR is set, bail out.
> -# - Otherwise do a normal unpack.
> +# - Otherwise do a normal unpack and move the vendor directory into
> +# place if appropriate.
>  go-module_src_unpack() {
>       if [[ "${#EGO_SUM[@]}" -gt 0 ]]; then
> +             eqawarn "This ebuild uses EGO_SUM which is deprecated"
> +             eqawarn "Please migrate to a vendor tarball"
> +             eqawarn "This will become a fatal error in the future"
>               _go-module_src_unpack_gosum
>       elif [[ "${#EGO_VENDOR[@]}" -gt 0 ]]; then
>               eerror "${EBUILD} is using EGO_VENDOR which is no longer 
> supported"
>               die "Please update this ebuild"
>       else
>               default
> +             [[ -d "${S}"/vendor ]] && return
> +             [[ ! -d vendor ]] && return
> +             mv vendor "${S}" || die
>       fi
>  }
>  
>  # @FUNCTION: _go-module_src_unpack_gosum
>  # @DESCRIPTION:
> -# Populate a GOPROXY directory hierarchy with distfiles from EGO_SUM and
> -# unpack the base distfiles.
> -#
> -# Exports GOPROXY environment variable so that Go calls will source the
> -# directory correctly.
> +# This function is deprecated.
>  _go-module_src_unpack_gosum() {
>       # shellcheck disable=SC2120
>       debug-print-function "${FUNCNAME}" "$@"
> @@ -392,10 +327,7 @@ _go-module_src_unpack_gosum() {
>  
>  # @FUNCTION: _go-module_gosum_synthesize_files
>  # @DESCRIPTION:
> -# Given a path &  version, populate all Goproxy metadata files which aren't
> -# needed to be downloaded directly.
> -# - .../@v/${version}.info
> -# - .../@v/list
> +# This function is deprecated.
>  _go-module_gosum_synthesize_files() {
>       local target=$1
>       local version=$2
> @@ -419,8 +351,7 @@ _go-module_gosum_synthesize_files() {
>  
>  # @FUNCTION: _go-module_src_unpack_verify_gosum
>  # @DESCRIPTION:
> -# Validate the Go modules declared by EGO_SUM are sufficient to cover 
> building
> -# the package, without actually building it yet.
> +# This function is deprecated.
>  _go-module_src_unpack_verify_gosum() {
>       # shellcheck disable=SC2120
>       debug-print-function "${FUNCNAME}" "$@"
> @@ -435,7 +366,7 @@ _go-module_src_unpack_verify_gosum() {
>       # This will print 'downloading' messages, but it's accessing content 
> from
>       # the $GOPROXY file:/// URL!
>       einfo "Tidying go.mod/go.sum"
> -     go mod tidy >/dev/null
> +     ego mod tidy >/dev/null
>  
>       # This used to call 'go get' to verify by fetching everything from the 
> main
>       # go.mod. However 'go get' also turns out to recursively try to fetch
> @@ -461,16 +392,13 @@ go-module_live_vendor() {
>               die "${FUNCNAME} only allowed when upstream isn't vendoring"
>  
>       pushd "${S}" >& /dev/null || die
> -     go mod vendor || die
> +     ego mod vendor
>       popd >& /dev/null || die
>  }
>  
>  # @FUNCTION: _go-module_gomod_encode
>  # @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.
> -#
> +# This function is deprecated.
>  _go-module_gomod_encode() {
>       ## Python:
>       # return re.sub('([A-Z]{1})', r'!\1', s).lower()

-- 
Best regards,
Michał Górny


Reply via email to