aboutsummaryrefslogtreecommitdiff
path: root/src/Conf.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2018-01-14 18:36:20 +0100
committerdec05eba <dec05eba@protonmail.com>2018-01-26 09:13:15 +0100
commit91ab79f1475371e6e57d00f24f98bccb7749d15a (patch)
tree40fa847c783ecdc165ad1fc6b7c5cd2a026d25b9 /src/Conf.cpp
parentb7b7b3d359765e3ffb011dc34ff928e614766666 (diff)
Add git dependencies
Diffstat (limited to 'src/Conf.cpp')
-rw-r--r--src/Conf.cpp129
1 files changed, 109 insertions, 20 deletions
diff --git a/src/Conf.cpp b/src/Conf.cpp
index 93ec6e7..41cc157 100644
--- a/src/Conf.cpp
+++ b/src/Conf.cpp
@@ -528,6 +528,22 @@ namespace sibs
return true;
}
+ SibsConfig::~SibsConfig()
+ {
+ // TODO: Fix this shit.. why does this cause segfault?
+ /*
+ for(PackageListDependency *dependency : packageListDependencies)
+ {
+ //delete dependency;
+ }
+
+ for(GitDependency *dependency : gitDependencies)
+ {
+ //delete dependency;
+ }
+ */
+ }
+
bool SibsConfig::isDefined(const std::string &name) const
{
return defines.find(name) != defines.end();
@@ -794,16 +810,7 @@ namespace sibs
}
else if(currentObject.equals("dependencies"))
{
- if(value.isSingle())
- {
- // TODO: Validate version is number in correct format
- Dependency dependency;
- dependency.name = string(name.data, name.size);
- dependency.version = string(value.asSingle().data, value.asSingle().size);
- dependencies.emplace_back(dependency);
- }
- else
- throw ParserException("Expected field under dependencies to be a single value, was a list");
+ parseDependencies(name, value);
}
else if(currentObject.equals("define"))
{
@@ -897,6 +904,97 @@ namespace sibs
}
}
+ void SibsConfig::parseDependencies(const StringView &name, const ConfigValue &value)
+ {
+ if(value.isSingle())
+ {
+ // TODO: Validate version is number in correct format
+ PackageListDependency *dependency = new PackageListDependency();
+ dependency->name = string(name.data, name.size);
+ dependency->version = string(value.asSingle().data, value.asSingle().size);
+ packageListDependencies.emplace_back(dependency);
+ }
+ else if(value.isObject())
+ {
+ enum class DepType
+ {
+ NONE,
+ GIT
+ };
+
+ DepType depType = DepType::NONE;
+ for(auto it : value.asObject())
+ {
+ DepType fieldDepType = DepType::NONE;
+ if(it.first == "git" || it.first == "branch" || it.first == "revision")
+ fieldDepType = DepType::GIT;
+
+ if(fieldDepType == DepType::NONE)
+ {
+ string errMsg = "Invalid dependency object field \"";
+ errMsg += it.first;
+ errMsg += "\"";
+ throw ParserException(errMsg);
+ }
+
+ if(depType != DepType::NONE && fieldDepType != depType)
+ {
+ switch(depType)
+ {
+ case DepType::GIT:
+ {
+ string errMsg = "Invalid dependency object field \"";
+ errMsg += it.first;
+ errMsg += "\" is invalid for a git dependency";
+ throw ParserException(errMsg);
+ }
+ default:
+ throw ParserException("Invalid dependency object");
+ }
+ }
+ depType = fieldDepType;
+ }
+
+ switch(depType)
+ {
+ case DepType::GIT:
+ {
+ auto gitIt = value.asObject().find("git");
+ if(gitIt == value.asObject().end())
+ {
+ throw ParserException("Required field \"git\" is missing from git dependency. Expected an url to location of git repository");
+ }
+
+ auto branchIt = value.asObject().find("branch");
+ string branch;
+ if(branchIt == value.asObject().end())
+ branch = "master";
+ else
+ branch = string(branchIt->second.data, branchIt->second.size);
+
+ auto revisionIt = value.asObject().find("revision");
+ string revision;
+ if(revisionIt == value.asObject().end())
+ revision = "HEAD";
+ else
+ revision = string(revisionIt->second.data, revisionIt->second.size);
+
+ GitDependency *dependency = new GitDependency();
+ dependency->name = string(name.data, name.size);
+ dependency->url = string(gitIt->second.data, gitIt->second.size);
+ dependency->branch = branch;
+ dependency->revision = revision;
+ gitDependencies.emplace_back(dependency);
+ break;
+ }
+ default:
+ throw ParserException("Invalid dependency object");
+ }
+ }
+ else
+ throw ParserException("Expected field under dependencies to be a single value or an object, was a list");
+ }
+
void SibsConfig::parseCLang(const StringView &fieldName, const ConfigValue &fieldValue)
{
if(fieldName.equals("version"))
@@ -1183,16 +1281,7 @@ namespace sibs
{
if(currentObject.equals("dependencies"))
{
- if(value.isSingle())
- {
- // TODO: Validate version is number in correct format
- Dependency dependency;
- dependency.name = string(name.data, name.size);
- dependency.version = string(value.asSingle().data, value.asSingle().size);
- dependencies.emplace_back(dependency);
- }
- else
- throw ParserException("Expected field under dependencies to be a single value, was a list");
+ parseDependencies(name, value);
}
else
{