diff --git a/xs/src/semver/semver.c b/xs/src/semver/semver.c index a193544036..527738644d 100644 --- a/xs/src/semver/semver.c +++ b/xs/src/semver/semver.c @@ -620,7 +620,7 @@ semver_numeric (semver_t *x) { return num; } -static char *semver_strdup(const char *src) { +char *semver_strdup(const char *src) { if (src == NULL) return NULL; size_t len = strlen(src) + 1; char *res = malloc(len); diff --git a/xs/src/semver/semver.h b/xs/src/semver/semver.h index 7251f51e3a..01a15fc43e 100644 --- a/xs/src/semver/semver.h +++ b/xs/src/semver/semver.h @@ -98,6 +98,9 @@ semver_is_valid (const char *s); int semver_clean (char *s); +char * +semver_strdup(const char *src); + semver_t semver_copy(const semver_t *ver); diff --git a/xs/src/slic3r/GUI/AppConfig.cpp b/xs/src/slic3r/GUI/AppConfig.cpp index 100b2d69b3..965e8185d4 100644 --- a/xs/src/slic3r/GUI/AppConfig.cpp +++ b/xs/src/slic3r/GUI/AppConfig.cpp @@ -100,7 +100,13 @@ void AppConfig::load() // Figure out if datadir has legacy presets auto ini_ver = Semver::parse(get("version")); - m_legacy_datadir = ini_ver ? *ini_ver < Semver(1, 40, 0) : true; + m_legacy_datadir = false; + if (ini_ver) { + // Make 1.40.0 alphas compare well + ini_ver->set_metadata(boost::none); + ini_ver->set_prerelease(boost::none); + m_legacy_datadir = ini_ver < Semver(1, 40, 0); + } // Override missing or keys with their defaults. this->set_defaults(); diff --git a/xs/src/slic3r/Utils/Semver.hpp b/xs/src/slic3r/Utils/Semver.hpp index bf3c78964c..87396d8124 100644 --- a/xs/src/slic3r/Utils/Semver.hpp +++ b/xs/src/slic3r/Utils/Semver.hpp @@ -22,14 +22,15 @@ public: Semver() : ver(semver_zero()) {} Semver(int major, int minor, int patch, - boost::optional metadata = boost::none, - boost::optional prerelease = boost::none) + boost::optional metadata = boost::none, + boost::optional prerelease = boost::none) + : ver(semver_zero()) { ver.major = major; ver.minor = minor; ver.patch = patch; - ver.metadata = metadata ? std::strcpy(ver.metadata, metadata->c_str()) : nullptr; - ver.prerelease = prerelease ? std::strcpy(ver.prerelease, prerelease->c_str()) : nullptr; + set_metadata(metadata); + set_prerelease(prerelease); } static boost::optional parse(const std::string &str) @@ -82,6 +83,13 @@ public: int patch() const { return ver.patch; } const char* prerelease() const { return ver.prerelease; } const char* metadata() const { return ver.metadata; } + + // Setters + void set_maj(int maj) { ver.major = maj; } + void set_min(int min) { ver.minor = min; } + void set_patch(int patch) { ver.patch = patch; } + void set_metadata(boost::optional meta) { meta ? strdup(*meta) : nullptr; } + void set_prerelease(boost::optional pre) { pre ? strdup(*pre) : nullptr; } // Comparison bool operator<(const Semver &b) const { return ::semver_compare(ver, b.ver) == -1; } @@ -124,6 +132,7 @@ private: Semver(semver_t ver) : ver(ver) {} static semver_t semver_zero() { return { 0, 0, 0, nullptr, nullptr }; } + static char * strdup(const std::string &str) { return ::semver_strdup(const_cast(str.c_str())); } };