If an ebuild uses EGO_SUM and needs to define a custom src_unpack phase,
these functions will make that easier.

go-module_setup_proxy is used to create a local file proxy of the
dependencies listed in EGO_SUM and go-module_filter_proxy is used to
create a new ${A} with the EGO_SUM_SRC_URI values removed.

Signed-off-by: William Hubbs <willi...@gentoo.org>
---
 eclass/go-module.eclass | 69 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)

diff --git a/eclass/go-module.eclass b/eclass/go-module.eclass
index c9a7ab12eaf..80e1f711215 100644
--- a/eclass/go-module.eclass
+++ b/eclass/go-module.eclass
@@ -236,6 +236,75 @@ go-module_set_globals() {
        _GO_MODULE_SET_GLOBALS_CALLED=1
 }
 
+# @FUNCTION: go-module_filter_proxy
+# @DESCRIPTION:
+# If your ebuild redefines src_unpack and uses EGO_SUM, use the return
+# value of this function in place of ${A} in your src_unpack function.
+# It filters the EGO_SUM_SRC_URI values out of SRC_URI.
+go-module_filter_proxy() {
+       # shellcheck disable=SC2120
+       debug-print-function "${FUNCNAME}" "$@"
+
+       if [[ ! ${_GO_MODULE_SET_GLOBALS_CALLED} ]]; then
+               die "go-module_set_globals must be called in global scope"
+       fi
+
+       # Skip golang modules and add the rest of the entries to a local
+       # array.
+       local f
+       local -a src
+       for f in ${A}; do
+               if [[ -z ${_GOMODULE_GOSUM_REVERSE_MAP["${f}"]} ]]; then
+               src+=("${f}")
+               fi
+       done
+       echo "${src[@]}"
+}
+
+# @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 and exports
+# the GOPROXY environment variable so that go calls will be able to
+# locate the proxy directory.
+go-module_setup_proxy() {
+       # shellcheck disable=SC2120
+       debug-print-function "${FUNCNAME}" "$@"
+
+       if [[ ! ${_GO_MODULE_SET_GLOBALS_CALLED} ]]; then
+               die "go-module_set_globals must be called in global scope"
+       fi
+
+       local goproxy_dir="${T}/go-proxy"
+       mkdir -p "${goproxy_dir}" || die
+
+       # For each Golang module distfile, look up where it's supposed to go and
+       # symlink it into place.
+       local f
+       local goproxy_mod_dir
+       for f in ${A}; do
+               goproxy_mod_path="${_GOMODULE_GOSUM_REVERSE_MAP["${f}"]}"
+               if [[ -n "${goproxy_mod_path}" ]]; then
+                       debug-print-function "Populating go proxy for 
${goproxy_mod_path}"
+                       # Build symlink hierarchy
+                       goproxy_mod_dir=$( dirname 
"${goproxy_dir}"/"${goproxy_mod_path}" )
+                       mkdir -p "${goproxy_mod_dir}" || die
+                       ln -sf "${DISTDIR}"/"${f}" 
"${goproxy_dir}/${goproxy_mod_path}" ||
+                               die "Failed to ln"
+                       local v=${goproxy_mod_path}
+                       v="${v%.mod}"
+                       v="${v%.zip}"
+                       v="${v//*\/}"
+                       _go-module_gosum_synthesize_files "${goproxy_mod_dir}" 
"${v}"
+               fi
+       done
+       export GOPROXY="file://${goproxy_dir}"
+
+       # Validate the gosum now
+       _go-module_src_unpack_verify_gosum
+}
+
 # @FUNCTION: go-module_src_unpack
 # @DESCRIPTION:
 # If EGO_SUM is set, unpack the base tarball(s) and set up the
-- 
2.26.3


Reply via email to