diff mbox series

[bitbake-devel,v2,3/3] crate.py: authorize crate url with parameters

Message ID 20230317081916.1857201-3-frederic.martinsons@gmail.com
State New
Headers show
Series [bitbake-devel,v2,1/3] fetch2: Add checksum capability for crate fetcher | expand

Commit Message

Frédéric Martinsons March 17, 2023, 8:19 a.m. UTC
From: Frederic Martinsons <frederic.martinsons@gmail.com>

This allow to have classic fetch parameters
(like destsuffix, sha256, name ...) not being
considered by crate fetcher itself (and so mess
up its download)

Moreover, it allow to overload the name of the downloaded
crate (maybe usefull if there is a naming clash between
two crates coming from different repositories)

Signed-off-by: Frederic Martinsons <frederic.martinsons@gmail.com>
---
 lib/bb/fetch2/crate.py |  9 ++++++---
 lib/bb/tests/fetch.py  | 24 ++++++++++++++++++++++++
 2 files changed, 30 insertions(+), 3 deletions(-)

Comments

Peter Kjellerstedt April 6, 2023, 3:40 a.m. UTC | #1
Please cherry-pick this to Kirkstone and Langdale so that they can read 
updated recipes that use crate:// URIs with parameters.

I assume it should be ok to cherry-pick part one of this series too, as 
long as you do not cherry-pick part two, as it would be a breaking change.

//Peter

> -----Original Message-----
> From: bitbake-devel@lists.openembedded.org <bitbake-devel@lists.openembedded.org> On Behalf Of Frederic Martinsons
> Sent: den 17 mars 2023 09:19
> To: bitbake-devel@lists.openembedded.org
> Cc: Frederic Martinsons <frederic.martinsons@gmail.com>
> Subject: [bitbake-devel][PATCH v2 3/3] crate.py: authorize crate url with parameters
> 
> From: Frederic Martinsons <frederic.martinsons@gmail.com>
> 
> This allow to have classic fetch parameters
> (like destsuffix, sha256, name ...) not being
> considered by crate fetcher itself (and so mess
> up its download)
> 
> Moreover, it allow to overload the name of the downloaded
> crate (maybe usefull if there is a naming clash between
> two crates coming from different repositories)
> 
> Signed-off-by: Frederic Martinsons <frederic.martinsons@gmail.com>
> ---
>  lib/bb/fetch2/crate.py |  9 ++++++---
>  lib/bb/tests/fetch.py  | 24 ++++++++++++++++++++++++
>  2 files changed, 30 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/bb/fetch2/crate.py b/lib/bb/fetch2/crate.py
> index f8367ed3..590dc9c1 100644
> --- a/lib/bb/fetch2/crate.py
> +++ b/lib/bb/fetch2/crate.py
> @@ -56,8 +56,10 @@ class Crate(Wget):
>          if len(parts) < 5:
>              raise bb.fetch2.ParameterError("Invalid URL: Must be crate://HOST/NAME/VERSION", ud.url)
> 
> -        # last field is version
> -        version = parts[len(parts) - 1]
> +        # version is expected to be the last token
> +        # but ignore possible url parameters which will be used
> +        # by the top fetcher class
> +        version, _, _ = parts[len(parts) -1].partition(";")
>          # second to last field is name
>          name = parts[len(parts) - 2]
>          # host (this is to allow custom crate registries to be specified
> @@ -69,7 +71,8 @@ class Crate(Wget):
> 
>          ud.url = "https://%s/%s/%s/download" % (host, name, version)
>          ud.parm['downloadfilename'] = "%s-%s.crate" % (name, version)
> -        ud.parm['name'] = name
> +        if 'name' not in ud.parm:
> +            ud.parm['name'] = name
> 
>          logger.debug2("Fetching %s to %s" % (ud.url, ud.parm['downloadfilename']))
> 
> diff --git a/lib/bb/tests/fetch.py b/lib/bb/tests/fetch.py
> index fd089bc8..85cf25e7 100644
> --- a/lib/bb/tests/fetch.py
> +++ b/lib/bb/tests/fetch.py
> @@ -2423,6 +2423,30 @@ class CrateTest(FetcherTest):
>          self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/time-0.1.35/.cargo-checksum.json"))
>          self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/time-0.1.35/src/lib.rs"))
> 
> +    @skipIfNoNetwork()
> +    def test_crate_url_params(self):
> +
> +        uri = "crate://crates.io/aho-corasick/0.7.20;name=aho-corasick-renamed"
> +        self.d.setVar('SRC_URI', uri)
> +
> +        uris = self.d.getVar('SRC_URI').split()
> +        d = self.d
> +
> +        fetcher = bb.fetch2.Fetch(uris, self.d)
> +        ud = fetcher.ud[fetcher.urls[0]]
> +
> +        self.assertIn("name", ud.parm)
> +        self.assertEqual(ud.parm["name"], "aho-corasick-renamed")
> +        self.assertIn("downloadfilename", ud.parm)
> +        self.assertEqual(ud.parm["downloadfilename"], "aho-corasick-0.7.20.crate")
> +
> +        fetcher.download()
> +        fetcher.unpack(self.tempdir)
> +        self.assertEqual(sorted(os.listdir(self.tempdir)), ['cargo_home', 'download' , 'unpacked'])
> +        self.assertEqual(sorted(os.listdir(self.tempdir + "/download")), ['aho-corasick-0.7.20.crate', 'aho-corasick-0.7.20.crate.done'])
> +        self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/aho-corasick-0.7.20/.cargo-checksum.json"))
> +        self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/aho-corasick-0.7.20/src/lib.rs"))
> +
>      @skipIfNoNetwork()
>      def test_crate_incorrect_cksum(self):
>          uri = "crate://crates.io/aho-corasick/0.7.20"
> --
> 2.34.1
Richard Purdie April 6, 2023, 8:42 a.m. UTC | #2
On Thu, 2023-04-06 at 03:40 +0000, Peter Kjellerstedt wrote:
> Please cherry-pick this to Kirkstone and Langdale so that they can read 
> updated recipes that use crate:// URIs with parameters.
> 
> I assume it should be ok to cherry-pick part one of this series too, as 
> long as you do not cherry-pick part two, as it would be a breaking change.

