Skip to content

Commit

Permalink
mod_update: upgrade to the latest revision
Browse files Browse the repository at this point in the history
  • Loading branch information
mrachinskiy committed Jul 4, 2020
1 parent 6ed2cd0 commit 17f333f
Show file tree
Hide file tree
Showing 8 changed files with 77 additions and 62 deletions.
9 changes: 5 additions & 4 deletions __init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@


if "bpy" in locals():
from . import var

def walk(path, parent_dir=None):
import importlib
Expand Down Expand Up @@ -65,7 +66,6 @@ def walk(path, parent_dir=None):
from bpy.props import PointerProperty

from . import (
var,
preferences,
proxy_effector,
op_offset,
Expand All @@ -77,8 +77,6 @@ def walk(path, parent_dir=None):
)


var.UPDATE_VERSION_CURRENT = bl_info["version"]

classes = (
preferences.CommotionShapeKeyCollection,
preferences.CommotionPreferences,
Expand Down Expand Up @@ -111,7 +109,10 @@ def register():
bpy.types.Scene.commotion = PointerProperty(type=preferences.SceneProperties)
bpy.types.WindowManager.commotion = PointerProperty(type=preferences.WmProperties)

mod_update.update_init_check()
mod_update.init(
addon_version=bl_info["version"],
releases_url="https://api.github.com/repos/mrachinskiy/commotion/releases",
)


def unregister():
Expand Down
3 changes: 2 additions & 1 deletion mod_update/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
# ##### END GPL LICENSE BLOCK #####


from .lib import update_init_check, update_init_download
from . import state
from .lib import update_init_check, update_init_download, init
from .operators import WM_OT_update_check, WM_OT_update_download, WM_OT_update_whats_new
from .ui import prefs_ui, sidebar_ui
63 changes: 46 additions & 17 deletions mod_update/lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,26 @@
from . import state


ADDON_VERSION = None
RELEASES_URL = None
SAVE_STATE_FILEPATH = os.path.join(var.CONFIG_DIR, "update_state.json")


def _parse_tag(tag):
import re

vers = [
tuple(int(x) for x in ver_str)
for ver_str in
[re.sub(r"[^0-9]", " ", ver_raw).split() for ver_raw in tag.split("-")]
]

if len(vers) == 1:
vers.append((0, 0, 0))

return vers


def _save_state_deserialize():
import datetime
import json
Expand All @@ -37,8 +57,8 @@ def _save_state_deserialize():
"last_check": 0,
}

if os.path.exists(var.UPDATE_SAVE_STATE_FILEPATH):
with open(var.UPDATE_SAVE_STATE_FILEPATH, "r", encoding="utf-8") as file:
if os.path.exists(SAVE_STATE_FILEPATH):
with open(SAVE_STATE_FILEPATH, "r", encoding="utf-8") as file:
data.update(json.load(file))

last_check = datetime.date.fromtimestamp(data["last_check"])
Expand All @@ -54,14 +74,14 @@ def _save_state_serialize():

state.days_passed = 0
data = {
"update_available": var.update_available,
"update_available": state.update_available,
"last_check": int(datetime.datetime.now().timestamp()),
}

if not os.path.exists(var.CONFIG_DIR):
os.makedirs(var.CONFIG_DIR)

with open(var.UPDATE_SAVE_STATE_FILEPATH, "w", encoding="utf-8") as file:
with open(SAVE_STATE_FILEPATH, "w", encoding="utf-8") as file:
json.dump(data, file, indent=4, ensure_ascii=False)


Expand Down Expand Up @@ -100,7 +120,7 @@ def _update_check(use_force_check):

try:

with urllib.request.urlopen(var.UPDATE_URL_RELEASES, context=ssl_context) as response:
with urllib.request.urlopen(RELEASES_URL, context=ssl_context) as response:
data = json.load(response)

for release in data:
Expand All @@ -109,14 +129,13 @@ def _update_check(use_force_check):
continue

if not release["draft"]:
version_string = re.sub(r"[^0-9]", " ", release["tag_name"])
version_new = tuple(int(x) for x in version_string.split())

if var.update_block(version_new):
continue
update_version, required_blender = _parse_tag(release["tag_name"])

if version_new > var.UPDATE_VERSION_CURRENT:
break
if update_version > ADDON_VERSION:
if required_blender <= bpy.app.version:
break
else:
continue
else:
_save_state_serialize()
_runtime_state_set(None)
Expand All @@ -131,10 +150,10 @@ def _update_check(use_force_check):

prerelease_note = " (pre-release)" if release["prerelease"] else ""

var.update_available = True
state.version_new = release["tag_name"] + prerelease_note
state.url_download = asset["browser_download_url"]
state.url_changelog = release["html_url"]
state.update_available = True
state.update_version = ".".join(str(x) for x in update_version) + prerelease_note
state.download_url = asset["browser_download_url"]
state.changelog_url = release["html_url"]

_save_state_serialize()
_runtime_state_set(None)
Expand All @@ -161,7 +180,7 @@ def _update_download():

try:

with urllib.request.urlopen(state.url_download, context=ssl_context) as response:
with urllib.request.urlopen(state.download_url, context=ssl_context) as response:
with zipfile.ZipFile(io.BytesIO(response.read())) as zfile:
addons_dir = os.path.dirname(var.ADDON_DIR)
extract_relpath = pathlib.Path(zfile.namelist()[0])
Expand All @@ -185,3 +204,13 @@ def update_init_check(use_force_check=False):

def update_init_download():
threading.Thread(target=_update_download).start()


def init(addon_version=None, releases_url=None):
global ADDON_VERSION
global RELEASES_URL

