Imported Upstream version 16.3.2
[platform/upstream/libzypp.git] / zypp / solver / detail / SystemCheck.cc
index cd6da86..c2f9069 100644 (file)
@@ -13,6 +13,8 @@
 #include <fstream>
 #include <vector>
 
+#define ZYPP_USE_RESOLVER_INTERNALS
+
 #include "zypp/base/LogTools.h"
 #include "zypp/base/IOStream.h"
 #include "zypp/base/String.h"
@@ -30,6 +32,7 @@ namespace zypp
 { /////////////////////////////////////////////////////////////////
 
     Pathname           _file = "";
+    Pathname            _dir = "";
     CapabilitySet      _require;
     CapabilitySet      _conflict;
 
@@ -42,24 +45,40 @@ namespace zypp
     }
 
 
-    SystemCheck::SystemCheck() {
+  SystemCheck::SystemCheck() {
        if (_file.empty()) {
            _file = ZConfig::instance().solver_checkSystemFile();
-           loadFile();
+           loadFile(_file);
        }
+        if (_dir.empty()) {
+          _dir = ZConfig::instance().solver_checkSystemFileDir();
+          loadFiles();
+        }
     }
 
     bool SystemCheck::setFile(const Pathname & file) const{
        MIL << "Setting checkFile to : " << file << endl;
        _file = file;
-       loadFile();
+       loadFile(_file);
        return true;
     }
 
+    bool SystemCheck::setDir(const Pathname & dir) const {
+      MIL << "Setting checkFile directory to : " << dir << endl;
+      loadFile(_file);
+      _dir = dir;
+      loadFiles();
+      return true;
+    }
+
     const Pathname & SystemCheck::file() {
        return _file;
     }
 
+    const Pathname & SystemCheck::dir() {
+       return _dir;
+    }
+
     const CapabilitySet & SystemCheck::requiredSystemCap() const{
        return _require;
     }
@@ -68,21 +87,23 @@ namespace zypp
        return _conflict;
     }
 
-    bool SystemCheck::loadFile() const{
+    bool SystemCheck::loadFile(Pathname & file, bool reset_caps) const{
         Target_Ptr trg( getZYpp()->getTarget() );
         if ( trg )
-          _file = trg->assertRootPrefix( _file );
+          file = trg->assertRootPrefix( file );
 
-       PathInfo pi( _file );
+       PathInfo pi( file );
        if ( ! pi.isFile() ) {
-           WAR << "Can't read " << _file << " " << pi << endl;
+           WAR << "Can't read " << file << " " << pi << endl;
            return false;
        }
 
-       _require.clear();
-       _conflict.clear();
+        if (reset_caps) {
+          _require.clear();
+          _conflict.clear();
+        }
 
-       std::ifstream infile( _file.c_str() );
+       std::ifstream infile( file.c_str() );
        for( iostr::EachLine in( infile ); in; in.next() ) {
            std::string l( str::trim(*in) );
            if ( ! l.empty() && l[0] != '#' )
@@ -107,6 +128,25 @@ namespace zypp
        return true;
     }
 
+  bool SystemCheck::loadFiles() const {
+
+    filesystem::dirForEach(_dir,
+                           [this](const Pathname & dir_r, const char *const & name_r)->bool
+                           {
+                             const std::string wanted = ".check";
+                             Pathname pth = dir_r/name_r;
+                             if (pth.extension() != wanted) {
+                               MIL << "Skipping " << pth << " (not a *.check file)" << endl;
+                               return true;
+                             }
+                             else {
+                               MIL << "Reading " << pth << endl;
+                               return loadFile(pth, false /* do not reset caps */);
+                             }
+                           });
+    return true;
+  }
+
 
     /******************************************************************
     **