PoolItem candidateObj() const
{
PoolItem ret( transactingCandidate() );
- if ( ret )
- return ret;
- return _candidate ? _candidate : defaultCandidate();
+ if ( ! ret )
+ ret = _candidate ? _candidate : defaultCandidate();
+ return ret;
}
/** Set a userCandidate (out of available objects).
{
for ( const PoolItem & pi : available() )
{
+ if ( pi.isRetracted() )
+ continue;
if ( pi.repository() == repo_r )
return pi;
}
// multiversionInstall: This returns the candidate for the last
// instance installed. Actually we'd need a list here.
- if ( installedEmpty() || ! defaultCand )
+ if ( ! defaultCand || defaultCand.isRetracted() )
+ return PoolItem();
+
+ if ( installedEmpty() )
return defaultCand;
// Here: installed and defaultCand are non NULL and it's not a
// multiversion install.
PoolItem highestAvailableVersionObj() const
{
PoolItem ret;
+ bool retractedOk = false;
for ( const PoolItem & pi : available() )
{
+ if ( !retractedOk && pi.isRetracted() )
+ {
+ if ( ret )
+ break; // prefer a not retracted candidate
+ retractedOk = true;
+ }
if ( !ret || pi.edition() > ret.edition() )
ret = pi;
}
////////////////////////////////////////////////////////////////////////
+ bool hasRetracted() const
+ { return !_availableItems.empty() && _availableItems.rbegin()->isRetracted(); }
+
+ bool hasRetractedInstalled() const
+ {
+ bool ret = false;
+ if ( hasRetracted() )
+ {
+ for ( const PoolItem & ipi : installed() )
+ {
+ PoolItem pi { identicalAvailableObj( ipi ) };
+ if ( pi && pi.isRetracted() )
+ {
+ ret = true;
+ break;
+ }
+ }
+ }
+ return ret;
+// later if pool index is available:
+// for ( const PoolItem & pi : installed() )
+// if ( pi.isRetracted() )
+// return true;
+// return false;
+ }
+
bool isUnmaintained() const
{ return availableEmpty(); }