From 7e71ba68d4b7221529ad5ff8d827be115dbcbeb3 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 26 Nov 2018 11:48:00 -0500 Subject: [PATCH] Add better version handling to the DMAPI --- src/DMAPI/tgs.dm | 25 ++++++++--- src/DMAPI/tgs/core/core.dm | 73 ++++++++++++++----------------- src/DMAPI/tgs/core/datum.dm | 5 +++ src/DMAPI/tgs/core/tgs_version.dm | 22 ++++++++++ src/DMAPI/tgs/includes.dm | 1 + 5 files changed, 82 insertions(+), 44 deletions(-) create mode 100644 src/DMAPI/tgs/core/tgs_version.dm diff --git a/src/DMAPI/tgs.dm b/src/DMAPI/tgs.dm index b180057e3f..16d55d682b 100644 --- a/src/DMAPI/tgs.dm +++ b/src/DMAPI/tgs.dm @@ -107,6 +107,21 @@ var/commit //full sha of compiled commit var/origin_commit //full sha of last known remote commit. This may be null if the TGS repository is not currently tracking a remote branch +//represents a version of tgstation-server +/datum/tgs_version + var/suite //The suite version, can be >=3 + + //this group of variables can be null to represent a wild card + var/major //The major version + var/minor //The minor version + var/patch //The patch version + + var/raw_parameter //The unparsed parameter + +//if the tgs_version is a wildcard version +/datum/tgs_version/proc/Wildcard() + return + //represents a merge of a GitHub pull request /datum/tgs_revision_information/test_merge var/number //pull request number @@ -155,22 +170,22 @@ //FUNCTIONS -//Returns the respective string version of the API +//Returns the respective supported /datum/tgs_version of the API /world/proc/TgsMaximumAPIVersion() return /world/proc/TgsMinimumAPIVersion() return -//Gets the current version of the server tools running the server -/world/proc/TgsVersion() - return - //Returns TRUE if the world was launched under the server tools and the API matches, FALSE otherwise //No function below this succeeds if it returns FALSE /world/proc/TgsAvailable() return +//Gets the current /datum/tgs_version of the server tools running the server +/world/proc/TgsVersion() + return + /world/proc/TgsInstanceName() return diff --git a/src/DMAPI/tgs/core/core.dm b/src/DMAPI/tgs/core/core.dm index f63cc84eea..8be4f002f9 100644 --- a/src/DMAPI/tgs/core/core.dm +++ b/src/DMAPI/tgs/core/core.dm @@ -1,24 +1,46 @@ /world/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE) var/current_api = TGS_READ_GLOBAL(tgs) if(current_api) - TGS_ERROR_LOG("TgsNew(): TGS API datum already set ([current_api])!") + TGS_ERROR_LOG("TgsNew(): TGS API datum already set ([current_api])! Was TgsNew() called more than once?") return #ifdef TGS_V3_API minimum_required_security_level = TGS_SECURITY_TRUSTED #endif - - var/tgs_version = world.params[TGS_VERSION_PARAMETER] - if(!tgs_version) + var/raw_parameter = world.params[TGS_VERSION_PARAMETER] + if(!raw_parameter) return - var/path = SelectTgsApi(tgs_version) - if(!path) + var/datum/tgs_version/version = new(raw_parameter) + if(!version.Valid(FALSE)) + TGS_ERROR_LOG("Failed to validate TGS version parameter: [raw_parameter]!") + return + + var/api_datum + switch(version.super) + if(3) +#ifndef TGS_V3_API + TGS_ERROR_LOG("Detected V3 API but TGS_V3_API isn't defined!") +#else + switch(version.major) + if(2) + api_datum = /datum/tgs_api/v3210 +#endif + if(4) + switch(version.major) + if(0) + api_datum = /datum/tgs_api/v4 + + if(version.super != null && version.major != null && version.minor != null && version.patch != null && parsing > TgsMaximumAPIVersion()) + TGS_ERROR_LOG("Detected unknown API version! Defaulting to latest. Update the DMAPI to fix this problem.") + api_datum = /datum/tgs_api/latest + + if(!api_datum) TGS_ERROR_LOG("Found unsupported API version: [tgs_version]. If this is a valid version please report this, backporting is done on demand.") return TGS_INFO_LOG("Activating API for version [tgs_version]") - var/datum/tgs_api/new_api = new path + var/datum/tgs_api/new_api = new api_datum(version) TGS_WRITE_GLOBAL(tgs, new_api) @@ -27,40 +49,11 @@ TGS_WRITE_GLOBAL(tgs, null) TGS_ERROR_LOG("Failed to activate API!") -/world/proc/SelectTgsApi(tgs_version) - //remove the old 3.0 header - tgs_version = replacetext(tgs_version, "/tg/station 13 Server v", "") - - var/list/version_bits = splittext(tgs_version, ".") - - var/super = text2num(version_bits[1]) - var/major = text2num(version_bits[2]) - var/minor = text2num(version_bits[3]) - var/patch = text2num(version_bits[4]) - - switch(super) - if(3) -#ifndef TGS_V3_API - TGS_ERROR_LOG("Detected V3 API but TGS_V3_API isn't defined!") -#else - switch(major) - if(2) - return /datum/tgs_api/v3210 -#endif - if(4) - switch(major) - if(0) - return /datum/tgs_api/v4 - - if(super != null && major != null && minor != null && patch != null && tgs_version > TgsMaximumAPIVersion()) - TGS_ERROR_LOG("Detected unknown API version! Defaulting to latest. Update the DMAPI to fix this problem.") - return /datum/tgs_api/latest - /world/TgsMaximumAPIVersion() - return "4.0.0.0" + return new /datum/tgs_version("4.0.x.x") /world/TgsMinimumAPIVersion() - return "3.2.0.0" + return new /datum/tgs_version("3.2.0.0") /world/TgsInitializationComplete() var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) @@ -90,7 +83,9 @@ return TGS_READ_GLOBAL(tgs) != null /world/TgsVersion() - return world.params[TGS_VERSION_PARAMETER] + var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) + if(api) + return api.version /world/TgsInstanceName() var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) diff --git a/src/DMAPI/tgs/core/datum.dm b/src/DMAPI/tgs/core/datum.dm index b2f9b19cdd..fb2508059a 100644 --- a/src/DMAPI/tgs/core/datum.dm +++ b/src/DMAPI/tgs/core/datum.dm @@ -1,6 +1,11 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null) /datum/tgs_api + var/datum/tgs_version/version + +/datum/tgs_api/New(datum/tgs_version/version) + . = ..() + src.version = version /datum/tgs_api/latest parent_type = /datum/tgs_api/v4 diff --git a/src/DMAPI/tgs/core/tgs_version.dm b/src/DMAPI/tgs/core/tgs_version.dm new file mode 100644 index 0000000000..e533bd3889 --- /dev/null +++ b/src/DMAPI/tgs/core/tgs_version.dm @@ -0,0 +1,22 @@ +/datum/tgs_version/New(raw_string) + src.raw_parameter = raw_parameter + + var/list/version_bits = splittext(replacetext(raw_parameter, "/tg/station 13 Server v", ""), ".") + + suite = text2num(version_bits[1]) + if(version_bits.len > 1) + major = text2num(version_bits[2]) + if(version_bits.len > 2) + minor = text2num(version_bits[3]) + if(version_bits.len == 4) + patch = text2num(version_bits[4]) + +/datum/tgs_version/proc/Valid(allow_wildcards = FALSE) + if(suite == null) + return FALSE + if(allow_wildcards) + return TRUE + return !Wildcard() + +/datum/tgs_version/Wildcard() + return major == null || minor == null || patch == null diff --git a/src/DMAPI/tgs/includes.dm b/src/DMAPI/tgs/includes.dm index a3f10b29f5..247f1fda5d 100644 --- a/src/DMAPI/tgs/includes.dm +++ b/src/DMAPI/tgs/includes.dm @@ -1,6 +1,7 @@ #include "core\_definitions.dm" #include "core\core.dm" #include "core\datum.dm" +#include "core\tgs_version.dm" #ifdef TGS_V3_API #include "v3210\api.dm" #include "v3210\commands.dm"