Extensions: detect dropping URL's from disabled repositories

Report an error when dropping a URL into a repository which has been
disabled.
This commit is contained in:
Campbell Barton 2024-05-30 23:22:12 +10:00
parent b19d4d7df6
commit 29f1c96657
2 changed files with 50 additions and 0 deletions

@ -140,6 +140,16 @@ class CheckSIGINT_Context:
# Internal Utilities # Internal Utilities
# #
def _preferences_repo_find_by_remote_url(context, remote_url):
remote_url = remote_url.rstrip("/")
prefs = context.preferences
extension_repos = prefs.extensions.repos
for repo in extension_repos:
if repo.use_remote_url and repo.remote_url.rstrip("/") == remote_url:
return repo
return None
def extension_url_find_repo_index_and_pkg_id(url): def extension_url_find_repo_index_and_pkg_id(url):
from .bl_extension_utils import ( from .bl_extension_utils import (
pkg_manifest_archive_url_abs_from_remote_url, pkg_manifest_archive_url_abs_from_remote_url,
@ -1922,9 +1932,19 @@ class BlPkgPkgInstall(Operator, _BlPkgCmdMixIn):
return self.execute(context) return self.execute(context)
def _invoke_for_drop(self, context, event): def _invoke_for_drop(self, context, event):
from .bl_extension_utils import url_params_extract_repo_url
url = self.url url = self.url
print("DROP URL:", url) print("DROP URL:", url)
# First check if this is part of a disabled repository.
remote_url = url_params_extract_repo_url(url)
repo_from_url = None if remote_url is None else _preferences_repo_find_by_remote_url(context, remote_url)
if repo_from_url and not repo_from_url.enabled:
self.report({'ERROR'}, "Extension: repository \"{:s}\" exists but is disabled".format(repo_from_url.name))
return {'CANCELLED'}
_preferences_ensure_sync() _preferences_ensure_sync()
repo_index, repo_name, pkg_id, item_remote, item_local = extension_url_find_repo_index_and_pkg_id(url) repo_index, repo_name, pkg_id, item_remote, item_local = extension_url_find_repo_index_and_pkg_id(url)

@ -27,6 +27,7 @@ __all__ = (
"pkg_theme_file_list", "pkg_theme_file_list",
"platform_from_this_system", "platform_from_this_system",
"url_params_append_for_blender", "url_params_append_for_blender",
"url_params_extract_repo_url",
"file_mtime_or_none", "file_mtime_or_none",
# Public API. # Public API.
@ -356,6 +357,35 @@ def url_params_append_for_blender(url: str, blender_version: Tuple[int, int, int
return _url_params_append(url, params) return _url_params_append(url, params)
def url_params_extract_repo_url(url: str) -> Optional[str]:
# Extract `?repository=...` value from the URL and return it.
# Concatenating it where appropriate.
import urllib
import urllib.parse
# Parse the URL to get its scheme, domain, and query parameters.
parsed_url = urllib.parse.urlparse(url)
# Combine existing query parameters with new parameters
params = urllib.parse.parse_qsl(parsed_url.query)
if repo_path := next((value for key, value in params if key == "repository"), None):
if repo_path.startswith("/"):
repo_url = urllib.parse.urlunparse((
parsed_url.scheme,
parsed_url.netloc,
repo_path[1:],
None, # `parsed_url.params,`
None, # `parsed_url.query,`
None, # `parsed_url.fragment,`
))
else:
repo_url = repo_path
return repo_url
return None
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Public Repository Actions # Public Repository Actions
# #