| 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 |
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] > -=-=-=-=-=-=-=-=-=-=-=- >
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
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
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 --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')