Files
Nexus/2023/scripts/rigging_tools/ngskintools2/version.py
2025-11-24 08:27:50 +08:00

104 lines
2.9 KiB
Python

from ngSkinTools2.api import plugin
from ngSkinTools2.api.python_compatibility import Object
COPYRIGHT = "<span>&copy; Viktoras Makauskas, 2012-2021</span>"
PRODUCT_URL = "https://www.ngskintools.com"
def pluginVersion():
"""
Unique version of plugin, e.g. "1.0beta.680". Also represents
required version of mll plugin. Automatically set at build time
"""
pluginVersion_doNotEdit = "2.4.0"
return pluginVersion_doNotEdit
def buildWatermark():
"""
returns a unique ID of this build.
will be set by a build system and stored in the plugin binary
"""
return plugin.ngst2Layers(q=True, watermark=True)
def uniqueClientId():
"""
returns a unique ID for this installation. randomly generated at first run.
"""
from ngSkinTools2.ui.options import config
if config.unique_client_id.get() is None:
config.unique_client_id.set(generate_unique_client_id())
return config.unique_client_id.get()
# returns random hexadecimal 40-long string
def generate_unique_client_id():
import random
result = ""
for i in range(10):
result += "%0.4x" % random.randrange(0xFFFF)
return result
class SemanticVersion(Object):
def __init__(self, stringVersion):
self.major = 0
self.minor = 0
self.patch = 0
self.preRelease = None
self.parse(stringVersion)
def parse(self, stringVersion):
import re
pattern = re.compile(r"(\d+)(\.(\d+)((\.)(\d+))?)?(-([a-zA-Z0-9]+))?")
def toInt(s):
try:
return int(s)
except:
return 0
result = pattern.match(stringVersion)
if result is None:
raise Exception("Invalid version string: '{0}'".format(stringVersion))
self.major = toInt(result.group(1))
self.minor = toInt(result.group(3))
self.patch = toInt(result.group(6))
self.preRelease = result.group(8)
def compare_semver(currentVersion, candidateVersion):
"""
returns negative if current version is bigger, 0 if versions are equal and positive if candidateVersion is higher.
e.g.
1.0, 1.1 -> 1
1.0, 1.0-beta -> -1
"""
currentVersion = SemanticVersion(currentVersion)
candidateVersion = SemanticVersion(candidateVersion)
if currentVersion.major != candidateVersion.major:
return candidateVersion.major - currentVersion.major
if currentVersion.minor != candidateVersion.minor:
return candidateVersion.minor - currentVersion.minor
if currentVersion.patch != candidateVersion.patch:
return candidateVersion.patch - currentVersion.patch
if currentVersion.preRelease != candidateVersion.preRelease:
if currentVersion.preRelease is None:
return -1
if candidateVersion.preRelease is None:
return 1
return 1 if candidateVersion.preRelease > currentVersion.preRelease else -1
return 0