[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gentoo-dev
Subject:    Re: [gentoo-dev] REQUIRED_USE, global USE flags, user-friendliness...
From:       Daniel Campbell <zlg () gentoo ! org>
Date:       2017-01-30 11:59:32
Message-ID: 99c998a9-98e4-d88f-2065-18156d2d0102 () gentoo ! org
[Download RAW message or body]

[Attachment #2 (multipart/mixed)]


On 01/27/2017 12:51 PM, NP-Hardass wrote:
> On 01/27/2017 12:25 PM, Michael Orlitzky wrote:
>> Forked from the gdbm/berkdb thread, wall of text ensues...
>>
>>
>> On 01/27/2017 03:32 AM, Fabian Groffen wrote:
>>>
>>> You mention REQUIRED_USE should be used sparingly, I think I see your
>>> reasoning, but if so, then why did we add it in the first place?
>>
>> There are a few conflicting interests at play. Before REQUIRED_USE, we
>> would have a bunch of checks in pkg_pretend() to test if the user's
>> configuration was invalid. If it was, we could output a nice explanation
>> and tell him to try again. But, bash code in pkg_pretend can't be
>> understood by the package manager, and requires execution to determine
>> if a package can be installed. So we got REQUIRED_USE, which fixes those
>> problems, and introduces a new one: no one knows WTF to do when portage
>> outputs a REQUIRED_USE error. Now you get what looks like a core dump of
>> the dependency graph instead of "this package only uses one database, so
>> pick either mysql or sqlite."
>>
>> Both approaches have another problem: USE flag constraints on packages
>> simply don't work with global USE flags. Global USE flags don't work
>> that well to begin with, since the same flag means different things to
>> each package (and the fact that they're global means "enable foo" is all
>> we get for documentation). Regardless, when you have 100 flags enabled
>> globally and start installing thousands of packages with USE
>> constraints, you're eventually going to get to a point where everything
>> has conflicting requirements and you need to switch to package.use to
>> sort it all out.
>>
>> Both pkg_pretend and REQUIRED_USE have that problem and try to solve it
>> in different ways. If you don't care about machine-readability, then in
>> pkg_pretend you could try to choose "the best" of two conflicting flags
>> and just silently go with it. There are a lot of problems with that,
>> like what happens if you need to add a conditional dependency on those
>> flags (you can't change DEPEND in pkg_pretend). With REQUIRED_USE, you
>> instead need to set IUSE defaults to get it to do something without user
>> interaction, but the tricks that you can do with IUSE don't solve every
>> REQUIRED_USE conflict. In the harder cases, you can try to figure out
>> what to do on behalf of the user in the ebuild, but then you're right
>> back to the same set of problems that you had with pkg_pretend, because
>> the decision is being made in code and not in metadata/flags.
>>
>> I think a slow migration away from global USE flags is the only way out
>> of the jam. We get better USE flag docs for free, and no REQUIRED_USE
>> conflicts that the user didn't cause himself. We could probably also get
>> rid of a lot of IUSE defaults that serve only to undo various profile
>> defaults. It would be annoying at first, but once a few critical profile
>> defaults are moved into package.use, better.
>>
> 
> I might be wrong, but my suspicion is that those that advocate for
> pkg_pretend over REQUIRED_USE tend to do so because of the blocking
> nature of REQUIRED_USE's current implementation rather than the
> construct of describing USE flag inter-dependencies itself.
> 
> So, personally, I think that we should be discussing ways of adding
> interactivity to the package manager for resolution of REQUIRED_USE
> conflicts rather than discussing ways to work around or remove it.  It's
> a good construct, we should take advantage of it, and work to make it
> more user friendly.
> 
> My initial feeling is having flags, one for interactive handling, one
> for current behavior.  Interactive has two modes, like --autounmask and
> --autounmask-write (and could even reuse these if possible), which does
> something similar to how Debian's apt handles dependency conflicts by
> calculating the alternatives and prompting the user to select a numbered
> option.  So the autounmask equivalent displays the changes to the config
> files and the autounmask-write equivalent writes them to the appropriate
> config files.  This is just a general idea that I just came up with
> right now, so I haven't put too much thought into it.  It is mostly
> meant to get solutions for interactive handling discussed on the ML.
> 
This is a fantastic idea. We need some way to handle it. Something like
ewarn/einfo to tell the user REQUIRED_USE has been triggered (and why),
but (depending on flags) then use the default or prompt for a selection.

To do this, we'd need a) a message to prompt the user with, b) a way to
convey and listen to choices, and c) a way to default to one of the
given choices in "automatic" or unattended merges.

A good portion of the information is already in the ebuilds. We have
IUSE for default flag state and REQUIRED_USE to show us which flags are
conflicting. The description for the USE flags can be gleaned from
metadata.xml or the profile's package.use.desc.

So the hard part is: how do we glue this together?
-- 
Daniel Campbell - Gentoo Developer
OpenPGP Key: 0x1EA055D6 @ hkp://keys.gnupg.net
fpr: AE03 9064 AE00 053C 270C  1DE4 6F7A 9091 1EA0 55D6


["signature.asc" (application/pgp-signature)]

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic