11
11
import laniakea .typing as T
12
12
from laniakea import LocalConfig
13
13
from laniakea .db import ArchiveSuite , ArchiveRepository , session_scope
14
+ from laniakea .logging import log
14
15
15
16
from .utils import (
16
17
input_int ,
@@ -27,7 +28,7 @@ def spears():
27
28
'''Configure automatic package migration.'''
28
29
29
30
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 :
31
32
"""Add or update a migration task."""
32
33
33
34
from laniakea .db import ChangesUrgency , SpearsMigrationTask
@@ -58,6 +59,8 @@ def _add_migration_task(repo_name: str, source_suites: T.List[str], target_suite
58
59
raise ValueError ('The priority value "{}" is unknown!' .format (prio_name ))
59
60
stask .delays [prio_name ] = days
60
61
62
+ return stask .make_migration_unique_name ()
63
+
61
64
62
65
@spears .command ()
63
66
def configure_all ():
@@ -133,13 +136,31 @@ def remove_hint(source_suite, target_suite, hint):
133
136
134
137
@spears .command ()
135
138
@click .argument ('config_fname' , nargs = 1 )
136
- def add_from_config (config_fname ):
139
+ def update_from_config (config_fname ):
137
140
"""Add/update migration tasks from a TOML config file."""
141
+ from laniakea .db import SpearsHint , SpearsExcuse , SpearsMigrationTask
142
+
138
143
try :
139
144
with open (config_fname , 'r' , encoding = 'utf-8' ) as f :
140
145
conf = tomlkit .load (f )
141
146
except Exception as e :
142
147
print_error_exit ('Unable to load data from configuration file: {}' .format (str (e )))
143
148
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