ENDMACRO(ADD_TESTS)
####################################################################
-# prefer packages using the same install prefix as we do
-SET(CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX} usr/localX /usr/local /usr)
IF ( ENABLE_USE_THREADS )
SET( CMAKE_THREAD_PREFER_PTHREAD TRUE )
#
SET(LIBZYPP_MAJOR "17")
SET(LIBZYPP_COMPATMINOR "2")
-SET(LIBZYPP_MINOR "7")
-SET(LIBZYPP_PATCH "1")
+SET(LIBZYPP_MINOR "8")
+SET(LIBZYPP_PATCH "0")
#
-# LAST RELEASED: 17.7.1 (2)
+# LAST RELEASED: 17.8.0 (2)
# (The number in parenthesis is LIBZYPP_COMPATMINOR)
#=======
-------------------------------------------------------------------
+Fri Oct 12 14:01:19 CEST 2018 - ma@suse.de
+
+- Add infrastructure to flag specific packages to trigger a
+ reboot needed hint (fate#326451)
+- Adapt to libsolv: Drop support for REPOKEY_TYPE_U32
+- Resolver: add setInr to request solving namespaces
+- ResolverNamespace: add No/AllResolverNamespaces constants
+- version 17.8.0 (2)
+
+-------------------------------------------------------------------
+Mon Oct 1 14:04:15 CEST 2018 - ma@suse.de
+
+- Fix blocking wait for finished child process (bsc#1109877)
+- version 17.7.2 (2)
+
+-------------------------------------------------------------------
Fri Sep 28 14:38:01 CEST 2018 - ma@suse.de
- Fix conversion of string and glob to regex when compiling queries
- (bsc#1099982, bsc#939392)
+ (bsc#1099982, bsc#939392, bsc#556664)
- version 17.7.1 (2)
-------------------------------------------------------------------
# Copyright (C) 2002 SuSE Linux AG.
# Copyright (C) 1999-2001 SuSE GmbH.
# I Made Wiryana <made@nakula.rvs.uni-bielefeld.de>, 1999.
+# Kukuh Syafaat <cho2@opensuse.org>, 2017-2018.
msgid ""
msgstr ""
"Project-Id-Version: YaST (@memory@)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-08-03 11:09+0200\n"
-"PO-Revision-Date: 2017-10-03 15:55+0700\n"
+"PO-Revision-Date: 2018-10-05 13:06+0000\n"
"Last-Translator: Kukuh Syafaat <syafaatkukuh@gmail.com>\n"
-"Language-Team: Indonesian <https://l10n.opensuse.org/projects/libzypp/master/"
-"id/>\n"
+"Language-Team: Indonesian "
+"<https://l10n.opensuse.org/projects/libzypp/master/id/>\n"
"Language: id\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Poedit 2.0.3\n"
+"X-Generator: Weblate 2.18\n"
#: zypp/target/hal/HalException.h:46 zypp/target/hal/HalException.h:55
#: zypp/target/hal/HalException.h:64
msgstr "Mencoba untuk mengimpor kunci %s tidak ada ke keyring %s"
#: zypp/KeyRing.cc:542 zypp/KeyRing.cc:546
-#, fuzzy
msgid "Failed to import key."
-msgstr "Gagal mengimpor kunci publik %1%"
+msgstr "Gagal mengimpor kunci."
#: zypp/KeyRing.cc:553 zypp/KeyRing.cc:557 zypp/KeyRing.cc:561
msgid "Failed to delete key."
#: zypp/RepoInfo.cc:513
#, boost-format
msgid "Looking for gpg key ID %1% in cache %2%."
-msgstr ""
+msgstr "Mencari kunci gpg ID %1% dalam cache %2%."
#. translator: %1% is a gpg key ID like 3DBDC284
#. %2% is a repositories name
#: zypp/RepoInfo.cc:541
#, boost-format
msgid "Looking for gpg key ID %1% in repository %2%."
-msgstr ""
+msgstr "Mencari kunci gpg ID %1% dalam repositori %2%."
#. translator: %1% is a repositories name
#: zypp/RepoInfo.cc:565
#, boost-format
msgid "Repository %1% does not define additional 'gpgkey=' URLs."
-msgstr ""
+msgstr "Repositori %1% tidak mendefinisikan 'gpgkey=' URL tambahan."
#: zypp/RepoManager.cc:314
#, boost-format
#: zypp/media/MediaException.cc:195
#, c-format, boost-format
msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
-msgstr ""
+msgstr "Data yang diunduh melebihi ukuran yang diharapkan '%s' dari '%s'."
#: zypp/media/MediaException.cc:203
#, c-format, boost-format
#: zypp/target/RpmPostTransCollector.cc:103
#, boost-format
msgid "Executing %%posttrans script '%1%'"
-msgstr ""
+msgstr "Menjalankan skrip '%1%' %%posttrans"
#. show a final message
#: zypp/target/RpmPostTransCollector.cc:161
#, c-format, boost-format
msgid "Executing %posttrans scripts"
-msgstr ""
+msgstr "Menjalankan skrip %posttrans"
#: zypp/target/TargetImpl.cc:311
msgid " executed"
"Project-Id-Version: zypp\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-08-03 11:09+0200\n"
-"PO-Revision-Date: 2018-08-13 17:01+0000\n"
+"PO-Revision-Date: 2018-10-06 11:01+0000\n"
"Last-Translator: Yi-Jyun Pan <pan93412@gmail.com>\n"
"Language-Team: Chinese (Taiwan) "
"<https://l10n.opensuse.org/projects/libzypp/master/zh_TW/>\n"
#: zypp/media/MediaException.cc:195
#, c-format, boost-format
msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
-msgstr "下載到的資料超出了預期檔案大小 %$2s 中的 %1$s。"
+msgstr "下載到的資料超出了預期檔案大小 %s/%s。"
#: zypp/media/MediaException.cc:203
#, c-format, boost-format
} while ( true );
}
- // Wait for child to exit
- int ret;
- int status = 0;
- do
+ if ( pid > 0 ) // bsc#1109877: must re-check! running() in the loop above may have already waited.
{
- ret = waitpid(pid, &status, 0);
- }
- while (ret == -1 && errno == EINTR);
+ // Wait for child to exit
+ int ret;
+ int status = 0;
+ do
+ {
+ ret = waitpid(pid, &status, 0);
+ }
+ while (ret == -1 && errno == EINTR);
- if (ret != -1)
- {
- _exitStatus = checkStatus( status );
+ if (ret != -1)
+ {
+ _exitStatus = checkStatus( status );
+ }
+ pid = -1;
}
- pid = -1;
}
return _exitStatus;
StrMatcher PoolQuery::Impl::joinedStrMatcher( const StrContainer & container_r, const Match & flags_r ) const
{
- USR << flags_r << " - " << container_r << endl;
-
if ( container_r.empty() )
return StrMatcher( std::string(), flags_r );
void Resolver::setIgnoreAlreadyRecommended( bool yesno_r) { _pimpl->setIgnoreAlreadyRecommended( yesno_r ); }
bool Resolver::ignoreAlreadyRecommended() const { return _pimpl->ignoreAlreadyRecommended(); }
+ void Resolver::setInr( ResolverNamespaces namespaces_r ) { _pimpl->setInr( namespaces_r ); }
+ void Resolver::resetInr() { setInr( ResolverNamespaces() ); }
+ ResolverNamespaces Resolver::inr() const { return _pimpl->inr(); }
+
void Resolver::setOnlyRequires( bool yesno_r ) { _pimpl->setOnlyRequires( yesno_r ); }
void Resolver::resetOnlyRequires() { _pimpl->setOnlyRequires( indeterminate ); }
bool Resolver::onlyRequires() const { return _pimpl->onlyRequires(); }
#include "zypp/PoolItem.h"
#include "zypp/Capabilities.h"
#include "zypp/Capability.h"
+#include "zypp/ResolverNamespace.h"
#include "zypp/solver/detail/Types.h"
bool ignoreAlreadyRecommended() const;
/**
+ * Weak form of \ref ignoreAlreadyRecommended \c =false.
+ * Try to re-evaluate recommendations for specific namespaces only.
+ * \note May not support all namespaces.
+ */
+ void setInr( ResolverNamespaces namespaces_r );
+ void resetInr();
+ ResolverNamespaces inr() const;
+
+ /**
* Setting whether required packages are installed ONLY
* So recommended packages, language packages and packages which depend
* on hardware (modalias) will not be regarded.
/** \relates ResolverNamespace Flags */
ZYPP_DECLARE_FLAGS_AND_OPERATORS(ResolverNamespaces,ResolverNamespace);
+ /** \relates ResolverNamespace All bits set. */
+ static constexpr const ResolverNamespaces NoResolverNamespaces = ResolverNamespace();
+
+ /** \relates ResolverNamespace All bits set. */
+ static constexpr const ResolverNamespaces AllResolverNamespaces = ResolverNamespace(0xff);
+
/** \relates ResolverNamespace The underlying libsolv ID */
inline constexpr IdString asIdString( ResolverNamespace obj )
{
}
std::cerr << ansi[level_r%n] << "OSD[" << msg_r << "]\033[0m" << std::endl;
}
+
+
+ unsigned TraceLeave::_depth = 0;
+
+ TraceLeave::TraceLeave( const char * file_r, const char * fnc_r, int line_r )
+ : _file( std::move(file_r) )
+ , _fnc( std::move(fnc_r) )
+ , _line( line_r )
+ {
+ //std::string::size_type p( _file.find_last_of( '/' ) );
+ //if ( p != std::string::npos )
+ //_file.erase( 0, p+1 );
+ USR << ">>> " << std::string(_depth++,'>') << " " << _file << "(" << _fnc << "):" << _line << endl;
+ }
+
+ TraceLeave::~TraceLeave()
+ { USR << "<<< " << std::string(--_depth,'<') << " " << _file << "(" << _fnc << "):" << _line << endl; }
}
#endif // ZYPP_NDEBUG
#ifdef ZYPP_NDEBUG
#define OSDLOG( MSG )
#define OSMLOG( L, MSG )
+#define TRACELEAVE
#else
namespace zypp
{
namespace debug
{
void osdlog( const std::string & msg_r, unsigned level_r ); // LogControl.cc
+
+ struct TraceLeave // LogControl.cc
+ {
+ TraceLeave( const TraceLeave & ) =delete;
+ TraceLeave & operator=( const TraceLeave & ) =delete;
+ TraceLeave( const char * file_r, const char * fnc_r, int line_r );
+ ~TraceLeave();
+ private:
+ static unsigned _depth;
+ const char * _file;
+ const char * _fnc;
+ int _line;
+ };
}
}
#define OSDLOG( MSG ) ::zypp::debug::osdlog( MSG, 0 )
#define OSMLOG( L, MSG ) ::zypp::debug::osdlog( MSG, L )
+#define TRACELEAVE ::zypp::debug::TraceLeave _TraceLeave( __FILE__, __FUNCTION__, __LINE__ )
#endif // ZYPP_NDEBUG
///////////////////////////////////////////////////////////////////
RepoStatus Downloader::status( MediaSetAccess &media )
{
- RepoStatus ret( media.provideFile( repoInfo().path() / "/repodata/repomd.xml" ) );
+ RepoStatus ret( media.provideOptionalFile( repoInfo().path() / "/repodata/repomd.xml" ) );
if ( !ret.empty() ) // else: mandatory master index is missing
ret = ret && RepoStatus( media.provideOptionalFile( "/media.1/media" ) );
// else: mandatory master index is missing -> stay empty
{
switch ( solvAttrType() )
{
- case REPOKEY_TYPE_U32:
case REPOKEY_TYPE_NUM:
case REPOKEY_TYPE_CONSTANT:
return true;
{
switch ( solvAttrType() )
{
- case REPOKEY_TYPE_U32:
case REPOKEY_TYPE_NUM:
case REPOKEY_TYPE_CONSTANT:
return _dip->kv.num;
{
switch ( solvAttrType() )
{
- case REPOKEY_TYPE_U32:
case REPOKEY_TYPE_NUM:
case REPOKEY_TYPE_CONSTANT:
return SOLV_KV_NUM64(&_dip->kv);
}
break;
- case REPOKEY_TYPE_U32:
case REPOKEY_TYPE_NUM:
case REPOKEY_TYPE_CONSTANT:
return str::numstring( asInt() );
Queue Pool::autoInstalled() const { return myPool().autoInstalled(); }
void Pool::setAutoInstalled( const Queue & autoInstalled_r ){ myPool().setAutoInstalled( autoInstalled_r ); }
+ Queue Pool::rebootNeededIdents() const { return myPool().rebootNeededIdents(); }
+ void Pool::setRebootNeededIdents( const Queue & rebootNeeded_r ){ myPool().setRebootNeededIdents( rebootNeeded_r ); }
+
/******************************************************************
**
** FUNCTION NAME : operator<<
void setAutoInstalled( const Queue & autoInstalled_r );
//@}
+ /** Get ident list of all solvables that trigger the "reboot needed" flag. */
+ Queue rebootNeededIdents() const;
+
+ /** Set ident list of all solvables that trigger the "reboot needed" flag. */
+ void setRebootNeededIdents( const Queue & rebootNeeded_r );
+
public:
/** Expert backdoor. */
detail::CPool * get() const;
return myPool().isOnSystemByAuto( ident_r );
}
+ bool Solvable::identTriggersRebootHint ( const IdString &ident_r )
+ {
+ return myPool().triggersRebootNeededHint( ident_r );
+ }
+
bool Solvable::multiversionInstall() const
{
NO_SOLVABLE_RETURN( false );
/** \overload static version */
static bool identIsAutoInstalled( const IdString & ident_r );
+ /** Whether installing or upgrading a solvable with the same \ref ident will trigger the reboot needed hint. */
+ bool identTriggersRebootHint() const
+ { return identTriggersRebootHint( ident() ); }
+ static bool identTriggersRebootHint ( const IdString &ident_r );
+
/** Whether different versions of this package can be installed at the same time.
* Per default \c false. \see also \ref ZConfig::multiversion.
*/
bool onSystemByAuto() const { return satSolvable().onSystemByAuto(); }
bool identIsAutoInstalled() const { return satSolvable().identIsAutoInstalled(); }
bool multiversionInstall() const { return satSolvable().multiversionInstall(); }
+ bool identTriggersRebootHint() const { return satSolvable().identTriggersRebootHint(); }
Date buildtime() const { return satSolvable().buildtime(); }
Date installtime() const { return satSolvable().installtime(); }
bool isOnSystemByAuto( IdString ident_r ) const
{ return _autoinstalled.contains( ident_r.id() ); }
+
+ /** Get ident list of all solvables that trigger the "reboot needed" flag. */
+ StringQueue rebootNeededIdents() const
+ { return _rebootNeeded; }
+
+ /** Set ident list of all solvables that trigger the "reboot needed" flag. */
+ void setRebootNeededIdents( const StringQueue & rebootNeeded_r )
+ { _rebootNeeded = rebootNeeded_r; }
+
+ bool triggersRebootNeededHint( IdString ident_r ) const
+ { return _rebootNeeded.contains( ident_r.id() ); }
+
//@}
public:
/** */
sat::StringQueue _autoinstalled;
+ /** database of all identifiers that will trigger the "reboot needed" flag */
+ sat::StringQueue _rebootNeeded;
+
/** filesystems mentioned in /etc/sysconfig/storage */
mutable scoped_ptr<std::set<std::string> > _requiredFilesystemsPtr;
};
using std::endl;
using std::make_pair;
+#undef ZYPP_BASE_LOGGER_LOGGROUP
+#define ZYPP_BASE_LOGGER_LOGGROUP "zypp::solver"
+
/////////////////////////////////////////////////////////////////////////
namespace zypp
{ ///////////////////////////////////////////////////////////////////////
OUTS( _solveSrcPackages );
OUTS( _cleandepsOnRemove );
OUTS( _ignoreAlreadyRecommended );
+ OUTS( _inr );
#undef OUT
return os << "<resolver/>";
}
, _solveSrcPackages ( false )
, _cleandepsOnRemove ( ZConfig::instance().solver_cleandepsOnRemove() )
, _ignoreAlreadyRecommended ( true )
+ // _inr defaults to ResolverNamespaces()
{
sat::Pool satPool( sat::Pool::instance() );
_satResolver->setFixsystem ( isVerifyingMode() );
_satResolver->setIgnorealreadyrecommended ( ignoreAlreadyRecommended() );
+ _satResolver->setInr ( inr() );
_satResolver->setOnlyRequires ( onlyRequires() );
_satResolver->setUpdatesystem (_updateMode);
_satResolver->setSolveSrcPackages ( solveSrcPackages() );
bool _cleandepsOnRemove; // whether removing a package should also remove no longer needed requirements
bool _ignoreAlreadyRecommended; //ignore recommended packages that have already been recommended by the installed packages
+ ResolverNamespaces _inr; // Try to re-evaluate recommendations for these namespaces
//@}
// Additional QueueItems which has to be regarded by the solver
bool ignoreAlreadyRecommended() const { return _ignoreAlreadyRecommended; }
void setIgnoreAlreadyRecommended( bool yesno_r ) { _ignoreAlreadyRecommended = yesno_r; }
+ ResolverNamespaces inr() const { return _inr; }
+ void setInr( ResolverNamespaces namespaces_r ) { _inr = namespaces_r; }
+
bool onlyRequires () const { return _onlyRequires; }
void setOnlyRequires( TriBool state_r );
#define XDEBUG(x) do { if (base::logger::isExcessive()) XXX << x << std::endl;} while (0)
+#undef ZYPP_BASE_LOGGER_LOGGROUP
+#define ZYPP_BASE_LOGGER_LOGGROUP "zypp::solver"
+
/////////////////////////////////////////////////////////////////////////
namespace zypp
{ ///////////////////////////////////////////////////////////////////////
os << " solveSrcPackages = " << _solveSrcPackages << endl;
os << " cleandepsOnRemove = " << _cleandepsOnRemove << endl;
os << " fixsystem = " << _fixsystem << endl;
+ os << " inr namespace = " << _inr << endl;
} else {
os << "<NULL>";
}
// Ad rules for changed requestedLocales
const auto & trackedLocaleIds( myPool().trackedLocaleIds() );
- for ( const auto & locale : trackedLocaleIds.added() )
+ if ( _inr.testFlag( ResolverNamespace::language ) )
{
- queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES );
- queue_push( &(_jobQueue), Capability( ResolverNamespace::language, IdString(locale) ).id() );
+ // inr mode
+ for ( const auto & locale : trackedLocaleIds.current() )
+ {
+ queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES );
+ queue_push( &(_jobQueue), Capability( ResolverNamespace::language, IdString(locale) ).id() );
+ }
+ // TODO cleanup not requested locale packages?
}
-
- for ( const auto & locale : trackedLocaleIds.removed() )
+ else
{
- queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES | SOLVER_CLEANDEPS ); // needs uncond. SOLVER_CLEANDEPS!
- queue_push( &(_jobQueue), Capability( ResolverNamespace::language, IdString(locale) ).id() );
+ // just track changed locakes
+ for ( const auto & locale : trackedLocaleIds.added() )
+ {
+ queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES );
+ queue_push( &(_jobQueue), Capability( ResolverNamespace::language, IdString(locale) ).id() );
+ }
+
+ for ( const auto & locale : trackedLocaleIds.removed() )
+ {
+ queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES | SOLVER_CLEANDEPS ); // needs uncond. SOLVER_CLEANDEPS!
+ queue_push( &(_jobQueue), Capability( ResolverNamespace::language, IdString(locale) ).id() );
+ }
}
// Add rules for parallel installable resolvables with different versions
bool _cleandepsOnRemove:1; // whether removing a package should also remove no longer needed requirements
private:
+ ResolverNamespaces _inr; // Try to re-evaluate recommendations for these namespaces
+ private:
// ---------------------------------- methods
std::string SATprobleminfoString (Id problem, std::string &detail, Id &ignoreId);
void resetItemTransaction (PoolItem item);
bool ignorealreadyrecommended () const {return _ignorealreadyrecommended;}
void setIgnorealreadyrecommended ( const bool ignorealreadyrecommended) { _ignorealreadyrecommended = ignorealreadyrecommended;}
+ ResolverNamespaces inr() const { return _inr; }
+ void setInr( ResolverNamespaces namespaces_r ) { _inr = namespaces_r; }
+
bool distupgrade () const {return _distupgrade;}
void setDistupgrade ( const bool distupgrade) { _distupgrade = distupgrade;}
void deleteResolvable( const PoolItem & pi_r );
void addDependencies (const CapabilitySet &capRequire, const CapabilitySet &capConflict);
void addUpgradeRepos( const std::set<Repository> & upgradeRepos_r );
+ void addInr( ResolverNamespaces namespaces_r );
std::string filename () { return dumpFile; }
};
}
}
+void HelixControl::addInr( ResolverNamespaces namespaces_r )
+{
+ if ( namespaces_r )
+ *file << "<inrNamespaces str=\"" << namespaces_r << "\" int=\"" << str::numstring((namespaces_r)) << "\"/>" << endl;
+}
+
//---------------------------------------------------------------------------
Testcase::Testcase()
control.addDependencies (SystemCheck::instance().requiredSystemCap(),
SystemCheck::instance().conflictSystemCap());
control.addUpgradeRepos( resolver.upgradeRepos() );
+ control.addInr( resolver.inr() );
control.addTagIf( "distupgrade", resolver.isUpgradeMode() );
control.addTagIf( "update", resolver.isUpdateMode() );
#include "zypp/ZConfig.h"
#include "zypp/ZYppFactory.h"
+#include "zypp/PathInfo.h"
#include "zypp/PoolItem.h"
#include "zypp/ResObjects.h"
q.push( idstr.id() );
satpool.setAutoInstalled( q );
}
+
+ //load the packages that will trigger the update flag being set
+ {
+ sat::StringQueue q;
+ filesystem::Pathname needRebootFile = home() / "needreboot";
+ if ( filesystem::PathInfo ( needRebootFile ).isExist() ) {
+ SolvIdentFile file ( needRebootFile );
+ for ( const auto & idstr : file.data() ) {
+ q.push( idstr.id() );
+ }
+ }
+
+ filesystem::Pathname needRebootDir = home() / "needreboot.d";
+ if ( filesystem::PathInfo ( needRebootDir ).isExist() ) {
+ filesystem::DirContent ls;
+ filesystem::readdir( ls, needRebootDir, false );
+
+ for ( const filesystem::DirEntry &entry : ls ) {
+
+ if ( entry.type != filesystem::FT_FILE )
+ continue;
+
+ SolvIdentFile file ( needRebootDir / entry.name );
+ for ( const auto & idstr : file.data() ) {
+ q.push( idstr.id() );
+ }
+ }
+ }
+
+ satpool.setRebootNeededIdents( q );
+ }
+
if ( ZConfig::instance().apply_locks_file() )
{
const HardLocksFile::Data & hardLocks( _hardLocksFile.data() );
}
else
{
+ if ( citem.identTriggersRebootHint() ) {
+ auto rebootNeededFile = root() / "/var/run/reboot-needed";
+ if ( filesystem::assert_file( rebootNeededFile ) == EEXIST)
+ filesystem::touch( rebootNeededFile );
+ }
+
success = true;
step->stepStage( sat::Transaction::STEP_DONE );
}