[pacman-dev] [PATCH] Fix bug 9395 by allowing pacman to remove unresolvable packages from a transaction

Bryan Ischo bji-keyword-pacman.3644cb at www.ischo.com
Tue Jan 13 15:05:36 EST 2009

Nagy Gabor wrote:
> Oh, I see that I totally misinterpreted something here. If we allow 
> pacman to remove targets from the list, we cannot get any unresolved 
> dependencies, right? So just forget what I said earlier. (But problem 
> [1] is still interesting.) But your method for collecting unresolvable 
> dependencies is still not good. Just put the dependency into data list 
> when it turns out that the dependency (locally) not resolvable. (When 
> resolvedep returns with NULL.) This should be identical to the old 
> behavior, if user doesn't let pacman remove targets. If user resolve 
> this problem by removing some targets, you can free this list.

Yes, the technique that I use removes all unresolvable dependencies from 
the list altogether; the effect is as if the user hadn't actually 
requested that any packages be upgraded which could not be resolved, and 
so the remaining list is 'clean' of unresolvable dependencies.

I don't think the simplification you propose will work.  What if we have:

packageA-1.0-1 depends on packageB-1.0-1
packageB-1.01 depends on packageC-1.0-1

User has packageC in their IgnorePkg list.

User does pacman -S packageA and new packages are available:

packageA-2.0-1 depends on packageB-2.0-1
packageB-2.0-1 depends on packageC-2.0-1

The resolve for packageA looks for packageB-2.0-1 and finds it.  The 
resolve for packageB-2.0-1 looks for packageC-2.0-1 but *does not* find 
it because packageC is in the IgnorePkg list.

Now with my change, the resolve step will determine that packageA and 
packageB cannot be installed due to missing dependencies, and will 
prompt the user to ask if they want to remove packageA from the 
transaction.  If they say that they do, it removes packageA and all 
packages which it depends on (except those packages which are also 
depended on by packages that are remaining in the transaction, which in 
this example, is none), which is packageA and packageB.  If they say 
they do not, then it returns an error in the same way that the 
pre-existing code returned an error at the moment that the unresolvable 
packages was detected.

What you are suggesting, I think, is that we simply put packageC on a 
separate list of unresolvable packages, and then at the end, ask the 
user some question (I'm not sure exactly what question since you're not 
keeping track of which top-level packages are unresolvable - probably 
you'd ask "packageC is not resolvable, remove from transaction?", which 
I think would be confusing, since the user never said anything about 
packageC), and if they want to remove unresolvable packages, just remove 
packageC from the transaction.  However, you're then left with a 
transaction including packageA and packageB, which *cannot* be 
completed, because packageB has an unresolvable dependency.

Did I understand your suggestion correctly?

Let me try to explain the algorithm and data structures I am using, it 
may help clear up confusion.  But first, here's the old algorithm:

- While resolving dependencies, if a required package is found to be in 
IgnorePkg, then prompt the user to see if they want to include the 
package in this transaction anyway
- If they did not, then consider the dependency to be unresolvable
- If they did, then put the package in the transaction and proceed as if 
it wasn't ever in IgnorePkg
- Any unresolvable package immediately fails the resolve step and returns 1

Now here's my algorithm:

- While resolving dependencies, if a required package is found to be in 
IgnorePkg, or otherwise cannot be found, then keep this information in 
an internal dependency graph but don't ask the user anything, just 
proceed to the end of the resolve step
- At the end of the resolve step, if any packages were not resolvable, 
compute which top-level packages were unresolvable (which could be due 
to any package in their dependency subtree being unresolvable)
- Ask the user if they want to remove these unresolvable top-level 
packages from the transaction
- If they do, remove the unresolvable top-level packages and all of 
their dependencies from the transaction (except for those dependencies 
which were also required by a resolvable top-level package too), and 
return a success code from the resolve step
- If they do not, fail the resolve step by returning 1

The data structures are:

- Well there's only one really.  It's a structure holding the 
"back-pointers" from packages to the packages which depend on them.  It 
also holds a few values which are computed during the resolve operation.

It's possible that what I'm trying to do could be done in a simpler way; 
but I don't think that your suggestion accomplishes that.  I think the 
part you might be missing is the case where there is a deep dependency 
chain and only the bottom package cannot be resolved; there has to be 
some way to detect that all packages which depend on this package also 
cannot be resolved.


More information about the pacman-dev mailing list