diff mbox series

lib/configfragments: match fragment prefixes rather than full fragment names when disabling fragments

Message ID 20251128182713.4148461-1-alex.kanavin@gmail.com
State New
Headers show
Series lib/configfragments: match fragment prefixes rather than full fragment names when disabling fragments | expand

Commit Message

Alexander Kanavin Nov. 28, 2025, 6:27 p.m. UTC
From: Alexander Kanavin <alex@linutronix.de>

This allows disabling classes of fragments without knowing their full names, e.g.
instead of

$ bitbake-config-build disable-fragment machine/qemuarm

one can issue

$ bitbake-config-build disable-fragment machine

to match and disable everything that starts with 'machine'.

Add an --exact option to preserve exact maching (e.g. when
theres some/feature and some/feature-with-foobar both enabled
and only the first needs to be disabled).

Signed-off-by: Alexander Kanavin <alex@linutronix.de>
---
 meta/lib/bbconfigbuild/configfragments.py | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

Comments

Gyorgy Sarvari Nov. 29, 2025, 7:24 a.m. UTC | #1
On 11/28/25 19:27, Alexander Kanavin via lists.openembedded.org wrote:
> From: Alexander Kanavin <alex@linutronix.de>
>
> This allows disabling classes of fragments without knowing their full names, e.g.
> instead of
>
> $ bitbake-config-build disable-fragment machine/qemuarm
>
> one can issue
>
> $ bitbake-config-build disable-fragment machine
>
> to match and disable everything that starts with 'machine'.
>
> Add an --exact option to preserve exact maching (e.g. when
> theres some/feature and some/feature-with-foobar both enabled
> and only the first needs to be disabled).

Why not add a --wildcard option instead, and keep the default behavior
backwards compatible?

