aboutsummaryrefslogtreecommitdiff
path: root/src/hydrilla/proxy/state_impl/_operations/recompute_dependencies.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/hydrilla/proxy/state_impl/_operations/recompute_dependencies.py')
-rw-r--r--src/hydrilla/proxy/state_impl/_operations/recompute_dependencies.py58
1 files changed, 50 insertions, 8 deletions
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)