#
SET(LIBZYPP_MAJOR "17")
SET(LIBZYPP_COMPATMINOR "20")
-SET(LIBZYPP_MINOR "20")
+SET(LIBZYPP_MINOR "21")
SET(LIBZYPP_PATCH "0")
#
-# LAST RELEASED: 17.20.0 (20)
+# LAST RELEASED: 17.21.0 (20)
# (The number in parenthesis is LIBZYPP_COMPATMINOR)
#=======
-------------------------------------------------------------------
+Mon Jan 20 12:53:12 CET 2020 - ma@suse.de
+
+- Selectable: Fix highestAvailableVersionObj if only retracted
+ packages are available. Avoid using retracted items as candidate
+ (jira#SLE-8905)
+- version 17.21.0 (20)
+
+-------------------------------------------------------------------
Thu Dec 19 13:28:00 CET 2019 - ma@suse.de
- BuildRequires: libsolv-devel >= 0.7.10.
"Project-Id-Version: zypp.fi\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-12-05 14:22+0100\n"
-"PO-Revision-Date: 2019-04-09 16:45+0000\n"
+"PO-Revision-Date: 2020-01-13 19:59+0000\n"
"Last-Translator: Tommi Nieminen <software@legisign.org>\n"
"Language-Team: Finnish <https://l10n.opensuse.org/projects/libzypp/master/fi/"
">\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.3\n"
+"X-Generator: Weblate 3.6.1\n"
#. dubious: Throw on malformed known types, otherwise log a warning.
#: zypp/CheckSum.cc:136
#: zypp/solver/detail/SATResolver.cc:1386
#, boost-format
msgid "install %1% although it has been retracted"
-msgstr ""
+msgstr "asenna %1%, vaikka se on vedetty takaisin"
#. translator: %1% is a package name
#: zypp/solver/detail/SATResolver.cc:1389
#, boost-format
msgid "allow to install the PTF %1%"
-msgstr ""
+msgstr "salli asentaa PTF %1%"
#. translator: %1% is a package name
#: zypp/solver/detail/SATResolver.cc:1392
#, boost-format
msgid "install %1% although it is blacklisted"
-msgstr ""
+msgstr "asenna %1%, vaikka se on mustalistattu"
#: zypp/solver/detail/SATResolver.cc:1412
#, c-format, boost-format
"Project-Id-Version: YaST (@memory@)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-12-05 14:22+0100\n"
-"PO-Revision-Date: 2019-04-18 16:03+0000\n"
+"PO-Revision-Date: 2020-01-16 14:53+0000\n"
"Last-Translator: Kukuh Syafaat <syafaatkukuh@gmail.com>\n"
"Language-Team: Indonesian <https://l10n.opensuse.org/projects/libzypp/master/"
"id/>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.3\n"
+"X-Generator: Weblate 3.6.1\n"
#. dubious: Throw on malformed known types, otherwise log a warning.
#: zypp/CheckSum.cc:136
#: zypp/solver/detail/SATResolver.cc:1386
#, boost-format
msgid "install %1% although it has been retracted"
-msgstr ""
+msgstr "pasang %1% meskipun telah ditarik kembali"
#. translator: %1% is a package name
#: zypp/solver/detail/SATResolver.cc:1389
#, boost-format
msgid "allow to install the PTF %1%"
-msgstr ""
+msgstr "memungkinkan untuk memasang PTF %1%"
#. translator: %1% is a package name
#: zypp/solver/detail/SATResolver.cc:1392
#, boost-format
msgid "install %1% although it is blacklisted"
-msgstr ""
+msgstr "pasang %1% meskipun masuk daftar hitam"
#: zypp/solver/detail/SATResolver.cc:1412
#, c-format, boost-format
*/
CheckSum( const std::string & type, std::istream & input_r );
-#ifndef SWIG // Swig treats it as syntax error0
/** Ctor from temporary istream */
CheckSum( const std::string & type, std::istream && input_r )
: CheckSum( type, input_r )
{}
-#endif
public:
static const std::string & md5Type();
static CheckSum sha256( std::istream & input_r ) { return CheckSum( sha256Type(), input_r ); }
static CheckSum sha384( std::istream & input_r ) { return CheckSum( sha384Type(), input_r ); }
static CheckSum sha512( std::istream & input_r ) { return CheckSum( sha512Type(), input_r ); }
-#ifndef SWIG // Swig treats it as syntax error
+
static CheckSum md5( std::istream && input_r ) { return CheckSum( md5Type(), input_r ); }
static CheckSum sha( std::istream && input_r ) { return CheckSum( sha1Type(), input_r ); }
static CheckSum sha1( std::istream && input_r ) { return CheckSum( sha1Type(), input_r ); }
static CheckSum sha256( std::istream && input_r ) { return CheckSum( sha256Type(), input_r ); }
static CheckSum sha384( std::istream && input_r ) { return CheckSum( sha384Type(), input_r ); }
static CheckSum sha512( std::istream && input_r ) { return CheckSum( sha512Type(), input_r ); }
-#endif
//@}
/** \name Reads the content of \param input_r and computes the checksum. */
///////////////////////////////////////////////////////////////////
namespace zypp
-{ /////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////
- /******************************************************************
- **
- ** FUNCTION NAME : operator<<
- ** FUNCTION TYPE : std::ostream &
- */
- std::ostream & operator<<( std::ostream & str, const OnMediaLocation & obj )
+{
+ ///////////////////////////////////////////////////////////////////
+ /// \class OnMediaLocation::Impl
+ /// \brief OnMediaLocation implementation.
+ ///////////////////////////////////////////////////////////////////
+ struct OnMediaLocation::Impl
{
- return str << "[" << obj.medianr() << "]" << obj.filename()
- << "{" << obj.downloadSize() << "|" << obj.checksum() << "}";
- }
+ public:
+ Impl()
+ {}
+
+ Impl( Pathname filename_r, unsigned medianr_r )
+ : _filename { std::move(filename_r) }
+ , _medianr { medianr_r }
+ {}
+
+ Pathname _filename;
+ unsigned _medianr = 0U;
+
+ bool _optional = false;
+
+ ByteCount _downloadSize;
+ CheckSum _checksum;
+
+ ByteCount _openSize;
+ CheckSum _openChecksum;
+
+ ByteCount _zchunkHeaderSize;
+ CheckSum _zchunkHeaderChecksum;
+
+ public:
+ /** Offer default Impl. */
+ static shared_ptr<Impl> nullimpl()
+ { static shared_ptr<Impl> _nullimpl( new Impl ); return _nullimpl; }
+ private:
+ friend Impl * rwcowClone<Impl>( const Impl * rhs );
+ /** clone for RWCOW_pointer */
+ Impl * clone() const { return new Impl( *this ); }
+ };
+
+ /** \relates OnMediaLocation::Impl Stream output */
+ inline std::ostream & operator<<( std::ostream & str, const OnMediaLocation::Impl & obj )
+ { return str << "[" << obj._medianr << "]" << obj._filename << "{" << obj._downloadSize << "|" << obj._checksum << "}"; }
+
+ /** \relates OnMediaLocation::Impl Verbose stream output */
+ inline std::ostream & dumpOn( std::ostream & str, const OnMediaLocation::Impl & obj )
+ { return str << obj; }
+
+ ///////////////////////////////////////////////////////////////////
+ // CLASS NAME : OnMediaLocation
+ ///////////////////////////////////////////////////////////////////
+
+ OnMediaLocation::OnMediaLocation()
+ : _pimpl( Impl::nullimpl() )
+ {}
+
+ OnMediaLocation::OnMediaLocation( Pathname filename_r, unsigned medianr_r )
+ : _pimpl( new Impl( std::move(filename_r), medianr_r ) )
+ {}
+
+ OnMediaLocation::~OnMediaLocation()
+ {}
+
+
+ const Pathname & OnMediaLocation::filename() const
+ { return _pimpl->_filename; }
+
+ unsigned OnMediaLocation::medianr() const
+ { return _pimpl->_medianr; }
+
+ OnMediaLocation & OnMediaLocation::setLocation( Pathname filename_r, unsigned medianr_r )
+ { _pimpl->_filename = std::move(filename_r); _pimpl->_medianr = medianr_r; return *this; }
+
+ OnMediaLocation & OnMediaLocation::unsetLocation()
+ { _pimpl->_filename = Pathname(); _pimpl->_medianr = 0; return *this; }
+
+ OnMediaLocation & OnMediaLocation::changeFilename( Pathname filename_r )
+ { _pimpl->_filename = std::move(filename_r); return *this; }
+
+ OnMediaLocation & OnMediaLocation::changeMedianr( unsigned medianr_r )
+ { _pimpl->_medianr = medianr_r; return *this; }
+
+ OnMediaLocation & OnMediaLocation::prependPath( const Pathname & prefix_r )
+ { if ( ! prefix_r.emptyOrRoot() ) changeFilename( prefix_r / filename() ); return *this; }
+
+ bool OnMediaLocation::optional() const
+ { return _pimpl->_optional; }
+
+ OnMediaLocation & OnMediaLocation::setOptional( bool val_r )
+ { _pimpl->_optional = val_r; return *this; }
+
+ const ByteCount & OnMediaLocation::downloadSize() const
+ { return _pimpl->_downloadSize; }
+
+ OnMediaLocation & OnMediaLocation::setDownloadSize( ByteCount val_r )
+ { _pimpl->_downloadSize = val_r; return *this; }
+
+ const CheckSum & OnMediaLocation::checksum() const
+ { return _pimpl->_checksum; }
+
+ OnMediaLocation & OnMediaLocation::setChecksum( CheckSum val_r )
+ { _pimpl->_checksum = val_r; return *this; }
+
+ const ByteCount & OnMediaLocation::openSize() const
+ { return _pimpl->_openSize; }
+
+ OnMediaLocation & OnMediaLocation::setOpenSize( ByteCount val_r )
+ { _pimpl->_openSize = val_r; return *this; }
+
+ const CheckSum & OnMediaLocation::openChecksum() const
+ { return _pimpl->_openChecksum; }
+
+ OnMediaLocation & OnMediaLocation::setOpenChecksum( CheckSum val_r )
+ { _pimpl->_openChecksum = val_r; return *this; }
+
+ const ByteCount & OnMediaLocation::zchunkHeaderSize() const
+ { return _pimpl->_zchunkHeaderSize; }
+
+ OnMediaLocation & OnMediaLocation::setZchunkHeaderSize( ByteCount val_r )
+ { _pimpl->_zchunkHeaderSize = val_r; return *this; }
+
+ const CheckSum & OnMediaLocation::zchunkHeaderChecksum() const
+ { return _pimpl->_zchunkHeaderChecksum; }
+
+ OnMediaLocation & OnMediaLocation::setZchunkHeaderChecksum( CheckSum val_r )
+ { _pimpl->_zchunkHeaderChecksum = val_r; return *this; }
+
+
+ std::ostream & operator<<( std::ostream & str, const OnMediaLocation & obj )
+ { return str << *obj._pimpl; }
+
+ std::ostream & dumpOn( std::ostream & str, const OnMediaLocation & obj )
+ { return dumpOn( str, *obj._pimpl ); }
-/////////////////////////////////////////////////////////////////
} // namespace zypp
///////////////////////////////////////////////////////////////////
| |
\---------------------------------------------------------------------*/
/** \file zypp/source/OnMediaLocation.h
- *
-*/
+ */
#ifndef ZYPP_SOURCE_ONMEDIALOCATION_H
#define ZYPP_SOURCE_ONMEDIALOCATION_H
#include <iosfwd>
+#include "zypp/base/PtrTypes.h"
+
#include "zypp/APIConfig.h"
#include "zypp/Pathname.h"
#include "zypp/ByteCount.h"
///////////////////////////////////////////////////////////////////
namespace zypp
-{ /////////////////////////////////////////////////////////////////
-
+{
+ ///////////////////////////////////////////////////////////////////
+ /// \class OnMediaLocation
+ /// \brief Describes a resource file located on a medium.
+ ///
+ /// Holds the path of a resource on a medium and contains additional
+ /// info required to retrieve and verify it (like media number,
+ /// checksum, size,...)
+ ///
+ /// It does not specify the \ref Url of the medium itself.
+ ///
+ /// Media number \c 0 usually indicates no media access.
///////////////////////////////////////////////////////////////////
- //
- // CLASS NAME : OnMediaLocation
- //
- /**
- * Describes a path on a certain media amongs as the information
- * required to download it, like its media number, checksum and
- * size. It does not specify the URI of the file.
- *
- * Media number \c 0 usually indicates no media access.
- *
- * \todo Implement cheap copy via COW.
- */
class OnMediaLocation
{
friend std::ostream & operator<<( std::ostream & str, const OnMediaLocation & obj );
+ friend std::ostream & dumpOn( std::ostream & str, const OnMediaLocation & obj );
public:
- /** Default ctor indicating no media access. */
- OnMediaLocation()
- : _medianr( 0 )
- , _optional(false)
- {}
-
- /** Ctor taking a filename and media number (defaults to 1). */
- OnMediaLocation( const Pathname & filename_r, unsigned medianr_r = 1 )
- : _medianr( medianr_r )
- , _filename( filename_r )
- , _optional(false) // bnc #447010
- {}
+ /** Default Ctor indicating no media access. */
+ OnMediaLocation();
- public:
- /**
- * media number where the resource is located.
- * for a url cd:// this could be 1..N.
- * for a url of type http://host/path/CD1, a media number 2
- * means looking on http://host/path/CD1/../CD2
- */
- unsigned medianr() const { return _medianr; }
- /**
- * The path to the resource relatve to the url and path.
- * If the base is http://novell.com/download/repository, the
- * resource filename could be "/repodata/repomd.xml"
- */
- const Pathname & filename() const { return _filename; }
- /**
- * the checksum of the resource
- */
- const CheckSum & checksum() const { return _checksum; }
- /**
- * The size of the resource on the server. Therefore
- * the size of the download.
- */
- const ByteCount & downloadSize() const { return _downloadsize; }
- /**
- * The size of the resource once it has been uncompressed
- * or unpacked.
- * If the file is file.txt.gz then this is the size of
- * file.txt
- */
- const ByteCount & openSize() const { return _opendownloadsize; }
- /**
- * The checksum of the resource once it has been uncompressed
- * or unpacked.
- * If the file is file.txt.gz then this is the checksum of
- * file.txt
- */
- const CheckSum & openChecksum() const { return _openchecksum; }
- /**
- * whether this is an optional resource. That is a file that
- * may not be present. This is just a hint to the resource
- * downloader to not error in case the not found resource is
- * not found.
- */
- const bool optional() const { return _optional; }
+ /** Ctor taking a \a filename_r and \a medianr_r (defaults to \c 1). */
+ OnMediaLocation( Pathname filename_r, unsigned medianr_r = 1 );
+
+ /** Dtor */
+ ~OnMediaLocation();
public:
- /** Unset \c filename and set \c medianr to \c 0. */
- OnMediaLocation & unsetLocation()
- { _filename = Pathname(); _medianr = 0; return *this; }
+ /** The path to the resource on the medium. */
+ const Pathname & filename() const;
- /** Set filename and media number (defaults to \c 1). */
- OnMediaLocation & setLocation( const Pathname & val_r,
- unsigned mediaNumber_r = 1 )
- { _filename = val_r; _medianr = mediaNumber_r; return *this; }
+ /** The media number the resource is located on. */
+ unsigned medianr() const;
- /** Set the files size. */
- OnMediaLocation & setDownloadSize( const ByteCount & val_r )
- { _downloadsize = val_r; return *this; }
- /** Set the files checksum. */
- OnMediaLocation & setChecksum( const CheckSum & val_r )
- { _checksum = val_r; return *this; }
+ /** Set \a filename_r and \a medianr_r (defaults to \c 1). */
+ OnMediaLocation & setLocation( Pathname filename_r, unsigned medianr_r = 1 );
- /** Set the files open (uncompressed) size. */
- OnMediaLocation & setOpenSize( const ByteCount & val_r )
- { _opendownloadsize = val_r; return *this; }
+ /** Unset \c filename and set \c medianr to \c 0. */
+ OnMediaLocation & unsetLocation();
- /** Set the files open (uncompressed) checksum. */
- OnMediaLocation & setOpenChecksum( const CheckSum & val_r )
- { _openchecksum = val_r; return *this; }
- /**
- * Set the whether the resource is optional or not
- * \see optional
- */
- OnMediaLocation & setOptional( bool val )
- { _optional = val; return *this; }
+ /** Individual manipulation of \c filename (prefer \ref setLocation). */
+ OnMediaLocation & changeFilename( Pathname filename_r );
+
+ /** Individual manipulation of \c medianr (prefer \ref setLocation). */
+ OnMediaLocation & changeMedianr( unsigned medianr_r );
+
+ /** Prepend the filename with \a prefix_r */
+ OnMediaLocation & prependPath( const Pathname & prefix_r );
public:
- /**
- * Individual manipulation of \c medianr (prefer \ref setLocation).
- * Using \ref setLocation is prefered as us usually have to adjust
- * \c filename and \c medianr in sync.
- */
- OnMediaLocation & changeMedianr( unsigned val_r )
- { _medianr = val_r; return *this; }
-
- /**
- * Individual manipulation of \c filename (prefer \ref setLocation).
- * Using \ref setLocation is preferedas us usually have to adjust
- * \c filename and \c medianr in sync.
+ /** Whether this is an optional resource.
+ * This is a hint to the downloader not to report an error if
+ * the resource is not present on the server.
*/
- OnMediaLocation & changeFilename( const Pathname & val_r )
- { _filename = val_r; return *this; }
+ bool optional() const;
+ /** Set whether the resource is \ref optional. */
+ OnMediaLocation & setOptional( bool val );
- /** Prepend the filename with \a prefix_r */
- OnMediaLocation & prependPath( const Pathname & prefix_r )
- { if ( !prefix_r.emptyOrRoot() ) changeFilename( prefix_r / filename() ); return *this; }
+ public:
+ /** The size of the resource on the server. */
+ const ByteCount & downloadSize() const;
+ /** Set the \ref downloadSize. */
+ OnMediaLocation & setDownloadSize( ByteCount val_r );
+
+ /** The checksum of the resource on the server. */
+ const CheckSum & checksum() const;
+ /** Set the \ref checksum. */
+ OnMediaLocation & setChecksum( CheckSum val_r );
+
+ /** The size of the resource once it has been uncompressed or unpacked. */
+ const ByteCount & openSize() const;
+ /** Set the \ref openSize. */
+ OnMediaLocation & setOpenSize( ByteCount val_r );
+
+ /** The checksum of the resource once it has been uncompressed or unpacked. */
+ const CheckSum & openChecksum() const;
+ /** Set the \ref openChecksum. */
+ OnMediaLocation & setOpenChecksum( CheckSum val_r );
+ public:
+ /** zchunk: The size of the zchunk header prepending the resource. */
+ const ByteCount & zchunkHeaderSize() const;
+ /** zchunk: Set the \ref zchunkHeaderSize. */
+ OnMediaLocation & setZchunkHeaderSize( ByteCount val_r );
+
+ /** zchunk: The checksum of the zchunk header prepending the resource. */
+ const CheckSum & zchunkHeaderChecksum() const;
+ /** zchunk: Set the \ref zchunkHeaderChecksum. */
+ OnMediaLocation & setZchunkHeaderChecksum( CheckSum val_r );
+
+ public:
+ class Impl; ///< Implementation class.
private:
- unsigned _medianr;
- Pathname _filename;
- CheckSum _checksum;
- ByteCount _downloadsize;
- ByteCount _opendownloadsize;
- CheckSum _openchecksum;
- bool _optional;
+ RWCOW_pointer<Impl> _pimpl; ///< Pointer to implementation.
};
- ///////////////////////////////////////////////////////////////////
/** \relates OnMediaLocation Stream output */
std::ostream & operator<<( std::ostream & str, const OnMediaLocation & obj );
- /////////////////////////////////////////////////////////////////
+ /** \relates OnMediaLocation Verbose stream output */
+ std::ostream & dumOn( std::ostream & str, const OnMediaLocation & obj );
+
} // namespace zypp
///////////////////////////////////////////////////////////////////
#endif // ZYPP_SOURCE_ONMEDIALOCATION_H
bool isCategory( const std::string & category_r ) const;
/** \overload taking OR'ed \ref Categories */
bool isCategory( Categories category_r ) const;
-#ifndef SWIG // Swig treats it as syntax error
+
/** \overload taking container of category strings
* 2nd template arg just to prevent instantiation for Category
*/
{ if ( isCategory( el ) ) return true; }
return false;
}
-#endif
+
/** Patch category as enum of wellknown categories.
* Unknown values are mapped to \ref CAT_OTHER.
*/
bool isSeverity( const std::string & severity_r ) const;
/** \overload taking OR'ed \ref SeverityFlags */
bool isSeverity( SeverityFlags severity_r ) const;
-#ifndef SWIG // Swig treats it as syntax error
+
/** \overload taking container of severity strings
* 2nd template arg just to prevent instantiation for SeverityFlag
*/
{ if ( isSeverity( el ) ) return true; }
return false;
}
-#endif
+
/** Severity string mapped to an enum.
* Unknown string values are mapped to \ref SEV_OTHER
*/
+
/*---------------------------------------------------------------------\
| ____ _ __ __ ___ |
| |__ / \ / / . \ . \ |
using std::swap;
swap( lhs._name, rhs._name );
}
-#ifndef SWIG // Swig treats it as syntax error
+
/** Move Ctor */
Pathname( Pathname && tmp )
: _name( std::move( tmp._name ) )
{}
-#endif
+
/** Assign */
Pathname & operator=( Pathname rhs )
{ swap( *this, rhs ); return *this; }
CLASS( const CLASS & ) = default; \
CLASS & operator=( const CLASS & ) = default
-#ifndef SWIG // Swig treats it as syntax error
/** Delete move ctor and move assign */
#define NON_MOVABLE(CLASS) \
CLASS( CLASS && ) = delete; \
#define DEFAULT_MOVABLE(CLASS) \
CLASS( CLASS && ) = default; \
CLASS & operator=( CLASS && ) = default
-#else
-#define NON_MOVABLE(CLASS)
-#define DEFAULT_MOVABLE(CLASS)
-#endif
/** Delete copy ctor and copy assign but enable default move */
#define NON_COPYABLE_BUT_MOVE( CLASS ) \
inline const std::string & asString( const std::string & t )
{ return t; }
-#ifndef SWIG // Swig treats it as syntax error
inline std::string && asString( std::string && t )
{ return std::move(t); }
-#endif
inline std::string asString( const char * t )
{ return t == nullptr ? std::string() : t; }
/** Return a copy of \a value_r with embedded variables expanded. */
std::string operator()( const std::string & value_r, VarRetriever varRetriever_r ) const;
-#ifndef SWIG // Swig treats it as syntax error
+
/** \overload moving */
std::string operator()( std::string && value_r, VarRetriever varRetriever_r ) const;
-#endif
};
/**
struct RepoVariablesStringReplacer : public std::unary_function<const std::string &, std::string>
{
std::string operator()( const std::string & value_r ) const;
-#ifndef SWIG // Swig treats it as syntax error
+
/** \overload moving */
std::string operator()( std::string && value_r ) const;
-#endif
};
/**
SolvableType() {}
SolvableType( const SolvableType & ) {}
void operator=( const SolvableType & ) {}
-#ifndef SWIG
SolvableType( SolvableType && ) {}
void operator=( SolvableType && ) {}
-#endif
~SolvableType() {}
};
////////////////////////////////////////////////////////////////////////
+ bool Selectable::hasRetracted() const
+ { return _pimpl->hasRetracted(); }
+
+ bool Selectable::hasRetractedInstalled() const
+ { return _pimpl->hasRetractedInstalled(); }
+
bool Selectable::isUnmaintained() const
{ return _pimpl->isUnmaintained(); }
/** The 'best' or 'most interesting' among all available objects.
* One that is, or is likely to be, chosen for installation, unless
* it violated any solver policy (see \ref updateCandidateObj).
+ * \note Might return a retracted item if explicitly set by \ref setCandidate
+ * or nothing else available.
*/
PoolItem candidateObj() const;
* In contrary to \ref candidateObj, this may return no item even if
* there are available objects. This simply means the \ref Repository
* does not provide this object.
+ * \note Avoids to return retracted items.
*/
PoolItem candidateObjFrom( Repository repo_r ) const;
* there are available objects. This simply means the best object is
* already installed, and all available objects violate at least one
* update policy.
+ * \note Avoids to return retracted items.
*/
PoolItem updateCandidateObj() const;
* It's doubtful whether solely looking at the version makes a good
* candidate, but apps ask for it. Beware that different vendors may
* use different (uncomparable) version schemata.
+ * \note Avoids to return retracted items.
*/
PoolItem highestAvailableVersionObj() const;
/** True if candidate object is present but no installed. */
bool hasCandidateObjOnly() const
{ return ( installedEmpty() ) && candidateObj(); }
+
+ /** True if this Selectable contains a retracted item. */
+ bool hasRetracted() const;
+
+ /** True if this Selectable contains an installed retracted item. */
+ bool hasRetractedInstalled() const;
//@}
/**
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(); }
struct SelectableTraits
{
/** Oder on AvailableItemSet.
+ * \li not retracted
* \li repository priority
* \li best Arch (arch/noarch changes are ok)
* \li best Edition
//
bool operator()( const PoolItem & lhs, const PoolItem & rhs ) const
{
+ if ( lhs.isRetracted() != rhs.isRetracted() )
+ return rhs.isRetracted();
+
int lprio = lhs->satSolvable().repository().satInternalPriority();
int rprio = rhs->satSolvable().repository().satInternalPriority();
if ( lprio != rprio )