From 367ea85057368047a50ae98a3510e0113eadd744 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Thu, 25 Aug 2022 16:37:53 +0200 Subject: [proxy] make it possible to uninstall a package This commit also brings some more refactoring under state_impl/. --- .../_operations/recompute_dependencies.py | 58 +++++++++++++++++++--- 1 file changed, 50 insertions(+), 8 deletions(-) (limited to 'src/hydrilla/proxy/state_impl/_operations/recompute_dependencies.py') diff --git a/src/hydrilla/proxy/state_impl/_operations/recompute_dependencies.py b/src/hydrilla/proxy/state_impl/_operations/recompute_dependencies.py index d4c4d45..327a195 100644 --- a/src/hydrilla/proxy/state_impl/_operations/recompute_dependencies.py +++ b/src/hydrilla/proxy/state_impl/_operations/recompute_dependencies.py @@ -36,6 +36,7 @@ import typing as t from .... import item_infos from ... import simple_dependency_satisfying as sds +from .. import base from .pull_missing_files import pull_missing_files, FileResolver, \ DummyFileResolver @@ -73,6 +74,41 @@ def _get_infos_of_type(cursor: sqlite3.Cursor, info_type: t.Type[AnyInfoVar],) \ return result +def _get_current_required_state( + cursor: sqlite3.Cursor, + unlocked_required_mappings: t.Sequence[int] +) -> list[sds.MappingRequirement]: + # For mappings explicitly enabled by the user (+ all mappings they + # recursively depend on) let's make sure that their exact same versions will + # be enabled after the change. Make exception for mappings specified by the + # caller. + with base.temporary_ids_table( + cursor = cursor, + ids = unlocked_required_mappings, + table_name = '__unlocked_ids' + ): + cursor.execute( + ''' + SELECT + definition, repo, repo_iteration + FROM + item_versions_extra + WHERE + item_id NOT IN __unlocked_ids AND active = 'R'; + ''', + ) + + rows = cursor.fetchall() + + requirements: list[sds.MappingRequirement] = [] + + for definition, repo, iteration in rows: + info = item_infos.MappingInfo.load(definition, repo, iteration) + req = sds.MappingVersionRequirement(info.identifier, info) + requirements.append(req) + + return requirements + def _mark_version_installed(cursor: sqlite3.Cursor, version_id: int) -> None: cursor.execute( ''' @@ -87,8 +123,8 @@ def _mark_version_installed(cursor: sqlite3.Cursor, version_id: int) -> None: ) def _recompute_dependencies_no_state_update_no_pull_files( - cursor: sqlite3.Cursor, - extra_requirements: t.Iterable[sds.MappingRequirement] + cursor: sqlite3.Cursor, + unlocked_required_mappings: base.NoLockArg = [], ) -> None: cursor.execute('DELETE FROM payloads;') @@ -98,7 +134,13 @@ def _recompute_dependencies_no_state_update_no_pull_files( resources_to_ids = dict((info, id) for id, info in ids_to_resources.items()) mappings_to_ids = dict((info, id) for id, info in ids_to_mappings.items()) - requirements = [*extra_requirements] + if unlocked_required_mappings == 'all_mappings_unlocked': + requirements = [] + else: + requirements = _get_current_required_state( + cursor = cursor, + unlocked_required_mappings = unlocked_required_mappings + ) cursor.execute( ''' @@ -276,13 +318,13 @@ def _recompute_dependencies_no_state_update_no_pull_files( def _recompute_dependencies_no_state_update( - cursor: sqlite3.Cursor, - extra_requirements: t.Iterable[sds.MappingRequirement] = (), - semirepo_file_resolver: FileResolver = DummyFileResolver() + cursor: sqlite3.Cursor, + unlocked_required_mappings: base.NoLockArg = [], + semirepo_file_resolver: FileResolver = DummyFileResolver() ) -> None: _recompute_dependencies_no_state_update_no_pull_files( - cursor, - extra_requirements + cursor = cursor, + unlocked_required_mappings = unlocked_required_mappings ) pull_missing_files(cursor, semirepo_file_resolver) -- cgit v1.2.3