From 91ab79f1475371e6e57d00f24f98bccb7749d15a Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sun, 14 Jan 2018 18:36:20 +0100 Subject: Add git dependencies --- src/Conf.cpp | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 109 insertions(+), 20 deletions(-) (limited to 'src/Conf.cpp') 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 { -- cgit v1.2.3