Expose compare-version helper publicly.
This helper was added for Catalog version checking, but will be used in FlightGear now, so move it to strutils.
This commit is contained in:
parent
8dbabc8b43
commit
92ebdbfacc
@ -587,6 +587,40 @@ namespace simgear {
|
||||
// reached end - longer wins
|
||||
return v1parts.size() - v2parts.size();
|
||||
}
|
||||
|
||||
bool compareVersionToWildcard(const std::string& aVersion, const std::string& aCandidate)
|
||||
{
|
||||
if (aCandidate == aVersion) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// examine each dot-seperated component in turn, supporting a wildcard
|
||||
// in the versions from the catalog.
|
||||
string_list parts = split(aVersion, ".");
|
||||
string_list candidateParts = split(aCandidate, ".");
|
||||
|
||||
const size_t partCount = parts.size();
|
||||
const size_t candidatePartCount = candidateParts.size();
|
||||
|
||||
bool previousCandidatePartWasWildcard = false;
|
||||
|
||||
for (unsigned int p=0; p < partCount; ++p) {
|
||||
// candidate string is too short, can match if it ended with wildcard
|
||||
// part. This allows candidate '2016.*' to match '2016.1.2' and so on
|
||||
if (candidatePartCount <= p) {
|
||||
return previousCandidatePartWasWildcard;
|
||||
}
|
||||
|
||||
if (candidateParts.at(p) == "*") {
|
||||
// always passes
|
||||
previousCandidatePartWasWildcard = true;
|
||||
} else if (parts.at(p) != candidateParts.at(p)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
string join(const string_list& l, const string& joinWith)
|
||||
{
|
||||
|
@ -248,6 +248,13 @@ namespace simgear {
|
||||
const std::string& v2,
|
||||
int maxComponents = 0 );
|
||||
|
||||
/**
|
||||
@brief COmpare a version string to a template version string (which can contain wildcards)
|
||||
@param aVersion : a regular version such as 2017.6 or 2020.1.2
|
||||
@param aCandidate : a version specifier, eg 2020.* or 21.5.*
|
||||
*/
|
||||
bool compareVersionToWildcard(const std::string& aVersion, const std::string& aCandidate);
|
||||
|
||||
/**
|
||||
* Convert a string to upper case.
|
||||
* @return upper case string
|
||||
|
@ -39,43 +39,11 @@ namespace simgear {
|
||||
|
||||
namespace pkg {
|
||||
|
||||
bool checkVersionString(const std::string& aVersion, const std::string& aCandidate)
|
||||
{
|
||||
if (aCandidate == aVersion) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// examine each dot-seperated component in turn, supporting a wildcard
|
||||
// in the versions from the catalog.
|
||||
string_list appVersionParts = simgear::strutils::split(aVersion, ".");
|
||||
string_list catVersionParts = simgear::strutils::split(aCandidate, ".");
|
||||
|
||||
size_t partCount = appVersionParts.size();
|
||||
bool previousCandidatePartWasWildcard = false;
|
||||
|
||||
for (unsigned int p=0; p < partCount; ++p) {
|
||||
// candidate string is too short, can match if it ended with wildcard
|
||||
// part. This allows candidate '2016.*' to match '2016.1.2' and so on
|
||||
if (catVersionParts.size() <= p) {
|
||||
return previousCandidatePartWasWildcard;
|
||||
}
|
||||
|
||||
if (catVersionParts[p] == "*") {
|
||||
// always passes
|
||||
previousCandidatePartWasWildcard = true;
|
||||
} else if (appVersionParts[p] != catVersionParts[p]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool checkVersion(const std::string& aVersion, SGPropertyNode_ptr props)
|
||||
{
|
||||
BOOST_FOREACH(SGPropertyNode* v, props->getChildren("version")) {
|
||||
for (SGPropertyNode* v : props->getChildren("version")) {
|
||||
std::string s(v->getStringValue());
|
||||
if (checkVersionString(aVersion, s)) {
|
||||
if (strutils::compareVersionToWildcard(aVersion, s)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -86,7 +54,7 @@ SGPropertyNode_ptr alternateForVersion(const std::string& aVersion, SGPropertyNo
|
||||
{
|
||||
for (auto v : props->getChildren("alternate-version")) {
|
||||
for (auto versionSpec : v->getChildren("version")) {
|
||||
if (checkVersionString(aVersion, versionSpec->getStringValue())) {
|
||||
if (strutils::compareVersionToWildcard(aVersion, versionSpec->getStringValue())) {
|
||||
return v;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user