From c00ad319d49537e3277fcf70196eec534a958959 Mon Sep 17 00:00:00 2001 From: Christian Lindeberg Date: Thu, 20 Mar 2025 11:19:49 +0100 Subject: [PATCH] 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 Signed-off-by: Richard Purdie --- bitbake/lib/bb/fetch2/gomod.py | 35 +++++++++++++++++++++------------- bitbake/lib/bb/tests/fetch.py | 9 +++++++++ 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/bitbake/lib/bb/fetch2/gomod.py b/bitbake/lib/bb/fetch2/gomod.py index 03f649bc2f..53c1d8d115 100644 --- a/bitbake/lib/bb/fetch2/gomod.py +++ b/bitbake/lib/bb/fetch2/gomod.py @@ -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: diff --git a/bitbake/lib/bb/tests/fetch.py b/bitbake/lib/bb/tests/fetch.py index 486c10cd08..f2f140ff24 100644 --- a/bitbake/lib/bb/tests/fetch.py +++ b/bitbake/lib/bb/tests/fetch.py @@ -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)