metaforce/hecl/lib/database/Project.cpp

199 lines
4.6 KiB
C++
Raw Normal View History

2015-05-21 02:33:05 +00:00
#include <sys/stat.h>
#include <errno.h>
2015-06-09 22:19:59 +00:00
#include <stdio.h>
2015-05-21 02:33:05 +00:00
#include <string.h>
#include <system_error>
#include "HECLDatabase.hpp"
2015-06-10 02:40:03 +00:00
namespace HECL
{
namespace Database
2015-05-21 02:33:05 +00:00
{
2015-06-09 23:21:45 +00:00
/**********************************************
* Project::ConfigFile
**********************************************/
2015-06-09 22:19:59 +00:00
static inline bool CheckNewLineAdvance(std::string::const_iterator& it)
{
if (*it == '\n' || *it == '\0')
{
it += 1;
return true;
}
else if (*it == '\r')
{
if (*(it+1) == '\n')
{
it += 2;
return true;
}
}
return false;
}
2015-06-10 02:40:03 +00:00
Project::ConfigFile::ConfigFile(const Project& project, const SystemString& name)
2015-06-09 22:57:21 +00:00
: m_project(project), m_name(name)
2015-05-21 02:33:05 +00:00
{
2015-06-10 02:40:03 +00:00
m_filepath = project.m_rootPath.getAbsolutePath() + _S("/.hecl/config/") + name;
2015-06-09 22:57:21 +00:00
}
2015-06-09 22:19:59 +00:00
2015-06-09 22:57:21 +00:00
std::vector<std::string> Project::ConfigFile::readLines()
{
FILE* fp = HECL::Fopen(m_filepath.c_str(), _S("r"));
2015-06-09 22:19:59 +00:00
2015-06-09 22:57:21 +00:00
std::string mainString;
char readBuf[1024];
size_t readSz;
while ((readSz = fread(readBuf, 1, 1024, fp)))
mainString += std::string(readBuf, readSz);
fclose(fp);
2015-06-09 22:19:59 +00:00
2015-06-09 22:57:21 +00:00
std::string::const_iterator begin = mainString.begin();
std::string::const_iterator end = mainString.begin();
2015-06-09 22:19:59 +00:00
2015-06-09 22:57:21 +00:00
std::vector<std::string> retval;
while (end != mainString.end())
{
std::string::const_iterator origEnd = end;
if (*end == '\0')
break;
else if (CheckNewLineAdvance(end))
2015-06-09 22:19:59 +00:00
{
2015-06-09 22:57:21 +00:00
if (begin != origEnd)
retval.push_back(std::string(begin, origEnd));
begin = end;
continue;
2015-06-09 22:19:59 +00:00
}
2015-06-09 22:57:21 +00:00
++end;
}
if (begin != end)
retval.push_back(std::string(begin, end));
2015-06-09 22:19:59 +00:00
2015-06-09 22:57:21 +00:00
return retval;
}
2015-06-09 22:19:59 +00:00
2015-06-09 22:57:21 +00:00
void Project::ConfigFile::addLine(const std::string& line)
{
std::vector<std::string> curLines = readLines();
2015-06-09 22:19:59 +00:00
2015-06-09 22:57:21 +00:00
FILE* fp = HECL::Fopen(m_filepath.c_str(), _S("w"));
for (std::string& line : curLines)
2015-05-21 02:33:05 +00:00
{
2015-06-09 22:57:21 +00:00
fwrite(line.data(), 1, line.length(), fp);
fwrite("\n", 1, 1, fp);
2015-05-21 02:33:05 +00:00
}
2015-06-09 22:57:21 +00:00
fwrite(line.data(), 1, line.length(), fp);
fwrite("\n", 1, 1, fp);
fclose(fp);
}
2015-05-21 02:33:05 +00:00
2015-06-09 22:57:21 +00:00
void Project::ConfigFile::removeLine(const std::string& refLine)
{
std::vector<std::string> curLines = readLines();
2015-05-21 02:33:05 +00:00
2015-06-09 22:57:21 +00:00
FILE* fp = HECL::Fopen(m_filepath.c_str(), _S("w"));
for (std::string& line : curLines)
2015-05-21 02:33:05 +00:00
{
2015-06-09 22:57:21 +00:00
if (line.compare(refLine))
{
fwrite(line.data(), 1, line.length(), fp);
fwrite("\n", 1, 1, fp);
}
2015-05-21 02:33:05 +00:00
}
2015-06-09 22:57:21 +00:00
fclose(fp);
}
2015-05-21 02:33:05 +00:00
2015-06-09 22:57:21 +00:00
bool Project::ConfigFile::checkForLine(const std::string& refLine)
{
std::vector<std::string> curLines = readLines();
for (std::string& line : curLines)
2015-05-21 02:33:05 +00:00
{
2015-06-09 22:57:21 +00:00
if (!line.compare(refLine))
return true;
2015-05-21 02:33:05 +00:00
}
2015-06-09 22:57:21 +00:00
return false;
}
2015-05-21 02:33:05 +00:00
2015-06-09 23:21:45 +00:00
/**********************************************
* Project
**********************************************/
2015-06-10 02:40:03 +00:00
Project::Project(const ProjectRootPath& rootPath)
2015-06-09 22:57:21 +00:00
: m_rootPath(rootPath)
{
/* Stat for existing project directory (must already exist) */
struct stat myStat;
2015-06-10 02:40:03 +00:00
if (HECL::Stat(m_rootPath.getAbsolutePath().c_str(), &myStat))
2015-06-09 22:57:21 +00:00
throw std::error_code(errno, std::system_category());
2015-05-21 02:33:05 +00:00
2015-06-09 22:57:21 +00:00
if (!S_ISDIR(myStat.st_mode))
2015-06-10 02:40:03 +00:00
throw std::invalid_argument("provided path must be a directory; '" +
m_rootPath.getAbsolutePathUTF8() + "' isn't");
2015-05-21 02:33:05 +00:00
2015-06-09 22:57:21 +00:00
/* Create project directory structure */
2015-06-10 02:40:03 +00:00
HECL::MakeDir(m_rootPath.getAbsolutePath() + _S("/.hecl"));
HECL::MakeDir(m_rootPath.getAbsolutePath() + _S("/.hecl/cooked"));
HECL::MakeDir(m_rootPath.getAbsolutePath() + _S("/.hecl/config"));
2015-05-21 02:33:05 +00:00
2015-06-09 22:57:21 +00:00
/* Create or open databases */
}
2015-05-21 02:33:05 +00:00
2015-06-10 02:40:03 +00:00
void Project::registerLogger(FLogger logger)
2015-06-09 22:57:21 +00:00
{
}
2015-06-09 22:19:59 +00:00
2015-06-10 02:40:03 +00:00
const ProjectRootPath& Project::getProjectRootPath(bool absolute) const
2015-06-09 22:57:21 +00:00
{
}
2015-06-09 22:19:59 +00:00
2015-06-10 02:40:03 +00:00
bool Project::addPaths(const std::vector<ProjectPath>& paths)
2015-06-09 22:57:21 +00:00
{
}
2015-06-09 22:19:59 +00:00
2015-06-10 02:40:03 +00:00
bool Project::removePaths(const std::vector<ProjectPath>& paths, bool recursive)
2015-06-09 22:57:21 +00:00
{
}
2015-05-21 02:33:05 +00:00
2015-06-09 22:57:21 +00:00
bool Project::addGroup(const HECL::ProjectPath& path)
{
}
2015-05-21 02:33:05 +00:00
2015-06-10 02:40:03 +00:00
bool Project::removeGroup(const ProjectPath& path)
2015-06-09 22:57:21 +00:00
{
}
2015-05-21 02:33:05 +00:00
2015-06-09 23:21:45 +00:00
const std::map<const std::string, const bool>& Project::listDataSpecs()
2015-06-09 22:57:21 +00:00
{
}
2015-05-21 02:33:05 +00:00
2015-06-09 23:21:45 +00:00
bool Project::enableDataSpecs(const std::vector<std::string>& specs)
2015-06-09 22:57:21 +00:00
{
}
2015-06-09 23:21:45 +00:00
bool Project::disableDataSpecs(const std::vector<std::string>& specs)
2015-06-09 22:57:21 +00:00
{
}
2015-06-10 02:40:03 +00:00
bool Project::cookPath(const ProjectPath& path,
2015-06-09 22:57:21 +00:00
std::function<void(std::string&, Cost, unsigned)> feedbackCb,
bool recursive)
{
}
void Project::interruptCook()
{
}
2015-06-10 02:40:03 +00:00
bool Project::cleanPath(const ProjectPath& path, bool recursive)
2015-06-09 22:57:21 +00:00
{
}
2015-05-21 02:33:05 +00:00
2015-06-10 02:40:03 +00:00
Project::PackageDepsgraph Project::buildPackageDepsgraph(const ProjectPath& path)
2015-05-21 02:33:05 +00:00
{
}
}
2015-06-10 02:40:03 +00:00
}