> Signed-off-by: Alexander Kanavin <alex@linutronix.de>
> ---
>  meta/lib/bbconfigbuild/configfragments.py | 18 +++++++++++-------
>  1 file changed, 11 insertions(+), 7 deletions(-)
>
> diff --git a/meta/lib/bbconfigbuild/configfragments.py b/meta/lib/bbconfigbuild/configfragments.py
> index de521f0c149..f5b4dfe1ec2 100644
> --- a/meta/lib/bbconfigbuild/configfragments.py
> +++ b/meta/lib/bbconfigbuild/configfragments.py
> @@ -161,16 +161,19 @@ class ConfigFragmentsPlugin(LayerPlugin):
>          def disable_helper(varname, origvalue, op, newlines):
>              enabled_fragments = origvalue.split()
>              for f in args.fragmentname:
> -                if f in enabled_fragments:
> -                    enabled_fragments.remove(f)
> -                else:
> -                    print("Fragment {} not currently enabled in {}".format(f, args.confpath))
> +                for e in enabled_fragments[:]:
> +                    if (not args.exact and e.startswith(f)) or f==e:
> +                        print("Removing fragment {} from {}".format(e, args.confpath))
> +                        enabled_fragments.remove(e)
>              return " ".join(enabled_fragments), None, 0, True
>  
>          self.create_conf(args.confpath)
>          modified = bb.utils.edit_metadata_file(args.confpath, ["OE_FRAGMENTS"], disable_helper)
> -        if modified:
> -            print("Fragment {} removed from {}.".format(", ".join(args.fragmentname), args.confpath))
> +        if not modified:
> +            if args.exact:
> +                print("Fragment names {} matched nothing in {}.".format(", ".join(args.fragmentname), args.confpath))
> +            else:
> +                print("Fragment prefixes {} matched nothing in {}.".format(", ".join(args.fragmentname), args.confpath))
>  
>      def do_show_fragment(self, args):
>          """ Show the content of a fragment """
> @@ -210,7 +213,8 @@ class ConfigFragmentsPlugin(LayerPlugin):
>  
>          parser_disable_fragment = self.add_command(sp, 'disable-fragment', self.do_disable_fragment, parserecipes=False)
>          parser_disable_fragment.add_argument("--confpath", default=default_confpath, help='Configuration file which contains a list of enabled fragments (default is {}).'.format(default_confpath))
> -        parser_disable_fragment.add_argument('fragmentname', help='The name of the fragment', nargs='+')
> +        parser_disable_fragment.add_argument('--exact', action='store_true', help='Match fragment names exactly')
> +        parser_disable_fragment.add_argument('fragmentname', help='The name of the fragment, or a name prefix to match', nargs='+')
>  
>          parser_show_fragment = self.add_command(sp, 'show-fragment', self.do_show_fragment, parserecipes=False)
>          parser_show_fragment.add_argument('fragmentname', help='The name of the fragment')
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#226921): https://lists.openembedded.org/g/openembedded-core/message/226921
> Mute This Topic: https://lists.openembedded.org/mt/116517046/6084445
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [skandigraun@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Alexander Kanavin Nov. 29, 2025, 9:59 a.m. UTC | #2
On Sat, 29 Nov 2025 at 08:25, Gyorgy Sarvari <skandigraun@gmail.com> wrote:
> > This allows disabling classes of fragments without knowing their full names, e.g.
> > instead of
> >
> > $ bitbake-config-build disable-fragment machine/qemuarm
> >
> > one can issue
> >
> > $ bitbake-config-build disable-fragment machine
> >
> > to match and disable everything that starts with 'machine'.
> >
> > Add an --exact option to preserve exact maching (e.g. when
> > theres some/feature and some/feature-with-foobar both enabled
> > and only the first needs to be disabled).
>
> Why not add a --wildcard option instead, and keep the default behavior
> backwards compatible?

I considered this, but I tohught most people would prefer prefix
matching to be the default, it's just more convenient. Fragments are
still very new, and situations where --exact is necessary are rare.

This will be discussed in patch review. If preserving behaviour is the
outcome, I wouldn't add an option (that no one would know about), it
would be a separate command: disable-by-prefix.

Alex
Richard Purdie Nov. 29, 2025, 12:36 p.m. UTC | #3
On Sat, 2025-11-29 at 10:59 +0100, Alexander Kanavin via lists.openembedded.org wrote:
> On Sat, 29 Nov 2025 at 08:25, Gyorgy Sarvari <skandigraun@gmail.com> wrote:
> > > This allows disabling classes of fragments without knowing their full names, e.g.
> > > instead of
> > > 
> > > $ bitbake-config-build disable-fragment machine/qemuarm
> > > 
> > > one can issue
> > > 
> > > $ bitbake-config-build disable-fragment machine
> > > 
> > > to match and disable everything that starts with 'machine'.
> > > 
> > > Add an --exact option to preserve exact maching (e.g. when
> > > theres some/feature and some/feature-with-foobar both enabled
> > > and only the first needs to be disabled).
> > 
> > Why not add a --wildcard option instead, and keep the default behavior
> > backwards compatible?
> 
> I considered this, but I tohught most people would prefer prefix
> matching to be the default, it's just more convenient. Fragments are
> still very new, and situations where --exact is necessary are rare.
> 
> This will be discussed in patch review. If preserving behaviour is the
> outcome, I wouldn't add an option (that no one would know about), it
> would be a separate command: disable-by-prefix.

Perhaps the compromise is to support:

bitbake-config-build disable-fragment machine/

i.e. the prefix matching only triggers if the / is at the end?

That is perhaps relatively explicit/intuitive enough?

Cheers,

Richard
Alexander Kanavin Nov. 29, 2025, 1:20 p.m. UTC | #4
On Sat, 29 Nov 2025 at 13:36, Richard Purdie
<richard.purdie@linuxfoundation.org> wrote:
> > I considered this, but I tohught most people would prefer prefix
> > matching to be the default, it's just more convenient. Fragments are
> > still very new, and situations where --exact is necessary are rare.
> >
> > This will be discussed in patch review. If preserving behaviour is the
> > outcome, I wouldn't add an option (that no one would know about), it
> > would be a separate command: disable-by-prefix.
>
> Perhaps the compromise is to support:
>
> bitbake-config-build disable-fragment machine/
>
> i.e. the prefix matching only triggers if the / is at the end?
>
> That is perhaps relatively explicit/intuitive enough?

Yep, I'll send a v2.

Alex
diff mbox series

Patch

diff --git a/meta/lib/bbconfigbuild/configfragments.py b/meta/lib/bbconfigbuild/configfragments.py
index de521f0c149..f5b4dfe1ec2 100644
--- a/meta/lib/bbconfigbuild/configfragments.py
+++ b/meta/lib/bbconfigbuild/configfragments.py
@@ -161,16 +161,19 @@  class ConfigFragmentsPlugin(LayerPlugin):
         def disable_helper(varname, origvalue, op, newlines):
             enabled_fragments = origvalue.split()
             for f in args.fragmentname:
-                if f in enabled_fragments:
-                    enabled_fragments.remove(f)
-                else:
-                    print("Fragment {} not currently enabled in {}".format(f, args.confpath))
+                for e in enabled_fragments[:]:
+                    if (not args.exact and e.startswith(f)) or f==e:
+                        print("Removing fragment {} from {}".format(e, args.confpath))
+                        enabled_fragments.remove(e)
             return " ".join(enabled_fragments), None, 0, True
 
         self.create_conf(args.confpath)
         modified = bb.utils.edit_metadata_file(args.confpath, ["OE_FRAGMENTS"], disable_helper)
-        if modified:
-            print("Fragment {} removed from {}.".format(", ".join(args.fragmentname), args.confpath))
+        if not modified:
+            if args.exact:
+                print("Fragment names {} matched nothing in {}.".format(", ".join(args.fragmentname), args.confpath))
+            else:
+                print("Fragment prefixes {} matched nothing in {}.".format(", ".join(args.fragmentname), args.confpath))
 
     def do_show_fragment(self, args):
         """ Show the content of a fragment """
@@ -210,7 +213,8 @@  class ConfigFragmentsPlugin(LayerPlugin):
 
         parser_disable_fragment = self.add_command(sp, 'disable-fragment', self.do_disable_fragment, parserecipes=False)
         parser_disable_fragment.add_argument("--confpath", default=default_confpath, help='Configuration file which contains a list of enabled fragments (default is {}).'.format(default_confpath))
-        parser_disable_fragment.add_argument('fragmentname', help='The name of the fragment', nargs='+')
+        parser_disable_fragment.add_argument('--exact', action='store_true', help='Match fragment names exactly')
+        parser_disable_fragment.add_argument('fragmentname', help='The name of the fragment, or a name prefix to match', nargs='+')
 
         parser_show_fragment = self.add_command(sp, 'show-fragment', self.do_show_fragment, parserecipes=False)
         parser_show_fragment.add_argument('fragmentname', help='The name of the fragment')