If we do this does this mean we're committing to forwards
compatibility? I'm not sure I like that precedent...

Cheers,

Richard
Peter Kjellerstedt April 6, 2023, 10:56 a.m. UTC | #3
> -----Original Message-----
> From: Richard Purdie <richard.purdie@linuxfoundation.org>
> Sent: den 6 april 2023 10:43
> To: Peter Kjellerstedt <peter.kjellerstedt@axis.com>; Steve Sakoman
> <steve@sakoman.com>
> Cc: Frederic Martinsons <frederic.martinsons@gmail.com>; bitbake-
> devel@lists.openembedded.org
> Subject: Re: [bitbake-devel][PATCH v2 3/3] crate.py: authorize crate url
> with parameters
> 
> On Thu, 2023-04-06 at 03:40 +0000, Peter Kjellerstedt wrote:
> > Please cherry-pick this to Kirkstone and Langdale so that they can read
> > updated recipes that use crate:// URIs with parameters.
> >
> > I assume it should be ok to cherry-pick part one of this series too, as
> > long as you do not cherry-pick part two, as it would be a breaking
> change.
> 
> If we do this does this mean we're committing to forwards compatibility? 
> I'm not sure I like that precedent...

While not a requirement, I sure hope we can strive for forward compatibility 
where it does not impact the older branches negatively. At least in cases 
where it affects parsability or involves parts that are hard to override 
in a higher layer.

The problem for me in this case is that Mickledore now requires that all 
URIs have a checksum, which basically requires that parameters are used 
for the crate:// URIs since it is quite common that recipes depend on 
multiple versions of the same crate and thus requires the name= parameter. 
At the same time the crate fetcher in Kirkstone and Langdale will fail 
if any parameters are specified for the URIs. This means it is not possible 
to use the same version of the generated crates.inc files, which causes 
a lot of maintenance burden.

It is also very hard to modify the crate fetcher without actually modifying 
OE-Core. At least I find my Python-fu lacking in regards to how I can 
monkeypatch the fetcher to use a modified version of crate.py.

On the other, it is trivial for you to backport this patch to the two 
branches in OE-Core. And as long as the second patch in the series (which 
requires that checksums are used) is not backported, I cannot see that it 
should have any negative impact.

> 
> Cheers,
> 
> Richard

//Peter
Richard Purdie April 6, 2023, 11:12 a.m. UTC | #4
On Thu, 2023-04-06 at 10:56 +0000, Peter Kjellerstedt wrote:
> > -----Original Message-----
> > From: Richard Purdie <richard.purdie@linuxfoundation.org>
> > Sent: den 6 april 2023 10:43
> > To: Peter Kjellerstedt <peter.kjellerstedt@axis.com>; Steve Sakoman
> > <steve@sakoman.com>
> > Cc: Frederic Martinsons <frederic.martinsons@gmail.com>; bitbake-
> > devel@lists.openembedded.org
> > Subject: Re: [bitbake-devel][PATCH v2 3/3] crate.py: authorize crate url
> > with parameters
> > 
> > On Thu, 2023-04-06 at 03:40 +0000, Peter Kjellerstedt wrote:
> > > Please cherry-pick this to Kirkstone and Langdale so that they can read
> > > updated recipes that use crate:// URIs with parameters.
> > > 
> > > I assume it should be ok to cherry-pick part one of this series too, as
> > > long as you do not cherry-pick part two, as it would be a breaking
> > change.
> > 
> > If we do this does this mean we're committing to forwards compatibility? 
> > I'm not sure I like that precedent...
> 
> While not a requirement, I sure hope we can strive for forward compatibility 
> where it does not impact the older branches negatively. At least in cases 
> where it affects parsability or involves parts that are hard to override 
> in a higher layer.

