Imported Upstream version 17.8.0 upstream/17.8.0
authorDongHun Kwak <dh0128.kwak@samsung.com>
Mon, 2 Sep 2019 07:18:06 +0000 (16:18 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Mon, 2 Sep 2019 07:18:06 +0000 (16:18 +0900)
26 files changed:
CMakeLists.txt
VERSION.cmake
package/libzypp.changes
po/id.po
po/zh_TW.po
zypp/ExternalProgram.cc
zypp/PoolQuery.cc
zypp/Resolver.cc
zypp/Resolver.h
zypp/ResolverNamespace.h
zypp/base/LogControl.cc
zypp/base/Logger.h
zypp/repo/yum/Downloader.cc
zypp/sat/LookupAttr.cc
zypp/sat/Pool.cc
zypp/sat/Pool.h
zypp/sat/Solvable.cc
zypp/sat/Solvable.h
zypp/sat/SolvableType.h
zypp/sat/detail/PoolImpl.h
zypp/solver/detail/Resolver.cc
zypp/solver/detail/Resolver.h
zypp/solver/detail/SATResolver.cc
zypp/solver/detail/SATResolver.h
zypp/solver/detail/Testcase.cc
zypp/target/TargetImpl.cc

index 43c762c..10dc97d 100644 (file)
@@ -94,8 +94,6 @@ MACRO(ADD_TESTS)
 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 )
index 0bd2ed4..3df0591 100644 (file)
@@ -60,9 +60,9 @@
 #
 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)
 #=======
index b2aad9d..50a06c8 100644 (file)
@@ -1,8 +1,24 @@
 -------------------------------------------------------------------
+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)
 
 -------------------------------------------------------------------
index 25c3c83..4d0947f 100644 (file)
--- a/po/id.po
+++ b/po/id.po
@@ -3,21 +3,22 @@
 # 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
@@ -1618,9 +1619,8 @@ msgid "Tried to import not existent key %s into keyring %s"
 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."
@@ -4210,20 +4210,20 @@ msgstr[0] "(Berakhir dalam %d hari)"
 #: 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
@@ -4637,7 +4637,7 @@ msgstr "Timeout melebihi ketika mengakses '%s'."
 #: 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
@@ -5080,13 +5080,13 @@ msgstr "penghapusan dari %s"
 #: 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"
index e7ed5e8..1d8f430 100644 (file)
@@ -11,7 +11,7 @@ msgstr ""
 "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"
@@ -4189,7 +4189,7 @@ msgstr "存取 '%s' 時超出限定時間。"
 #: 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
index d5f1460..ef2d224 100644 (file)
@@ -488,20 +488,23 @@ namespace zypp {
          } 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;
index 4c2e8e7..0ebb9fc 100644 (file)
@@ -732,8 +732,6 @@ namespace zypp
 
   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 );
 
index 3625438..07f90d8 100644 (file)
@@ -86,6 +86,10 @@ namespace zypp
   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(); }
index b02e3c5..3225eb1 100644 (file)
@@ -22,6 +22,7 @@
 #include "zypp/PoolItem.h"
 #include "zypp/Capabilities.h"
 #include "zypp/Capability.h"
+#include "zypp/ResolverNamespace.h"
 
 #include "zypp/solver/detail/Types.h"
 
@@ -188,6 +189,15 @@ namespace zypp
     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.
index c66eaef..9c20f72 100644 (file)
@@ -31,6 +31,12 @@ namespace zypp
   /** \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 )
   {
index 8bb087a..4bf3ef7 100644 (file)
@@ -60,6 +60,23 @@ namespace zypp
       }
       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
 
index 6892db0..ca3bac6 100644 (file)
 #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
 ///////////////////////////////////////////////////////////////////
 
index b0b8ee0..b127c1e 100644 (file)
@@ -37,7 +37,7 @@ Downloader::Downloader( const RepoInfo &repoinfo , const Pathname &delta_dir)
 
 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
index 0f98bdb..0bf8cdf 100644 (file)
@@ -383,7 +383,6 @@ namespace zypp
     {
       switch ( solvAttrType() )
       {
-        case REPOKEY_TYPE_U32:
         case REPOKEY_TYPE_NUM:
         case REPOKEY_TYPE_CONSTANT:
           return true;
@@ -547,7 +546,6 @@ namespace zypp
       {
         switch ( solvAttrType() )
         {
-          case REPOKEY_TYPE_U32:
           case REPOKEY_TYPE_NUM:
           case REPOKEY_TYPE_CONSTANT:
             return _dip->kv.num;
@@ -566,7 +564,6 @@ namespace zypp
       {
         switch ( solvAttrType() )
         {
-          case REPOKEY_TYPE_U32:
           case REPOKEY_TYPE_NUM:
           case REPOKEY_TYPE_CONSTANT:
             return SOLV_KV_NUM64(&_dip->kv);
@@ -634,7 +631,6 @@ namespace zypp
             }
             break;
 
-          case REPOKEY_TYPE_U32:
           case REPOKEY_TYPE_NUM:
           case REPOKEY_TYPE_CONSTANT:
             return str::numstring( asInt() );
index e4509f5..a073577 100644 (file)
@@ -243,6 +243,9 @@ namespace zypp
     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<<
index 160d9a7..e143348 100644 (file)
@@ -265,6 +265,12 @@ namespace zypp
        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;
index 21fd9a2..2e1ea4c 100644 (file)
@@ -387,6 +387,11 @@ namespace zypp
       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 );
index 64a479d..3e7a3a5 100644 (file)
@@ -136,6 +136,11 @@ namespace zypp
       /** \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.
        */
