Skip to content

Commit 6fc555c

Browse files
committed
admin: spears: Remove unused entries when updating from config
1 parent 500dfc9 commit 6fc555c

File tree

1 file changed

+25
-4
lines changed

1 file changed

+25
-4
lines changed

src/lkadmin/spears.py

+25-4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import laniakea.typing as T
1212
from laniakea import LocalConfig
1313
from laniakea.db import ArchiveSuite, ArchiveRepository, session_scope
14+
from laniakea.logging import log
1415

1516
from .utils import (
1617
input_int,
@@ -27,7 +28,7 @@ def spears():
2728
'''Configure automatic package migration.'''
2829

2930

30-
def _add_migration_task(repo_name: str, source_suites: T.List[str], target_suite: str, delays: dict[str, int]):
31+
def _add_migration_task(repo_name: str, source_suites: T.List[str], target_suite: str, delays: dict[str, int]) -> str:
3132
"""Add or update a migration task."""
3233

3334
from laniakea.db import ChangesUrgency, SpearsMigrationTask
@@ -58,6 +59,8 @@ def _add_migration_task(repo_name: str, source_suites: T.List[str], target_suite
5859
raise ValueError('The priority value "{}" is unknown!'.format(prio_name))
5960
stask.delays[prio_name] = days
6061

62+
return stask.make_migration_unique_name()
63+
6164

6265
@spears.command()
6366
def configure_all():
@@ -133,13 +136,31 @@ def remove_hint(source_suite, target_suite, hint):
133136

134137
@spears.command()
135138
@click.argument('config_fname', nargs=1)
136-
def add_from_config(config_fname):
139+
def update_from_config(config_fname):
137140
"""Add/update migration tasks from a TOML config file."""
141+
from laniakea.db import SpearsHint, SpearsExcuse, SpearsMigrationTask
142+
138143
try:
139144
with open(config_fname, 'r', encoding='utf-8') as f:
140145
conf = tomlkit.load(f)
141146
except Exception as e:
142147
print_error_exit('Unable to load data from configuration file: {}'.format(str(e)))
143148

144-
for task_d in conf.get('MigrationTasks', []):
145-
_add_migration_task(**task_d)
149+
with session_scope() as session:
150+
entries = session.query(SpearsMigrationTask).all()
151+
known_tasks = {}
152+
for e in entries:
153+
known_tasks[e.make_migration_unique_name()] = e
154+
155+
for task_d in conf.get('MigrationTasks', []):
156+
unq_name = _add_migration_task(**task_d)
157+
log.debug('Added/updated task: %s', unq_name)
158+
known_tasks.pop(unq_name, None)
159+
160+
# delete the remaining, orphaned entries
161+
for unq_name, task in known_tasks.items():
162+
session.query(SpearsHint).filter(SpearsHint.migration_id == task.id).delete()
163+
session.query(SpearsExcuse).filter(SpearsExcuse.migration_id == task.id).delete()
164+
165+
log.debug('Removed orphaned task: %s', unq_name)
166+
session.delete(task)

0 commit comments

Comments
 (0)