From 59dd36f692e20fe17ebf11487747394d9a8d0197 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Tue, 14 Mar 2017 22:59:24 +0100 Subject: [PATCH] WIP: grains collections for salt package manager. --- src/lay/laySaltGrains.cc | 18 +++++-- src/lay/laySaltGrains.h | 6 +-- src/unit_tests/laySaltGrain.cc | 99 ++++++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 7 deletions(-) diff --git a/src/lay/laySaltGrains.cc b/src/lay/laySaltGrains.cc index 6e2f30f48..b44c7c05d 100644 --- a/src/lay/laySaltGrains.cc +++ b/src/lay/laySaltGrains.cc @@ -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); } diff --git a/src/lay/laySaltGrains.h b/src/lay/laySaltGrains.h index 93f256c58..a2ff4ea98 100644 --- a/src/lay/laySaltGrains.h +++ b/src/lay/laySaltGrains.h @@ -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; diff --git a/src/unit_tests/laySaltGrain.cc b/src/unit_tests/laySaltGrain.cc index 3ee047a39..581eda8f5 100644 --- a/src/unit_tests/laySaltGrain.cc +++ b/src/unit_tests/laySaltGrain.cc @@ -22,6 +22,7 @@ #include "laySaltGrain.h" +#include "laySaltGrains.h" #include "utHead.h" #include @@ -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 ())); +}