Fix #121469: "Enable Add-on" ignored when already installed
The logic to handle disabling, upgrading & re-enabling extensions incorrectly assumed all installed add-ons were enabled. Resolve by only using this logic on installed & enabled add-ons.
This commit is contained in:
parent
0f1f0d92bc
commit
b5145d6889
@ -522,6 +522,28 @@ def repo_cache_store_refresh_from_prefs(repo_cache_store, include_disabled=False
|
|||||||
return repos
|
return repos
|
||||||
|
|
||||||
|
|
||||||
|
def _preferences_pkg_id_sequence_filter_enabled(
|
||||||
|
repo_item, # `RepoItem`
|
||||||
|
pkg_id_sequence, # `List[str]`
|
||||||
|
): # `-> List[str]`
|
||||||
|
import addon_utils
|
||||||
|
result = []
|
||||||
|
|
||||||
|
module_base_elem = (_ext_base_pkg_idname, repo_item.module)
|
||||||
|
|
||||||
|
for pkg_id in pkg_id_sequence:
|
||||||
|
addon_module_elem = (*module_base_elem, pkg_id)
|
||||||
|
addon_module_name = ".".join(addon_module_elem)
|
||||||
|
loaded_default, loaded_state = addon_utils.check(addon_module_name)
|
||||||
|
|
||||||
|
if not (loaded_default or loaded_state):
|
||||||
|
continue
|
||||||
|
|
||||||
|
result.append(pkg_id)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
def _preferences_ensure_disabled(
|
def _preferences_ensure_disabled(
|
||||||
*,
|
*,
|
||||||
repo_item, # `RepoItem`
|
repo_item, # `RepoItem`
|
||||||
@ -2324,24 +2346,17 @@ class EXTENSIONS_OT_package_install_files(Operator, _ExtCmdMixIn):
|
|||||||
# pylint: disable-next=attribute-defined-outside-init
|
# pylint: disable-next=attribute-defined-outside-init
|
||||||
self.pkg_id_sequence = pkg_id_sequence
|
self.pkg_id_sequence = pkg_id_sequence
|
||||||
|
|
||||||
# Detect upgrade.
|
# Detect upgrade of enabled add-ons.
|
||||||
if pkg_id_sequence:
|
if pkg_id_sequence:
|
||||||
repo_cache_store = repo_cache_store_ensure()
|
if pkg_id_sequence_upgrade := _preferences_pkg_id_sequence_filter_enabled(repo_item, pkg_id_sequence):
|
||||||
pkg_manifest_local = repo_cache_store.refresh_local_from_directory(
|
result = _preferences_ensure_disabled(
|
||||||
directory=self.repo_directory,
|
repo_item=repo_item,
|
||||||
error_fn=self.error_fn_from_exception,
|
pkg_id_sequence=pkg_id_sequence_upgrade,
|
||||||
)
|
default_set=False,
|
||||||
if pkg_manifest_local is not None:
|
error_fn=lambda ex: self.report({'ERROR'}, str(ex)),
|
||||||
pkg_id_sequence_upgrade = [pkg_id for pkg_id in pkg_id_sequence if pkg_id in pkg_manifest_local]
|
)
|
||||||
if pkg_id_sequence_upgrade:
|
self._addon_restore.append((repo_item, pkg_id_sequence_upgrade, result))
|
||||||
result = _preferences_ensure_disabled(
|
del pkg_id_sequence_upgrade
|
||||||
repo_item=repo_item,
|
|
||||||
pkg_id_sequence=pkg_id_sequence_upgrade,
|
|
||||||
default_set=False,
|
|
||||||
error_fn=lambda ex: self.report({'ERROR'}, str(ex)),
|
|
||||||
)
|
|
||||||
self._addon_restore.append((repo_item, pkg_id_sequence_upgrade, result))
|
|
||||||
del repo_cache_store, pkg_manifest_local
|
|
||||||
|
|
||||||
# Lock repositories.
|
# Lock repositories.
|
||||||
# pylint: disable-next=attribute-defined-outside-init
|
# pylint: disable-next=attribute-defined-outside-init
|
||||||
@ -2708,25 +2723,16 @@ class EXTENSIONS_OT_package_install(Operator, _ExtCmdMixIn):
|
|||||||
|
|
||||||
prefs = bpy.context.preferences
|
prefs = bpy.context.preferences
|
||||||
|
|
||||||
# Detect upgrade.
|
if pkg_id_sequence_upgrade := _preferences_pkg_id_sequence_filter_enabled(repo_item, [pkg_id]):
|
||||||
repo_cache_store = repo_cache_store_ensure()
|
|
||||||
pkg_manifest_local = repo_cache_store.refresh_local_from_directory(
|
|
||||||
directory=self.repo_directory,
|
|
||||||
error_fn=self.error_fn_from_exception,
|
|
||||||
)
|
|
||||||
is_installed = pkg_manifest_local is not None and (pkg_id in pkg_manifest_local)
|
|
||||||
del repo_cache_store, pkg_manifest_local
|
|
||||||
|
|
||||||
if is_installed:
|
|
||||||
pkg_id_sequence = (pkg_id,)
|
|
||||||
result = _preferences_ensure_disabled(
|
result = _preferences_ensure_disabled(
|
||||||
repo_item=repo_item,
|
repo_item=repo_item,
|
||||||
pkg_id_sequence=pkg_id_sequence,
|
pkg_id_sequence=pkg_id_sequence_upgrade,
|
||||||
default_set=False,
|
default_set=False,
|
||||||
error_fn=lambda ex: self.report({'ERROR'}, str(ex)),
|
error_fn=lambda ex: self.report({'ERROR'}, str(ex)),
|
||||||
)
|
)
|
||||||
self._addon_restore.append((repo_item, pkg_id_sequence, result))
|
self._addon_restore.append((repo_item, pkg_id_sequence_upgrade, result))
|
||||||
del pkg_id_sequence
|
del result
|
||||||
|
del pkg_id_sequence_upgrade
|
||||||
|
|
||||||
# Lock repositories.
|
# Lock repositories.
|
||||||
# pylint: disable-next=attribute-defined-outside-init
|
# pylint: disable-next=attribute-defined-outside-init
|
||||||
|
Loading…
x
Reference in New Issue
Block a user