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/GlobalLib.cpp | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) (limited to 'src/GlobalLib.cpp') diff --git a/src/GlobalLib.cpp b/src/GlobalLib.cpp index 242e621..61e6648 100644 --- a/src/GlobalLib.cpp +++ b/src/GlobalLib.cpp @@ -8,6 +8,7 @@ #include "../include/CmakeModule.hpp" #include "../include/Dependency.hpp" #include "../include/GitRepository.hpp" +#include "../include/VersionParser.hpp" using namespace std; @@ -69,7 +70,7 @@ namespace sibs // TODO: If return error is invalid url, then the message should be converted to // invalid package name/version. A check should be done if it is the name or version // that is invalid. - Result downloadDependencyResult = GlobalLib::downloadDependency(globalLibDependency); + Result downloadDependencyResult = GlobalLib::downloadDependency(globalLibDependency, parentConfig.platform); if(!downloadDependencyResult) return downloadDependencyResult; @@ -118,7 +119,7 @@ namespace sibs return Result::Ok(true); } - Result GlobalLib::getLibsLinkerFlags(const SibsConfig &parentConfig, const FileString &globalLibRootDir, const std::string &name, const std::string &version, LinkerFlagCallbackFunc staticLinkerFlagCallbackFunc, LinkerFlagCallbackFunc dynamicLinkerFlagCallbackFunc, GlobalIncludeDirCallbackFunc globalIncludeDirCallback) + Result GlobalLib::getLibsLinkerFlags(const SibsConfig &parentConfig, const FileString &globalLibRootDir, const std::string &name, const PackageVersionRange &versionRange, LinkerFlagCallbackFunc staticLinkerFlagCallbackFunc, LinkerFlagCallbackFunc dynamicLinkerFlagCallbackFunc, GlobalIncludeDirCallbackFunc globalIncludeDirCallback) { Result packageExistsResult = validatePackageExists(globalLibRootDir, name); if (packageExistsResult.isErr()) @@ -126,33 +127,34 @@ namespace sibs #if OS_FAMILY == OS_FAMILY_POSIX FileString namePlatformNative = name; - FileString versionPlatformNative = version; #else FileString namePlatformNative = utf8To16(name); - FileString versionPlatformNative = utf8To16(version); #endif FileString packageDir = globalLibRootDir + TINYDIR_STRING("/"); packageDir += namePlatformNative; - // TODO: Instead of checking if version is exact match, check if package has same major version - // and same or newer minor version FileString foundVersion; - walkDir(packageDir.c_str(), [&foundVersion, &versionPlatformNative](tinydir_file *file) + walkDir(packageDir.c_str(), [&foundVersion, &versionRange](tinydir_file *file) { if(file->is_dir) { - //printf("version: %s\n", file->name); - if(_tinydir_strcmp(versionPlatformNative.c_str(), file->name) == 0) + string versionUtf8 = toUtf8(file->name); + Result versionResult = parsePackageVersion({ versionUtf8.data(), versionUtf8.size() }, nullptr); + if(versionResult && versionRange.isInRange(versionResult.unwrap())) + { foundVersion = file->name; + return false; + } } + return true; }); if(foundVersion.empty()) - return Result::Err("Global lib dependency found, but version doesn't match dependency version", DependencyError::DEPENDENCY_VERSION_NO_MATCH); + return Result::Err("Global lib dependency found, but version isn't in range of version", DependencyError::DEPENDENCY_VERSION_NO_MATCH); packageDir += TINYDIR_STRING("/"); - packageDir += versionPlatformNative; + packageDir += foundVersion; return GlobalLib::getLibsLinkerFlagsCommon(parentConfig, packageDir, name, staticLinkerFlagCallbackFunc, dynamicLinkerFlagCallbackFunc, globalIncludeDirCallback); } @@ -261,13 +263,13 @@ namespace sibs } } - Result GlobalLib::downloadDependency(PackageListDependency *dependency) + Result GlobalLib::downloadDependency(PackageListDependency *dependency, Platform platform) { - Result packageUrlResult = Package::getPackageUrl(dependency->name.c_str(), dependency->version.c_str(), SYSTEM_PLATFORM); - if(!packageUrlResult) - return Result::Err(packageUrlResult); + Result packageResult = Package::getPackage(dependency->name.c_str(), dependency->version, platform); + if(!packageResult) + return Result::Err(packageResult); - const string &url = packageUrlResult.unwrap(); + const PackageMetadata &package = packageResult.unwrap(); Result libPathResult = getHomeDir(); if (!libPathResult) @@ -276,7 +278,7 @@ namespace sibs libPath += TINYDIR_STRING("/.cache/sibs/lib/"); libPath += toFileString(dependency->name); libPath += TINYDIR_STRING("/"); - libPath += toFileString(dependency->version); + libPath += package.version.toString(); FileString libArchivedFilePath = libPathResult.unwrap(); libArchivedFilePath += TINYDIR_STRING("/.cache/sibs/archive/"); @@ -286,8 +288,8 @@ namespace sibs return createArchiveDirResult; libArchivedFilePath += TINYDIR_STRING("/"); - libArchivedFilePath += toFileString(dependency->version); - Result downloadResult = curl::downloadFile(url.c_str(), libArchivedFilePath.c_str()); + libArchivedFilePath += package.version.toString(); + Result downloadResult = curl::downloadFile(package.urls[0].c_str(), libArchivedFilePath.c_str()); if(!downloadResult) return downloadResult; -- cgit v1.2.3