bitbake: fetch2/gomod: Fix mirroring problem

Build the 'downloadfilename' parameter by replacing path separators in
the module path like the git fetcher builds the mirror tar ball name.
Copy the downloaded file in the fetcher's unpack method like the crate
fetcher instead of calling the base fetcher's unpack method.

(Bitbake rev: 7762cea087597019460d66b04268757bd46befdf)

Signed-off-by: Christian Lindeberg <christian.lindeberg@axis.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Christian Lindeberg 2025-03-20 11:19:49 +01:00 committed by Richard Purdie
parent ecff1d6a2d
commit c00ad319d4
2 changed files with 31 additions and 13 deletions

View File

@ -107,23 +107,23 @@ class GoMod(Wget):
if ud.path != '/':
module += ud.path
ud.parm['module'] = module
version = ud.parm['version']
# Set URL and filename for wget download
path = escape(module + '/@v/' + ud.parm['version'])
if ud.parm.get('mod', '0') == '1':
path += '.mod'
ext = '.mod'
else:
path += '.zip'
ud.parm['unpack'] = '0'
ext = '.zip'
path = escape(f"{module}/@v/{version}{ext}")
ud.url = bb.fetch2.encodeurl(
('https', proxy, '/' + path, None, None, None))
ud.parm['downloadfilename'] = path
ud.parm['downloadfilename'] = f"{module.replace('/', '.')}@{version}{ext}"
ud.parm['name'] = f"{module}@{ud.parm['version']}"
# Set name for checksum verification
ud.parm['name'] = f"{module}@{version}"
# Set subdir for unpack
ud.parm['subdir'] = os.path.join(moddir, 'cache/download',
os.path.dirname(path))
# Set path for unpack
ud.parm['unpackpath'] = os.path.join(moddir, 'cache/download', path)
super().urldata_init(ud, d)
@ -131,13 +131,22 @@ class GoMod(Wget):
"""Unpack the module in the module cache."""
# Unpack the module zip file or go.mod file
super().unpack(ud, rootdir, d)
unpackpath = os.path.join(rootdir, ud.parm['unpackpath'])
unpackdir = os.path.dirname(unpackpath)
bb.utils.mkdirhier(unpackdir)
ud.unpack_tracer.unpack("file-copy", unpackdir)
cmd = f"cp {ud.localpath} {unpackpath}"
path = d.getVar('PATH')
if path:
cmd = f"PATH={path} {cmd}"
name = os.path.basename(unpackpath)
bb.note(f"Unpacking {name} to {unpackdir}/")
subprocess.check_call(cmd, shell=True, preexec_fn=subprocess_setup)
if ud.localpath.endswith('.zip'):
if name.endswith('.zip'):
# Unpack the go.mod file from the zip file
module = ud.parm['module']
unpackdir = os.path.join(rootdir, ud.parm['subdir'])
name = os.path.basename(ud.localpath).rsplit('.', 1)[0] + '.mod'
name = name.rsplit('.', 1)[0] + '.mod'
bb.note(f"Unpacking {name} to {unpackdir}/")
with zipfile.ZipFile(ud.localpath) as zf:
with open(os.path.join(unpackdir, name), mode='wb') as mf:

View File

@ -3378,6 +3378,8 @@ class GoModTest(FetcherTest):
fetcher = bb.fetch2.Fetch(urls, self.d)
ud = fetcher.ud[urls[0]]
self.assertEqual(ud.url, 'https://proxy.golang.org/github.com/%21azure/azure-sdk-for-go/sdk/storage/azblob/%40v/v1.0.0.zip')
self.assertEqual(ud.parm['downloadfilename'], 'github.com.Azure.azure-sdk-for-go.sdk.storage.azblob@v1.0.0.zip')
self.assertEqual(ud.parm['name'], 'github.com/Azure/azure-sdk-for-go/sdk/storage/azblob@v1.0.0')
fetcher.download()
fetcher.unpack(self.unpackdir)
@ -3395,6 +3397,8 @@ class GoModTest(FetcherTest):
fetcher = bb.fetch2.Fetch(urls, self.d)
ud = fetcher.ud[urls[0]]
self.assertEqual(ud.url, 'https://proxy.golang.org/github.com/%21azure/azure-sdk-for-go/sdk/storage/azblob/%40v/v1.0.0.mod')
self.assertEqual(ud.parm['downloadfilename'], 'github.com.Azure.azure-sdk-for-go.sdk.storage.azblob@v1.0.0.mod')
self.assertEqual(ud.parm['name'], 'github.com/Azure/azure-sdk-for-go/sdk/storage/azblob@v1.0.0')
fetcher.download()
fetcher.unpack(self.unpackdir)
@ -3409,6 +3413,7 @@ class GoModTest(FetcherTest):
fetcher = bb.fetch2.Fetch(urls, self.d)
ud = fetcher.ud[urls[0]]
self.assertEqual(ud.url, 'https://proxy.golang.org/gopkg.in/ini.v1/%40v/v1.67.0.zip')
self.assertEqual(ud.parm['downloadfilename'], 'gopkg.in.ini.v1@v1.67.0.zip')
self.assertEqual(ud.parm['name'], 'gopkg.in/ini.v1@v1.67.0')
fetcher.download()
@ -3427,6 +3432,8 @@ class GoModTest(FetcherTest):
fetcher = bb.fetch2.Fetch(urls, self.d)
ud = fetcher.ud[urls[0]]
self.assertEqual(ud.url, 'https://proxy.golang.org/gopkg.in/ini.v1/%40v/v1.67.0.zip')
self.assertEqual(ud.parm['downloadfilename'], 'gopkg.in.ini.v1@v1.67.0.zip')
self.assertEqual(ud.parm['name'], 'gopkg.in/ini.v1@v1.67.0')
fetcher.download()
fetcher.unpack(self.unpackdir)
@ -3444,6 +3451,8 @@ class GoModTest(FetcherTest):
fetcher = bb.fetch2.Fetch(urls, self.d)
ud = fetcher.ud[urls[0]]
self.assertEqual(ud.url, 'https://proxy.golang.org/go.opencensus.io/%40v/v0.24.0.zip')
self.assertEqual(ud.parm['downloadfilename'], 'go.opencensus.io@v0.24.0.zip')
self.assertEqual(ud.parm['name'], 'go.opencensus.io@v0.24.0')
fetcher.download()
fetcher.unpack(self.unpackdir)