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