mirror of
https://github.com/geode-sdk/geode.git
synced 2024-11-14 19:15:05 -05:00
add suffixes to versions
This commit is contained in:
parent
ef55605b5b
commit
4c4674da93
11 changed files with 142 additions and 29 deletions
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -4,3 +4,6 @@
|
|||
[submodule "loader/minhook"]
|
||||
path = loader/minhook
|
||||
url = https://github.com/TsudaKageyu/minhook
|
||||
[submodule "loader/include/Geode/external/scnlib"]
|
||||
path = loader/include/Geode/external/scnlib
|
||||
url = https://github.com/eliaskosunen/scnlib
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
# Geode Changelog
|
||||
|
||||
## v0.7.0
|
||||
- Jesus H. Christmas Kallen there's like 300 new commits since v0.6.1 I don't think there's a point in listing them all, we basically redesigned the whole framework
|
||||
|
||||
## v0.6.1
|
||||
- Add `geode::cocos::switchToScene` utility for easily switching to a layer with the default fade transition
|
||||
- Add `Mod::getPackagePath` as a replacement for `Mod::getPath`
|
||||
|
|
|
@ -83,6 +83,7 @@ add_definitions(-DFMT_CONSTEVAL=)
|
|||
|
||||
add_subdirectory(loader/include/Geode/external/filesystem)
|
||||
add_subdirectory(loader/include/Geode/external/fmt)
|
||||
add_subdirectory(loader/include/Geode/external/scnlib)
|
||||
|
||||
target_link_libraries(${PROJECT_NAME} INTERFACE filesystem fmt)
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
cmake_minimum_required(VERSION 3.21 FATAL_ERROR)
|
||||
|
||||
project(geode-loader VERSION ${GEODE_VERSION} LANGUAGES C CXX)
|
||||
set(PROJECT_VERSION_TYPE Alpha)
|
||||
set(PROJECT_VERSION_TYPE geode::VersionTag::Alpha)
|
||||
set(PROJECT_VERSION_SUFFIX -alpha)
|
||||
|
||||
# Package info file for internal representation
|
||||
configure_file(resources/mod.json.in ${CMAKE_CURRENT_SOURCE_DIR}/resources/mod.json)
|
||||
|
@ -127,7 +128,7 @@ target_link_libraries(${PROJECT_NAME} md4c)
|
|||
|
||||
# Lilac (hooking)
|
||||
add_subdirectory(lilac)
|
||||
target_link_libraries(${PROJECT_NAME} z lilac_hook geode-sdk)
|
||||
target_link_libraries(${PROJECT_NAME} z lilac_hook geode-sdk scn::scn)
|
||||
|
||||
# Use precompiled headers for faster builds
|
||||
target_precompile_headers(${PROJECT_NAME} PRIVATE
|
||||
|
|
1
loader/include/Geode/external/scnlib
vendored
Submodule
1
loader/include/Geode/external/scnlib
vendored
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit 72a4bab9e32f2b44593137fba40c54710e20a623
|
|
@ -13,37 +13,67 @@ namespace geode {
|
|||
};
|
||||
|
||||
/**
|
||||
* Class representing version information
|
||||
* A version label, like v1.0.0-alpha or v2.3.4-prerelease. Purely semantic,
|
||||
* and not used in comparisons; so for example v1.0.0-alpha == v1.0.0.
|
||||
*/
|
||||
enum class VersionTag {
|
||||
Alpha,
|
||||
Beta,
|
||||
Prerelease,
|
||||
};
|
||||
GEODE_DLL std::optional<VersionTag> versionTagFromString(std::string const& str);
|
||||
GEODE_DLL std::string versionTagToSuffixString(VersionTag tag);
|
||||
GEODE_DLL std::string versionTagToString(VersionTag tag);
|
||||
|
||||
/**
|
||||
* Class representing version information. Not strictly semver, notably in
|
||||
* regard to identifiers; identifiers are restricted to a few common ones,
|
||||
* and are purely semantic, i.e. not used in comparisons. See VersionTag
|
||||
* for details
|
||||
* @class VersionInfo
|
||||
*/
|
||||
class GEODE_DLL VersionInfo final {
|
||||
protected:
|
||||
int m_major = 1;
|
||||
int m_minor = 0;
|
||||
int m_patch = 0;
|
||||
size_t m_major = 1;
|
||||
size_t m_minor = 0;
|
||||
size_t m_patch = 0;
|
||||
std::optional<VersionTag> m_tag;
|
||||
|
||||
public:
|
||||
constexpr VersionInfo() = default;
|
||||
constexpr VersionInfo(int major, int minor, int patch) {
|
||||
constexpr VersionInfo(size_t major, size_t minor, size_t patch) {
|
||||
m_major = major;
|
||||
m_minor = minor;
|
||||
m_patch = patch;
|
||||
}
|
||||
constexpr VersionInfo(
|
||||
size_t major, size_t minor, size_t patch,
|
||||
std::optional<VersionTag> tag
|
||||
) {
|
||||
m_major = major;
|
||||
m_minor = minor;
|
||||
m_patch = patch;
|
||||
m_tag = tag;
|
||||
}
|
||||
VersionInfo(std::string const& versionString);
|
||||
static bool validate(std::string const& string);
|
||||
|
||||
constexpr int getMajor() const {
|
||||
constexpr size_t getMajor() const {
|
||||
return m_major;
|
||||
}
|
||||
|
||||
constexpr int getMinor() const {
|
||||
constexpr size_t getMinor() const {
|
||||
return m_minor;
|
||||
}
|
||||
|
||||
constexpr int getPatch() const {
|
||||
constexpr size_t getPatch() const {
|
||||
return m_patch;
|
||||
}
|
||||
|
||||
constexpr std::optional<VersionTag> getTag() const {
|
||||
return m_tag;
|
||||
}
|
||||
|
||||
// Apple clang does not support operator<=>! Yippee!
|
||||
|
||||
constexpr bool operator==(VersionInfo const& other) const {
|
||||
|
@ -67,7 +97,7 @@ namespace geode {
|
|||
std::tie(other.m_major, other.m_minor, other.m_patch);
|
||||
}
|
||||
|
||||
std::string toString() const;
|
||||
std::string toString(bool includeTag = true) const;
|
||||
};
|
||||
void GEODE_DLL to_json(nlohmann::json& json, VersionInfo const& info);
|
||||
void GEODE_DLL from_json(nlohmann::json const& json, VersionInfo& info);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"geode": "@PROJECT_VERSION@",
|
||||
"id": "geode.loader",
|
||||
"version": "@PROJECT_VERSION@",
|
||||
"version": "@PROJECT_VERSION@@PROJECT_VERSION_SUFFIX@",
|
||||
"name": "Geode",
|
||||
"developer": "Geode Team",
|
||||
"description": "The Geode mod loader",
|
||||
|
|
|
@ -3,14 +3,14 @@
|
|||
#include <Geode/utils/VersionInfo.hpp>
|
||||
|
||||
static constexpr const char* LOADER_ABOUT_MD = R"MD_SEPARATOR(@LOADER_ABOUT_MD@)MD_SEPARATOR";
|
||||
static constexpr const char* LOADER_VERSION_STR = "@PROJECT_VERSION@";
|
||||
static constexpr const char* LOADER_VERSION_STR = "@PROJECT_VERSION@@PROJECT_VERSION_SUFFIX@";
|
||||
static constexpr int LOADER_VERSION_MAJOR = @PROJECT_VERSION_MAJOR@;
|
||||
static constexpr int LOADER_VERSION_MINOR = @PROJECT_VERSION_MINOR@;
|
||||
static constexpr int LOADER_VERSION_PATCH = @PROJECT_VERSION_PATCH@;
|
||||
static constexpr geode::VersionInfo LOADER_VERSION = {
|
||||
@PROJECT_VERSION_MAJOR@,
|
||||
@PROJECT_VERSION_MINOR@,
|
||||
@PROJECT_VERSION_PATCH@
|
||||
@PROJECT_VERSION_PATCH@,
|
||||
@PROJECT_VERSION_TYPE@,
|
||||
};
|
||||
static constexpr const char* LOADER_VERSION_TYPE = "@PROJECT_VERSION_TYPE@";
|
||||
static constexpr const char* LOADER_MOD_JSON = R"JSON_SEPARATOR(@LOADER_MOD_JSON@)JSON_SEPARATOR";
|
||||
|
|
|
@ -123,4 +123,4 @@ void Loader::closePlatformConsole() {
|
|||
|
||||
bool Loader::didLastLaunchCrash() const {
|
||||
return m_impl->didLastLaunchCrash();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -60,7 +60,10 @@ void ModListCell::setupInfo(ModInfo const& info, bool spaceForTags) {
|
|||
titleLabel->limitLabelWidth(m_width / 2 - 40.f, .5f, .1f);
|
||||
this->addChild(titleLabel);
|
||||
|
||||
auto versionLabel = CCLabelBMFont::create(info.version.toString().c_str(), "bigFont.fnt");
|
||||
auto versionLabel = CCLabelBMFont::create(
|
||||
info.version.toString(false).c_str(),
|
||||
"bigFont.fnt"
|
||||
);
|
||||
versionLabel->setAnchorPoint({ .0f, .5f });
|
||||
versionLabel->setScale(.3f);
|
||||
versionLabel->setPosition(
|
||||
|
@ -70,6 +73,20 @@ void ModListCell::setupInfo(ModInfo const& info, bool spaceForTags) {
|
|||
versionLabel->setColor({ 0, 255, 0 });
|
||||
this->addChild(versionLabel);
|
||||
|
||||
if (auto tag = info.version.getTag()) {
|
||||
auto tagLabel = TagNode::create(
|
||||
versionTagToString(tag.value()).c_str()
|
||||
);
|
||||
tagLabel->setAnchorPoint({ .0f, .5f });
|
||||
tagLabel->setScale(.3f);
|
||||
tagLabel->setPosition(
|
||||
versionLabel->getPositionX() +
|
||||
versionLabel->getScaledContentSize().width + 5.f,
|
||||
versionLabel->getPositionY()
|
||||
);
|
||||
this->addChild(tagLabel);
|
||||
}
|
||||
|
||||
auto creatorStr = "by " + info.developer;
|
||||
auto creatorLabel = CCLabelBMFont::create(creatorStr.c_str(), "goldFont.fnt");
|
||||
creatorLabel->setScale(.43f);
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
#include <Geode/utils/VersionInfo.hpp>
|
||||
#include <Geode/utils/general.hpp>
|
||||
#include <Geode/external/scnlib/include/scn/scn.h>
|
||||
|
||||
USE_GEODE_NAMESPACE();
|
||||
|
||||
|
@ -13,22 +14,78 @@ USE_GEODE_NAMESPACE();
|
|||
#define GEODE_SSCANF sscanf
|
||||
#endif
|
||||
|
||||
// VersionInfo
|
||||
// VersionTag
|
||||
|
||||
bool VersionInfo::validate(std::string const& string) {
|
||||
int buf0, buf1, buf2;
|
||||
if (GEODE_SSCANF(string.c_str(), "v%d.%d.%d", &buf0, &buf1, &buf2)) return true;
|
||||
if (GEODE_SSCANF(string.c_str(), "%d.%d.%d", &buf0, &buf1, &buf2)) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
VersionInfo::VersionInfo(std::string const& versionString) {
|
||||
if (!GEODE_SSCANF(versionString.c_str(), "v%d.%d.%d", &m_major, &m_minor, &m_patch)) {
|
||||
GEODE_SSCANF(versionString.c_str(), "%d.%d.%d", &m_major, &m_minor, &m_patch);
|
||||
std::optional<VersionTag> geode::versionTagFromString(std::string const& str) {
|
||||
switch (hash(str.c_str())) {
|
||||
case hash("alpha"): return VersionTag::Alpha;
|
||||
case hash("beta"): return VersionTag::Beta;
|
||||
case hash("prerelease"): return VersionTag::Prerelease;
|
||||
default: return std::nullopt;
|
||||
}
|
||||
}
|
||||
|
||||
std::string VersionInfo::toString() const {
|
||||
std::string geode::versionTagToSuffixString(VersionTag tag) {
|
||||
switch (tag) {
|
||||
case VersionTag::Alpha: return "-alpha";
|
||||
case VersionTag::Beta: return "-beta";
|
||||
case VersionTag::Prerelease: return "-prerelease";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
std::string geode::versionTagToString(VersionTag tag) {
|
||||
switch (tag) {
|
||||
case VersionTag::Alpha: return "Alpha";
|
||||
case VersionTag::Beta: return "Beta";
|
||||
case VersionTag::Prerelease: return "Prerelease";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
// VersionInfo
|
||||
|
||||
bool VersionInfo::validate(std::string const& string) {
|
||||
std::string copy = string;
|
||||
if (copy.starts_with("v")) {
|
||||
copy = string.substr(1);
|
||||
}
|
||||
|
||||
int buf0, buf1, buf2;
|
||||
std::string bufT;
|
||||
if (scn::scan(copy, "{}.{}.{}-{}", buf0, buf1, buf2, bufT)) {
|
||||
return versionTagFromString(bufT).has_value();
|
||||
}
|
||||
if (scn::scan(copy, "{}.{}.{}", buf0, buf1, buf2)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
VersionInfo::VersionInfo(std::string const& string) {
|
||||
std::string copy = string;
|
||||
if (copy.starts_with("v")) {
|
||||
copy = string.substr(1);
|
||||
}
|
||||
std::string tag;
|
||||
scn::scan(copy, "{}.{}.{}-{}", m_major, m_minor, m_patch, tag) ||
|
||||
scn::scan(copy, "{}.{}.{}", m_major, m_minor, m_patch);
|
||||
if (tag.size()) {
|
||||
if (auto t = versionTagFromString(tag)) {
|
||||
m_tag = t;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::string VersionInfo::toString(bool includeTag) const {
|
||||
if (includeTag && m_tag) {
|
||||
return fmt::format(
|
||||
"v{}.{}.{}{}",
|
||||
m_major, m_minor, m_patch,
|
||||
versionTagToSuffixString(m_tag.value())
|
||||
);
|
||||
}
|
||||
return fmt::format("v{}.{}.{}", m_major, m_minor, m_patch);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue