WIP: grains collections for salt package manager.

This commit is contained in:
Matthias Koefferlein 2017-03-14 22:59:24 +01:00
parent b98afd5a8d
commit 59dd36f692
3 changed files with 116 additions and 7 deletions

View File

@ -105,23 +105,33 @@ SaltGrains::is_empty () const
}
SaltGrains
SaltGrains::from_path (const std::string &path)
SaltGrains::from_path (const std::string &path, const std::string &prefix)
{
SaltGrains grains;
grains.set_path (path);
QDir dir (tl::to_qstring (path));
QStringList entries = dir.entryList (QDir::NoFilter, QDir::Name);
QStringList entries = dir.entryList (QDir::NoDotAndDotDot | QDir::Dirs, QDir::Name);
for (QStringList::const_iterator e = entries.begin (); e != entries.end (); ++e) {
std::string new_prefix = prefix;
if (! new_prefix.empty ()) {
new_prefix += "/";
}
new_prefix += tl::to_string (*e);
std::string epath = tl::to_string (dir.absoluteFilePath (*e));
if (SaltGrain::is_grain (epath)) {
try {
grains.add_grain (SaltGrain::from_path (epath));
SaltGrain g (SaltGrain::from_path (epath));
g.set_name (new_prefix);
grains.add_grain (g);
} catch (...) {
// ignore errors (TODO: what to do here?)
}
} else if (QFileInfo (tl::to_qstring (epath)).isDir ()) {
SaltGrains c = SaltGrains::from_path (epath);
SaltGrains c = SaltGrains::from_path (epath, new_prefix);
c.set_name (new_prefix);
if (! c.is_empty ()) {
grains.add_collection (c);
}

View File

@ -120,7 +120,7 @@ public:
*/
collection_iterator end_collections () const
{
return m_collections.begin ();
return m_collections.end ();
}
/**
@ -146,7 +146,7 @@ public:
*/
grain_iterator end_grains () const
{
return m_grains.begin ();
return m_grains.end ();
}
/**
@ -170,7 +170,7 @@ public:
* the grains from this path.
* Sub-collections are created from folders which contain grains or sub-collections.
*/
static SaltGrains from_path (const std::string &path);
static SaltGrains from_path (const std::string &path, const std::string &pfx = std::string ());
private:
std::string m_name;

View File

@ -22,6 +22,7 @@
#include "laySaltGrain.h"
#include "laySaltGrains.h"
#include "utHead.h"
#include <QDir>
@ -107,3 +108,101 @@ TEST (2)
EXPECT_EQ (lay::SaltGrain::compare_versions ("990", "990"), 0);
EXPECT_EQ (lay::SaltGrain::compare_versions ("991", "990"), 1);
}
static std::string grains_to_string (const lay::SaltGrains &gg)
{
std::string res;
res += "[";
bool first = true;
for (lay::SaltGrains::grain_iterator g = gg.begin_grains (); g != gg.end_grains (); ++g) {
if (! first) {
res += ",";
}
first = false;
res += g->name ();
}
for (lay::SaltGrains::collection_iterator gc = gg.begin_collections (); gc != gg.end_collections (); ++gc) {
if (! first) {
res += ",";
}
first = false;
res += gc->name ();
res += grains_to_string (*gc);
}
res += "]";
return res;
}
static bool empty_dir (const QString &path)
{
QDir dir (path);
QStringList entries = dir.entryList (QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs);
for (QStringList::const_iterator e = entries.begin (); e != entries.end (); ++e) {
QFileInfo fi (dir.absoluteFilePath (*e));
if (fi.isDir ()) {
if (! empty_dir (fi.filePath ())) {
return false;
}
if (! dir.rmdir (*e)) {
return false;
}
} else if (fi.isFile ()) {
if (! dir.remove (*e)) {
return false;
}
}
}
return true;
}
TEST (3)
{
const QString grain_spec_file = QString::fromUtf8 ("grain.xml");
lay::SaltGrain g;
g.set_name ("x");
QDir tmp_dir (QFileInfo (tl::to_qstring (tmp_file ())).absolutePath ());
QDir dir_a (tmp_dir.filePath (QString::fromUtf8 ("a")));
QDir dir_b (tmp_dir.filePath (QString::fromUtf8 ("b")));
QDir dir_c (tmp_dir.filePath (QString::fromUtf8 ("c")));
QDir dir_cu (dir_c.filePath (QString::fromUtf8 ("u")));
QDir dir_cc (dir_c.filePath (QString::fromUtf8 ("c")));
QDir dir_ccv (dir_cc.filePath (QString::fromUtf8 ("v")));
tl_assert (empty_dir (tmp_dir.path ()));
lay::SaltGrains gg;
gg = lay::SaltGrains::from_path (tl::to_string (tmp_dir.path ()));
EXPECT_EQ (gg.is_empty (), true);
EXPECT_EQ (grains_to_string (gg), "[]");
tmp_dir.mkdir (dir_a.dirName ());
tmp_dir.mkdir (dir_b.dirName ());
tmp_dir.mkdir (dir_c.dirName ());
dir_c.mkdir (dir_cu.dirName ());
dir_c.mkdir (dir_cc.dirName ());
dir_cc.mkdir (dir_ccv.dirName ());
gg = lay::SaltGrains::from_path (tl::to_string (tmp_dir.path ()));
EXPECT_EQ (gg.is_empty (), true);
EXPECT_EQ (grains_to_string (gg), "[]");
EXPECT_EQ (gg.path (), tl::to_string (tmp_dir.path ()));
g.save (tl::to_string (dir_a.absoluteFilePath (grain_spec_file)));
gg = lay::SaltGrains::from_path (tl::to_string (tmp_dir.path ()));
EXPECT_EQ (gg.is_empty (), false);
EXPECT_EQ (grains_to_string (gg), "[a]");
EXPECT_EQ (gg.begin_grains ()->path (), tl::to_string (dir_a.absolutePath ()));
g.save (tl::to_string (dir_b.absoluteFilePath (grain_spec_file)));
g.save (tl::to_string (dir_cu.absoluteFilePath (grain_spec_file)));
g.save (tl::to_string (dir_ccv.absoluteFilePath (grain_spec_file)));
gg = lay::SaltGrains::from_path (tl::to_string (tmp_dir.path ()));
EXPECT_EQ (gg.is_empty (), false);
EXPECT_EQ (grains_to_string (gg), "[a,b,c[c/u,c/c[c/c/v]]]");
EXPECT_EQ (gg.begin_collections ()->path (), tl::to_string (dir_c.absolutePath ()));
}