ADDON_VERSION = addon_version
RELEASES_URL = releases_url

update_init_check()
13 changes: 4 additions & 9 deletions mod_update/operators.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,10 @@
from . import state, lib


OP_IDNAME_CHECK = f"wm.{var.UPDATE_OPERATOR_ID_AFFIX}_update_check"
OP_IDNAME_DOWNLOAD = f"wm.{var.UPDATE_OPERATOR_ID_AFFIX}_update_download"
OP_IDNAME_WHATS_NEW = f"wm.{var.UPDATE_OPERATOR_ID_AFFIX}_update_whats_new"


class WM_OT_update_check(Operator):
bl_label = "Check for Updates"
bl_description = "Check for new add-on release"
bl_idname = OP_IDNAME_CHECK
bl_idname = f"wm.{var.ADDON_ID}_update_check"
bl_options = {"INTERNAL"}

def execute(self, context):
Expand All @@ -52,7 +47,7 @@ def execute(self, context):
class WM_OT_update_download(Operator):
bl_label = "Install Update"
bl_description = "Download and install new version of the add-on"
bl_idname = OP_IDNAME_DOWNLOAD
bl_idname = f"wm.{var.ADDON_ID}_update_download"
bl_options = {"INTERNAL"}

def execute(self, context):
Expand All @@ -71,10 +66,10 @@ def execute(self, context):
class WM_OT_update_whats_new(Operator):
bl_label = "See What's New"
bl_description = "Open release notes in web browser"
bl_idname = OP_IDNAME_WHATS_NEW
bl_idname = f"wm.{var.ADDON_ID}_update_whats_new"
bl_options = {"INTERNAL"}

def execute(self, context):
import webbrowser
webbrowser.open(state.url_changelog)
webbrowser.open(state.changelog_url)
return {"FINISHED"}
8 changes: 5 additions & 3 deletions mod_update/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@

status = None
days_passed = None
version_new = None
url_download = None
url_changelog = None
update_version = None
download_url = None
changelog_url = None
error_msg = None

update_available = False
19 changes: 9 additions & 10 deletions mod_update/ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@

from bpy.app.translations import pgettext_iface as _

from .. import var
from . import state, operators


Expand All @@ -40,7 +39,7 @@ def prefs_ui(self, layout):

if state.status is state.COMPLETED:
row.label(text="Update completed")
row.operator(operators.OP_IDNAME_WHATS_NEW)
row.operator(operators.WM_OT_update_whats_new.bl_idname)

row = layout.row(align=True)
row.alignment = "CENTER"
Expand All @@ -55,8 +54,8 @@ def prefs_ui(self, layout):
elif state.status is state.ERROR:
row.label(text=state.error_msg)

elif var.update_available:
row.label(text=_("Update {} is available").format(state.version_new))
elif state.update_available:
row.label(text=_("Update {} is available").format(state.update_version))

else:
if state.days_passed is None:
Expand All @@ -75,10 +74,10 @@ def prefs_ui(self, layout):
col.scale_y = 1.5
col.enabled = state.status is None or state.status is state.ERROR

if var.update_available:
col.operator(operators.OP_IDNAME_DOWNLOAD)
if state.update_available:
col.operator(operators.WM_OT_update_download.bl_idname)
else:
col.operator(operators.OP_IDNAME_CHECK)
col.operator(operators.WM_OT_update_check.bl_idname)


def sidebar_ui(self, context):
Expand All @@ -91,7 +90,7 @@ def sidebar_ui(self, context):

if state.status is state.COMPLETED:
row.label(text="Update completed")
row.operator(operators.OP_IDNAME_WHATS_NEW)
row.operator(operators.WM_OT_update_whats_new.bl_idname)

row = layout.row(align=True)
row.alignment = "CENTER"
Expand All @@ -104,10 +103,10 @@ def sidebar_ui(self, context):
row.label(text=state.error_msg)

else:
row.label(text=_("Update {} is available").format(state.version_new))
row.label(text=_("Update {} is available").format(state.update_version))

col = layout.row()
col.alignment = "CENTER"
col.scale_y = 1.5
col.enabled = state.status is None or state.status is state.ERROR
col.operator(operators.OP_IDNAME_DOWNLOAD)
col.operator(operators.WM_OT_update_download.bl_idname)
4 changes: 2 additions & 2 deletions ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

from bpy.types import Panel

from . import var, mod_update
from . import mod_update


# Utils
Expand All @@ -44,7 +44,7 @@ class VIEW3D_PT_commotion_update(Setup, Panel):

@classmethod
def poll(cls, context):
return var.update_available
return mod_update.state.update_available

def draw(self, context):
mod_update.sidebar_ui(self, context)
Expand Down
20 changes: 4 additions & 16 deletions var.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,10 @@
import os


ADDON_ID = __package__
ADDON_DIR = os.path.dirname(__file__)
CONFIG_DIR = os.path.join(ADDON_DIR, ".config")


# mod_update
# Paths
# --------------------------------


UPDATE_OPERATOR_ID_AFFIX = "commotion"
UPDATE_SAVE_STATE_FILEPATH = os.path.join(CONFIG_DIR, "update_state.json")
UPDATE_URL_RELEASES = "https://api.github.com/repos/mrachinskiy/commotion/releases"
UPDATE_VERSION_CURRENT = None

update_available = False


def update_block(version_new):
return False
ADDON_ID = __package__
ADDON_DIR = os.path.dirname(__file__)
CONFIG_DIR = os.path.join(ADDON_DIR, ".config")

0 comments on commit 17f333f

Please sign in to comment.