index e666195..aad678c 100644 (file)
@@ -80,6 +80,7 @@ namespace zypp
       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(); }
index 2552f05..3350147 100644 (file)
@@ -306,6 +306,18 @@ namespace zypp
 
           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:
@@ -337,6 +349,9 @@ namespace zypp
           /**  */
          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;
       };
index 789f35b..43d60d6 100644 (file)
@@ -47,6 +47,9 @@
 using std::endl;
 using std::make_pair;
 
+#undef ZYPP_BASE_LOGGER_LOGGROUP
+#define ZYPP_BASE_LOGGER_LOGGROUP "zypp::solver"
+
 /////////////////////////////////////////////////////////////////////////
 namespace zypp
 { ///////////////////////////////////////////////////////////////////////
@@ -73,6 +76,7 @@ std::ostream & Resolver::dumpOn( std::ostream & os ) const
   OUTS( _solveSrcPackages );
   OUTS( _cleandepsOnRemove );
   OUTS( _ignoreAlreadyRecommended );
+  OUTS( _inr );
   #undef OUT
   return os << "<resolver/>";
 }
@@ -91,6 +95,7 @@ Resolver::Resolver (const ResPool & pool)
     , _solveSrcPackages                ( false )
     , _cleandepsOnRemove       ( ZConfig::instance().solver_cleandepsOnRemove() )
     , _ignoreAlreadyRecommended        ( true )
+    // _inr defaults to ResolverNamespaces()
 
 {
     sat::Pool satPool( sat::Pool::instance() );
@@ -306,6 +311,7 @@ void Resolver::solverInit()
 
     _satResolver->setFixsystem                 ( isVerifyingMode() );
     _satResolver->setIgnorealreadyrecommended  ( ignoreAlreadyRecommended() );
+    _satResolver->setInr                       ( inr() );
     _satResolver->setOnlyRequires              ( onlyRequires() );
     _satResolver->setUpdatesystem              (_updateMode);
     _satResolver->setSolveSrcPackages          ( solveSrcPackages() );
index e28626c..21a7006 100644 (file)
@@ -95,6 +95,7 @@ class Resolver : private base::NonCopyable
     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
@@ -167,6 +168,9 @@ class Resolver : private base::NonCopyable
     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 );
 
index 8b55333..41e7214 100644 (file)
@@ -62,6 +62,9 @@ extern "C"
 
 #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
 { ///////////////////////////////////////////////////////////////////////
@@ -167,6 +170,7 @@ SATResolver::dumpOn( std::ostream & os ) const
        os << "  solveSrcPackages       = "     << _solveSrcPackages << endl;
        os << "  cleandepsOnRemove      = "     << _cleandepsOnRemove << endl;
         os << "  fixsystem             = "     << _fixsystem << endl;
+       os << "  inr namespace          = "     << _inr << endl;
     } else {
        os << "<NULL>";
     }
@@ -622,16 +626,30 @@ SATResolver::solverInit(const PoolItemList & weakItems)
 
     // 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
index a62e109..c8e5435 100644 (file)
@@ -115,6 +115,8 @@ class SATResolver : public base::ReferenceCounted, private base::NonCopyable, pr
     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);
@@ -176,6 +178,9 @@ class SATResolver : public base::ReferenceCounted, private base::NonCopyable, pr
     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;}
 
index cf34ba1..55b3f21 100644 (file)
@@ -308,6 +308,7 @@ class  HelixControl {
     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; }
 };
@@ -463,6 +464,12 @@ void HelixControl::addUpgradeRepos( const std::set<Repository> & upgradeRepos_r
   }
 }
 
+void HelixControl::addInr( ResolverNamespaces namespaces_r )
+{
+  if ( namespaces_r )
+    *file << "<inrNamespaces str=\"" << namespaces_r << "\" int=\"" << str::numstring((namespaces_r)) << "\"/>" << endl;
+}
+
 //---------------------------------------------------------------------------
 
 Testcase::Testcase()
@@ -594,6 +601,7 @@ bool Testcase::createTestcase(Resolver & resolver, bool dumpPool, bool runSolver
     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() );
index a5389b3..687af9b 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "zypp/ZConfig.h"
 #include "zypp/ZYppFactory.h"
+#include "zypp/PathInfo.h"
 
 #include "zypp/PoolItem.h"
 #include "zypp/ResObjects.h"
@@ -1072,6 +1073,38 @@ namespace zypp
          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() );
@@ -1468,6 +1501,12 @@ namespace zypp
               }
               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 );
               }