diff --git a/mkspecs/features/config.pri b/mkspecs/features/config.pri index b47926d69..356eda341 100644 --- a/mkspecs/features/config.pri +++ b/mkspecs/features/config.pri @@ -20,8 +20,8 @@ BLACK_CONFIG *= AssertsInRelease BLACK_CONFIG *= PackageInstaller #BLACK_CONFIG *= Static BLACK_CONFIG *= Doxygen -#BLACK_CONFIG *= SwiftBeta -#BLACK_CONFIG *= SwiftShipped +#BLACK_CONFIG *= SwiftDevBranch +#BLACK_CONFIG *= SwiftStableBranch isEmpty(BLACK_EOL): BLACK_EOL = "20180101" @@ -43,8 +43,8 @@ include(vatsim.pri) !contains(BLACK_CONFIG, FSX) { DEFINE_WITH_FSX = "//" } !contains(BLACK_CONFIG, FS9) { DEFINE_WITH_FS9 = "//" } !contains(BLACK_CONFIG, XPlane) { DEFINE_WITH_XPLANE = "//" } -!contains(BLACK_CONFIG, SwiftBeta) { DEFINE_SWIFT_BETA = "//" } -!contains(BLACK_CONFIG, SwiftShipped) { DEFINE_SWIFT_SHIPPED = "//" } +!contains(BLACK_CONFIG, SwiftDevBranch) { DEFINE_SWIFT_DEV_BRANCH = "//" } +!contains(BLACK_CONFIG, SwiftStableBranch) { DEFINE_SWIFT_STABLE_BRANCH = "//" } !contains(BLACK_CONFIG, SwiftVatsimSupport) { DEFINE_SWIFT_VATSIM_SUPPORT = "//" } # Global compiler Macros diff --git a/src/blackconfig/buildconfig.cpp b/src/blackconfig/buildconfig.cpp index e3f0f4743..d38857e0a 100644 --- a/src/blackconfig/buildconfig.cpp +++ b/src/blackconfig/buildconfig.cpp @@ -9,12 +9,13 @@ //! \cond PRIVATE -#include "blackconfig/buildconfig.h" +#include "buildconfig.h" #include #include #include #include #include +#include #include #include #include @@ -302,8 +303,8 @@ namespace BlackConfig bool CBuildConfig::canRunInDeveloperEnvironment() { - if (CBuildConfig::isBetaTest()) { return true; } - return !CBuildConfig::isShippedVersion(); + if (CBuildConfig::isDevBranch()) { return true; } + return !CBuildConfig::isStableBranch(); } QString getDocumentationDirectoryImpl() @@ -367,29 +368,78 @@ namespace BlackConfig } } - const QString &BlackConfig::CBuildConfig::buildDateAndTime() + const QString &CBuildConfig::buildDateAndTime() { - static const QString buildDateAndTime( __DATE__ " " __TIME__ ); + // http://en.cppreference.com/w/cpp/preprocessor/replace#Predefined_macros + static const QString buildDateAndTime(__DATE__ " " __TIME__); return buildDateAndTime; } + namespace Private + { + const QDateTime buildTimestampImpl() + { + // Mar 27 2017 20:17:06 (needs to be on english locale, otherwise fails - e.g. + QDateTime dt = QLocale(QLocale::English).toDateTime(CBuildConfig::buildDateAndTime(), "MMM dd yyyy hh:mm:ss"); + dt.setUtcOffset(0); + return dt; + } + } + + const QDateTime &CBuildConfig::buildTimestamp() + { + // Mar 27 2017 20:17:06 + static const QDateTime dt = Private::buildTimestampImpl(); + return dt; + } + + const QString &CVersion::version() + { + static const QString v(versionMajorMinorPatch() + "." + QString::number(buildTimestampAsVersionSegment(CBuildConfig::buildTimestamp()))); + return v; + } + + const QList &CVersion::getVersionParts() + { + static const QList parts(splitIntoVersionParts(version())); + return parts; + } + bool CVersion::isNewerVersion(const QString &versionString) { - if (versionString.isEmpty()) { return false; } - if (CVersion::version() == versionString) { return false; } + return isNewerVersion(version(), versionString); + } - QList newer(getVersionParts(versionString)); - QList current(getVersionParts(version())); - for (int i = 0; i < current.length(); i++) + bool CVersion::isNewerVersion(const QString &aVersion, const QString &bVersion) + { + if (aVersion.isEmpty() || bVersion.isEmpty()) { return false; } + if (aVersion == bVersion) { return true; } + + const QList aParts(splitIntoVersionParts(aVersion)); + const QList bParts(splitIntoVersionParts(bVersion)); + for (int i = 0; i < bParts.length(); i++) { - if (newer.length() <= i) { return false; } - if (current.at(i) > newer.at(i)) { return false; } - if (current.at(i) < newer.at(i)) { return true; } + if (aParts.length() <= i) { return true; } + if (bParts.at(i) > aParts.at(i)) { return true; } + if (bParts.at(i) < aParts.at(i)) { return false; } + // same, try next part } return false; } - QList CVersion::getVersionParts(const QString &versionString) + int CVersion::buildTimestampAsVersionSegment(const QDateTime &buildTimestamp) + { + if (buildTimestamp.isValid()) + { + static const qint64 dt2017 = QDateTime::fromString("20170101000000", "yyyyMMddHHmmss").toMSecsSinceEpoch(); + const qint64 msSinceEpoch = buildTimestamp.toMSecsSinceEpoch(); + const qint64 msSinceSwiftEpoch = msSinceEpoch - dt2017; + return msSinceSwiftEpoch / 1000; // accuraccy second should be enough, and is shorter + } + return 0; // intentionally 0 and not zero => 0.7.3.0 <- + } + + QList CVersion::splitIntoVersionParts(const QString &versionString) { const QStringList parts = versionString.split('.'); QList partsInt; diff --git a/src/blackconfig/buildconfig.h b/src/blackconfig/buildconfig.h index aa2b7925c..4046f8a2c 100644 --- a/src/blackconfig/buildconfig.h +++ b/src/blackconfig/buildconfig.h @@ -13,10 +13,8 @@ #define BLACKCONFIG_BUILDCONFIG_H #include -#include - -class QDateTime; -class QStringList; +#include +#include namespace BlackConfig { @@ -60,15 +58,15 @@ namespace BlackConfig //! Release build? static bool isReleaseBuild(); - //! Beta test? - static bool isBetaTest(); // defined in buildconfig_gen.cpp.in + //! DEV. branch? + static bool isDevBranch(); // defined in buildconfig_gen.cpp.in + + //! STABLE branch? + static bool isStableBranch(); // defined in buildconfig_gen.cpp.in //! Can run in dev. environment? static bool canRunInDeveloperEnvironment(); - //! Shipped version? - static bool isShippedVersion(); // defined in buildconfig_gen.cpp.in - //! Vatsim enabled version? static bool isVatsimVersion(); // defined in buildconfig_gen.cpp.in @@ -154,6 +152,9 @@ namespace BlackConfig //! Returns SHA-1 of git HEAD at build time static const QString &gitHeadSha1(); + //! Build timestamp + static const QDateTime &buildTimestamp(); + //! Returns the build date and time as string static const QString &buildDateAndTime(); }; @@ -162,24 +163,36 @@ namespace BlackConfig class CVersion { public: - //! Version info - static const QString &version(); // defined in buildconfig_gen.cpp.in + //! Version info 3 segments e.g. 0.8.3 + static const QString &versionMajorMinorPatch(); // defined in buildconfig_gen.cpp.in - //! Version major - static int versionMajor(); + //! Version info 4 segments e.g. 0.8.3.12131 + static const QString &version(); - //! Version minor - static int versionMinor(); + //! 4 Parts of the version + static const QList &getVersionParts(); - //! Version patch - static int versionPatch(); + //! Major version + static int versionMajor(); // defined in buildconfig_gen.cpp.in - //! Is the given string representing a newer version? + //! Minor version + static int versionMinor(); // defined in buildconfig_gen.cpp.in + + //! Patch version + static int versionPatch(); // defined in buildconfig_gen.cpp.in + + //! Is the given string representing a newer version (newer than "me")? static bool isNewerVersion(const QString &versionString); + //! Is the bVersion newer? + static bool isNewerVersion(const QString &aVersion, const QString &bVersion); + + //! Turns build timestamp into a version number + static int buildTimestampAsVersionSegment(const QDateTime &buildTimestamp); + private: - //! Parts of version string 1.0.2 - static QList getVersionParts(const QString &versionString); + //! Parts of version string 1.0.2.1234123 + static QList splitIntoVersionParts(const QString &versionString); }; } diff --git a/src/blackconfig/buildconfig_gen.cpp.in b/src/blackconfig/buildconfig_gen.cpp.in index 18aea9293..8c75ca5af 100644 --- a/src/blackconfig/buildconfig_gen.cpp.in +++ b/src/blackconfig/buildconfig_gen.cpp.in @@ -22,8 +22,8 @@ $$DEFINE_WITH_FSX#define WITH_FSX $$DEFINE_WITH_P3D#define WITH_P3D $$DEFINE_WITH_FS9#define WITH_FS9 $$DEFINE_WITH_XPLANE#define WITH_XPLANE -$$DEFINE_SWIFT_BETA#define SWIFT_BETA -$$DEFINE_SWIFT_SHIPPED#define SWIFT_SHIPPED +$$DEFINE_SWIFT_DEV_BRANCH#define SWIFT_DEV_BRANCH +$$DEFINE_SWIFT_STABLE_BRANCH#define SWIFT_STABLE_BRANCH $$DEFINE_SWIFT_VATSIM_SUPPORT#define SWIFT_VATSIM_SUPPORT bool BlackConfig::CBuildConfig::isCompiledWithBlackCore() @@ -98,18 +98,18 @@ bool BlackConfig::CBuildConfig::isCompiledWithGui() #endif } -bool BlackConfig::CBuildConfig::isBetaTest() +bool BlackConfig::CBuildConfig::isDevBranch() { -#ifdef SWIFT_BETA +#ifdef SWIFT_DEV_BRANCH return true; #else return false; #endif } -bool BlackConfig::CBuildConfig::isShippedVersion() +bool BlackConfig::CBuildConfig::isStableBranch() { -#ifdef SWIFT_SHIPPED +#ifdef SWIFT_STABLE_BRANCH return true; #else return false; @@ -151,7 +151,7 @@ const QString &BlackConfig::CBuildConfig::gitHeadSha1() return gitHeadSha1; } -const QString &BlackConfig::CVersion::version() +const QString &BlackConfig::CVersion::versionMajorMinorPatch() { static const QString version(\"$$BLACK_VERSION\"); Q_ASSERT(!version.isEmpty()); diff --git a/src/blackmisc/filelogger.cpp b/src/blackmisc/filelogger.cpp index ebdf130f4..4c5111bf4 100644 --- a/src/blackmisc/filelogger.cpp +++ b/src/blackmisc/filelogger.cpp @@ -122,7 +122,7 @@ namespace BlackMisc m_stream << " " << QSysInfo::currentCpuArchitecture() << endl; m_stream << "Built from revision " << BlackConfig::CBuildConfig::gitHeadSha1(); - m_stream << " on " << BlackConfig::CBuildConfig::buildDateAndTime() << endl; + m_stream << " on " << BlackConfig::CBuildConfig::buildTimestamp().toString() << endl; m_stream << "Built with Qt " << QT_VERSION_STR; m_stream << " and running with Qt " << qVersion();