WIP: next steps on package manager.

This commit is contained in:
Matthias Koefferlein 2017-03-13 23:55:57 +01:00
parent b16d8b9419
commit b98afd5a8d
2 changed files with 255 additions and 0 deletions

View File

@ -21,11 +21,115 @@
*/
#include "laySaltGrains.h"
#include "tlString.h"
#include <QDir>
#include <QFileInfo>
namespace lay
{
SaltGrains::SaltGrains ()
{
// .. nothing yet ..
}
bool
SaltGrains::operator== (const SaltGrains &other) const
{
return m_name == other.m_name &&
m_path == other.m_path &&
m_title == other.m_title &&
m_collections == other.m_collections &&
m_grains == other.m_grains;
}
void
SaltGrains::set_name (const std::string &n)
{
m_name = n;
}
void
SaltGrains::set_title (const std::string &t)
{
m_title = t;
}
void
SaltGrains::set_path (const std::string &p)
{
m_path = p;
}
void
SaltGrains::add_collection (const SaltGrains &collection)
{
m_collections.push_back (collection);
}
void
SaltGrains::remove_collection (collection_iterator iter)
{
// NOTE: this is kind of inefficient, but in order to maintain the const iterator semantics this approach is required
for (collections_type::iterator i = m_collections.begin (); i != m_collections.end (); ++i) {
if (i == iter) {
m_collections.erase (i);
break;
}
}
}
void
SaltGrains::add_grain (const SaltGrain &grain)
{
m_grains.push_back (grain);
}
void
SaltGrains::remove_grain (grain_iterator iter)
{
// NOTE: this is kind of inefficient, but in order to maintain the const iterator semantics this approach is required
for (grains_type::iterator i = m_grains.begin (); i != m_grains.end (); ++i) {
if (i == iter) {
m_grains.erase (i);
break;
}
}
}
bool
SaltGrains::is_empty () const
{
return m_collections.empty () && m_grains.empty ();
}
SaltGrains
SaltGrains::from_path (const std::string &path)
{
SaltGrains grains;
QDir dir (tl::to_qstring (path));
QStringList entries = dir.entryList (QDir::NoFilter, QDir::Name);
for (QStringList::const_iterator e = entries.begin (); e != entries.end (); ++e) {
std::string epath = tl::to_string (dir.absoluteFilePath (*e));
if (SaltGrain::is_grain (epath)) {
try {
grains.add_grain (SaltGrain::from_path (epath));
} catch (...) {
// ignore errors (TODO: what to do here?)
}
} else if (QFileInfo (tl::to_qstring (epath)).isDir ()) {
SaltGrains c = SaltGrains::from_path (epath);
if (! c.is_empty ()) {
grains.add_collection (c);
}
}
}
return grains;
}
}

View File

@ -23,11 +23,162 @@
#ifndef HDR_laySaltGrains
#define HDR_laySaltGrains
#include "laySaltGrain.h"
#include <list>
namespace lay
{
/**
* @brief A class representing a collection of grains (packages)
* A collection can have child collections and grains (leafs).
*/
class LAY_PUBLIC SaltGrains
{
public:
typedef std::list<SaltGrains> collections_type;
typedef collections_type::const_iterator collection_iterator;
typedef std::list<SaltGrain> grains_type;
typedef grains_type::const_iterator grain_iterator;
/**
* @brief Constructor: creates an empty collection
*/
SaltGrains ();
/**
* @brief Equality
*/
bool operator== (const SaltGrains &other) const;
/**
* @brief Inequality
*/
bool operator!= (const SaltGrains &other) const
{
return !operator== (other);
}
/**
* @brief Gets the name of the grain collection
*
* The name is either a plain name (a word) or a path into a collection.
* Name paths are formed using the "/" separator. "mycollection" is a plain name,
* while "mycollection/subcollection" is a collection within a collection.
*/
const std::string &name () const
{
return m_name;
}
/**
* @brief Sets the name of the grain collection
*/
void set_name (const std::string &p);
/**
* @brief Gets the title of the grain collection
*
* The title is a brief description that is shown in the title of the
* package manager.
*/
const std::string &title () const
{
return m_title;
}
/**
* @brief Sets the title of the grain collection
*/
void set_title (const std::string &t);
/**
* @brief Gets the absolute file path of the installed grain
* This is the file path to the grain folder.
*/
const std::string &path () const
{
return m_path;
}
/**
* @brief Sets the absolute file path of the installed grain
*/
void set_path (const std::string &p);
/**
* @brief Gets the collections which are members of this collection (begin iterator)
*/
collection_iterator begin_collections () const
{
return m_collections.begin ();
}
/**
* @brief Gets the collections which are members of this collection (end iterator)
*/
collection_iterator end_collections () const
{
return m_collections.begin ();
}
/**
* @brief Adds a collection to this collection
*/
void add_collection (const SaltGrains &collection);
/**
* @brief Removes the collection given by the collection iterator
*/
void remove_collection (collection_iterator iter);
/**
* @brief Gets the grains (leaf nodes) which are members of this collection (begin iterator)
*/
grain_iterator begin_grains () const
{
return m_grains.begin ();
}
/**
* @brief Gets the grains (leaf nodes) which are members of this collection (end iterator)
*/
grain_iterator end_grains () const
{
return m_grains.begin ();
}
/**
* @brief Adds a grain to this collection
*/
void add_grain (const SaltGrain &grain);
/**
* @brief Removes the grain given by the grain iterator
*/
void remove_grain (grain_iterator iter);
/**
* @brief Gets a value indicating whether the collection is empty
*/
bool is_empty () const;
/**
* @brief Scan grains from a given path
* This will scan the grains found within this path and return a collection containing
* 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);
private:
std::string m_name;
std::string m_title;
std::string m_path;
collections_type m_collections;
grains_type m_grains;
};
}