The trouble is I take this patch, then next time something breaks you
tell me "in the past such changes were only made so that this didn't
break things" and quote it as precedent.

I worry a lot about people relying upon us doing this as it isn't a
guarantee we've ever made.

> The problem for me in this case is that Mickledore now requires that all 
> URIs have a checksum, which basically requires that parameters are used 
> for the crate:// URIs since it is quite common that recipes depend on
> multiple versions of the same crate and thus requires the name= parameter. 
> At the same time the crate fetcher in Kirkstone and Langdale will fail 
> if any parameters are specified for the URIs. This means it is not possible 
> to use the same version of the generated crates.inc files, which causes 
> a lot of maintenance burden.

I understand the problem but you're effectively asking we would always
do this going forward too :/.

> It is also very hard to modify the crate fetcher without actually modifying 
> OE-Core. At least I find my Python-fu lacking in regards to how I can
> monkeypatch the fetcher to use a modified version of crate.py.
> 
> On the other, it is trivial for you to backport this patch to the two
> branches in OE-Core. And as long as the second patch in the series (which 
> requires that checksums are used) is not backported, I cannot see that it 
> should have any negative impact.

This change alone is fine. The behaviour where people expect older
layers to always work with newer code changes is what worries me, a
lot. We have done things to make this happen before and I'm not sure it
is good to continue the expectation.

Cheers,

Richard
diff mbox series

Patch

diff --git a/lib/bb/fetch2/crate.py b/lib/bb/fetch2/crate.py
index f8367ed3..590dc9c1 100644
--- a/lib/bb/fetch2/crate.py
+++ b/lib/bb/fetch2/crate.py
@@ -56,8 +56,10 @@  class Crate(Wget):
         if len(parts) < 5:
             raise bb.fetch2.ParameterError("Invalid URL: Must be crate://HOST/NAME/VERSION", ud.url)
 
-        # last field is version
-        version = parts[len(parts) - 1]
+        # version is expected to be the last token
+        # but ignore possible url parameters which will be used
+        # by the top fetcher class
+        version, _, _ = parts[len(parts) -1].partition(";")
         # second to last field is name
         name = parts[len(parts) - 2]
         # host (this is to allow custom crate registries to be specified
@@ -69,7 +71,8 @@  class Crate(Wget):
 
         ud.url = "https://%s/%s/%s/download" % (host, name, version)
         ud.parm['downloadfilename'] = "%s-%s.crate" % (name, version)
-        ud.parm['name'] = name
+        if 'name' not in ud.parm:
+            ud.parm['name'] = name
 
         logger.debug2("Fetching %s to %s" % (ud.url, ud.parm['downloadfilename']))
 
diff --git a/lib/bb/tests/fetch.py b/lib/bb/tests/fetch.py
index fd089bc8..85cf25e7 100644
--- a/lib/bb/tests/fetch.py
+++ b/lib/bb/tests/fetch.py
@@ -2423,6 +2423,30 @@  class CrateTest(FetcherTest):
         self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/time-0.1.35/.cargo-checksum.json"))
         self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/time-0.1.35/src/lib.rs"))
 
+    @skipIfNoNetwork()
+    def test_crate_url_params(self):
+
+        uri = "crate://crates.io/aho-corasick/0.7.20;name=aho-corasick-renamed"
+        self.d.setVar('SRC_URI', uri)
+
+        uris = self.d.getVar('SRC_URI').split()
+        d = self.d
+
+        fetcher = bb.fetch2.Fetch(uris, self.d)
+        ud = fetcher.ud[fetcher.urls[0]]
+
+        self.assertIn("name", ud.parm)
+        self.assertEqual(ud.parm["name"], "aho-corasick-renamed")
+        self.assertIn("downloadfilename", ud.parm)
+        self.assertEqual(ud.parm["downloadfilename"], "aho-corasick-0.7.20.crate")
+
+        fetcher.download()
+        fetcher.unpack(self.tempdir)
+        self.assertEqual(sorted(os.listdir(self.tempdir)), ['cargo_home', 'download' , 'unpacked'])
+        self.assertEqual(sorted(os.listdir(self.tempdir + "/download")), ['aho-corasick-0.7.20.crate', 'aho-corasick-0.7.20.crate.done'])
+        self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/aho-corasick-0.7.20/.cargo-checksum.json"))
+        self.assertTrue(os.path.exists(self.tempdir + "/cargo_home/bitbake/aho-corasick-0.7.20/src/lib.rs"))
+
     @skipIfNoNetwork()
     def test_crate_incorrect_cksum(self):
         uri = "crate://crates.io/aho-corasick/0.7.20"