From 6bb79ef033c2a2e8f12c9da6409e3547af40417c Mon Sep 17 00:00:00 2001 From: dec05eba Date: Thu, 18 Oct 2018 07:05:43 +0200 Subject: Use ranges for dependency version --- src/Package.cpp | 65 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 26 deletions(-) (limited to 'src/Package.cpp') diff --git a/src/Package.cpp b/src/Package.cpp index eab0680..925de82 100644 --- a/src/Package.cpp +++ b/src/Package.cpp @@ -1,5 +1,6 @@ #include "../include/Package.hpp" #include "../include/curl.hpp" +#include "../include/VersionParser.hpp" #include "../external/rapidjson/error/en.h" #ifdef GetObject @@ -37,7 +38,15 @@ namespace sibs PackageMetadata packageMetadata; packageMetadata.description.assign(description->value.GetString(), description->value.GetStringLength()); - packageMetadata.version.assign(version->value.GetString(), version->value.GetStringLength()); + + int versionStrSize = 0; + Result versionResult = parsePackageVersion({ version->value.GetString(), version->value.GetStringLength() }, &versionStrSize); + if(!versionResult) + return Result::Err("package version is in wrong fromat, error: " + versionResult.getErrMsg()); + if(versionStrSize != (int)version->value.GetStringLength()) + return Result::Err("package version is in wrong format, expected only numbers and dots (version: " + string(version->value.GetString(), version->value.GetStringLength()) + ")"); + + packageMetadata.version = versionResult.unwrap(); const auto &platformsArray = platforms->value.GetArray(); packageMetadata.platforms.reserve(platformsArray.Size()); @@ -50,6 +59,9 @@ namespace sibs } const auto &urlsArray = urls->value.GetArray(); + if(urlsArray.Empty()) + return Result::Err("Expected url list to not be empty"); + packageMetadata.urls.reserve(urlsArray.Size()); for(int i = 0; i < urlsArray.Size(); ++i) { @@ -62,16 +74,16 @@ namespace sibs return Result::Ok(packageMetadata); } - static Result getPackageUrl(const PackageMetadata &packageMetadata, const char *packageName, const char *packageVersion, Platform platform) + static Result isPackageUsableForPlatform(const PackageMetadata &packageMetadata, const char *packageName, const PackageVersionRange &versionRange, Platform platform) { - if(strcmp(packageMetadata.version.c_str(), packageVersion) != 0) + if(!versionRange.isInRange(packageMetadata.version)) { string errMsg = "Package \""; errMsg += packageName; - errMsg += "\" does not exist for version \""; - errMsg += packageVersion; + errMsg += "\" does not exist for version range \""; + errMsg += versionRange.toString(); errMsg += "\""; - return Result::Err(errMsg); + return Result::Err(errMsg); } if(!containsPlatform(getPlatformsByNames(packageMetadata.platforms), platform)) @@ -79,14 +91,14 @@ namespace sibs string errMsg = "Package \""; errMsg += packageName; errMsg += "\" with version \""; - errMsg += packageVersion; + errMsg += packageMetadata.version.toString(); errMsg += "\" does not support platform \""; errMsg += platform; errMsg += "\""; - return Result::Err(errMsg); + return Result::Err(errMsg); } - - return Result::Ok(packageMetadata.urls[0]); + + return Result::Ok(true); } // TODO: Always downloading is fine right now because the package list is small. This should later be modified to use local cache. @@ -120,11 +132,11 @@ namespace sibs return Result::Ok(packageList); } - Result Package::getPackageUrl(const char *packageName, const char *packageVersion, Platform platform) + Result Package::getPackage(const char *packageName, const PackageVersionRange &versionRange, Platform platform) { Result packageList = Package::getPackageList("https://gitlab.com/DEC05EBA/sibs_packages/raw/master/packages.json"); if(!packageList) - return Result::Err(packageList); + return Result::Err(packageList); const Document &packageDoc = *packageList.unwrap(); @@ -134,14 +146,18 @@ namespace sibs string errMsg = "No package with the name \""; errMsg += packageName; errMsg += "\" was found"; - return Result::Err(errMsg); + return Result::Err(errMsg); } if(packageMetaDataJsonIt->value.IsObject()) { Result packageMetadataResult = getPackageMetadata(packageMetaDataJsonIt->value.GetObject()); - if(!packageMetadataResult) return Result::Err(packageMetadataResult); - return ::sibs::getPackageUrl(packageMetadataResult.unwrap(), packageName, packageVersion, platform); + if(!packageMetadataResult) return packageMetadataResult; + Result packageUsableResult = isPackageUsableForPlatform(packageMetadataResult.unwrap(), packageName, versionRange, platform); + if(packageUsableResult) + return Result::Ok(packageMetadataResult.unwrap()); + else + return Result::Err(packageUsableResult); } else if(packageMetaDataJsonIt->value.IsArray()) { @@ -155,35 +171,32 @@ namespace sibs errMsg += "["; errMsg += to_string(i); errMsg += "] is not an object"; - return Result::Err(errMsg); + return Result::Err(errMsg); } Result packageMetadataResult = getPackageMetadata(packageData.GetObject()); - if(packageMetadataResult) - { - Result packageUrlResult = ::sibs::getPackageUrl(packageMetadataResult.unwrap(), packageName, packageVersion, platform); - if(packageUrlResult) - return packageUrlResult; - } + if(!packageMetadataResult) return packageMetadataResult; + if(isPackageUsableForPlatform(packageMetadataResult.unwrap(), packageName, versionRange, platform)) + return Result::Ok(packageMetadataResult.unwrap()); ++i; } string errMsg = "Package \""; errMsg += packageName; - errMsg += "\" with version \""; - errMsg += packageVersion; + errMsg += "\" in version range \""; + errMsg += versionRange.toString(); errMsg += "\" does not exist or does not exist for platform \""; errMsg += asString(platform); errMsg += "\""; - return Result::Err(errMsg); + return Result::Err(errMsg); } else { string errMsg = "No package with the name \""; errMsg += packageName; errMsg += "\" was found"; - return Result::Err(errMsg); + return Result::Err(errMsg); } } } -- cgit v1.2.3