Skip to content

Commit 4be58b2

Browse files
committed
Fixing tests, only 15 remaining.
1 parent 09551e8 commit 4be58b2

File tree

4 files changed

+86
-101
lines changed

4 files changed

+86
-101
lines changed

src/downloader/jobs/process_db_index_worker.py

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
from downloader.jobs.errors import WrongDatabaseOptions
3131
from downloader.jobs.fetch_file_job import FetchFileJob
3232
from downloader.jobs.process_zip_index_job import ProcessZipIndexJob
33-
from downloader.path_package import PathPackage, PathType, RemovedCopy
33+
from downloader.path_package import PathPackage, PathType, RemovedCopy, PEXT_KIND_EXTERNAL, PATH_PACKAGE_KIND_STANDARD, \
34+
PEXT_KIND_STANDARD, PATH_PACKAGE_KIND_PEXT
3435
from downloader.jobs.process_db_index_job import ProcessDbIndexJob
3536
from downloader.jobs.index import Index
3637
from downloader.jobs.validate_file_job import ValidateFileJob
@@ -225,30 +226,36 @@ def process_create_folder_packages(ctx: DownloaderWorkerContext, create_folder_p
225226
ctx.swallow_error(e)
226227

227228
folder_copies_to_be_removed: List[Tuple[bool, str, str, PathType]] = []
228-
parents: Dict[str, Dict[str, PathPackage]] = defaultdict(defaultdict)
229229
processing_folders: List[PathPackage] = []
230+
231+
parent_drives: Dict[str, set[str]] = defaultdict(set)
230232
parent_pkgs: Dict[str, PathPackage] = dict()
233+
parents_to_add: List[PathPackage] = []
231234

232235
for pkg in sorted(create_folder_pkgs, key=lambda x: len(x.rel_path)):
233-
if pkg.is_pext_parent():
236+
if pkg.kind != PATH_PACKAGE_KIND_PEXT:
237+
processing_folders.append(pkg)
238+
elif pkg.is_pext_parent():
234239
parent_pkgs[pkg.rel_path] = pkg
235240
continue
236-
237-
processing_folders.append(pkg)
238-
239-
if pkg.pext_props:
240-
if pkg.pext_props.drive not in parents[pkg.pext_props.parent]:
241-
p_pkg = pkg.pext_props.parent_pkg()
242-
parents[pkg.pext_props.parent][pkg.pext_props.drive] = p_pkg
243-
if pkg.pext_props.parent in parent_pkgs:
244-
p_pkg.description.update(parent_pkgs[pkg.pext_props.parent].description)
241+
else:
242+
processing_folders.append(pkg)
243+
244+
pkg_parent = pkg.pext_props.parent
245+
if pkg_parent in parent_pkgs and pkg.drive not in parent_drives[pkg_parent]:
246+
parent_drives[pkg_parent].add(pkg.drive)
247+
parent_pkg = parent_pkgs[pkg_parent].clone()
248+
parent_pkg.drive = pkg.drive
249+
parent_pkg.pext_props.kind = pkg.pext_props.kind
250+
parent_pkg.pext_props.drive = pkg.pext_props.drive
251+
parent_pkg.pext_props.parent = ''
252+
parents_to_add.append(parent_pkg)
245253

246254
_maybe_add_copies_to_remove(ctx, folder_copies_to_be_removed, store, pkg.rel_path, pkg.pext_drive())
247255

248-
for parent_path, drives in parents.items():
249-
for d, parent_pkg in drives.items():
250-
processing_folders.append(parent_pkg)
251-
_maybe_add_copies_to_remove(ctx, folder_copies_to_be_removed, store, parent_path, d)
256+
for parent_pkg in parents_to_add:
257+
processing_folders.append(parent_pkg)
258+
_maybe_add_copies_to_remove(ctx, folder_copies_to_be_removed, store, parent_pkg.rel_path, parent_pkg.drive)
252259

253260
ctx.logger.bench('add_processed_folders start: ', db_id, len(processing_folders))
254261
non_existing_folders = ctx.installation_report.add_processed_folders(processing_folders, db_id)

src/downloader/local_store_wrapper.py

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,14 +161,29 @@ def add_file_pkg(self, file_pkg: PathPackage):
161161
else:
162162
self.add_file(file_pkg.rel_path, file_pkg.description)
163163

164+
def remove_file_pkg(self, file_pkg: PathPackage):
165+
if file_pkg.is_pext_external():
166+
self.remove_external_file(file_pkg.drive, file_pkg.rel_path)
167+
else:
168+
self.remove_local_file(file_pkg.rel_path)
169+
164170
def add_folder_pkg(self, folder_pkg: PathPackage):
165171
if folder_pkg.is_pext_external():
166172
self.add_external_folder(folder_pkg.pext_props.drive, folder_pkg.rel_path, folder_pkg.description)
167173
else:
168174
self.add_folder(folder_pkg.rel_path, folder_pkg.description)
169175

170-
def add_file(self, file, description):
171-
self._add_entry('files', file, description)
176+
def remove_folder_pkg(self, folder_pkg: PathPackage):
177+
if folder_pkg.is_pext_external():
178+
self.remove_external_folder(folder_pkg.drive, folder_pkg.rel_path)
179+
else:
180+
self.remove_local_folder(folder_pkg.rel_path)
181+
182+
def add_file(self, file_path, description):
183+
if file_path in self._external_additions['files']:
184+
for drive in self._external_additions['files'][file_path]:
185+
self.remove_external_file(drive, file_path)
186+
self._add_entry('files', file_path, description)
172187

173188
def add_folder(self, folder, description):
174189
self._add_entry('folders', folder, description)
@@ -189,6 +204,13 @@ def add_external_folder(self, drive, folder_path, description):
189204
self._add_external_entry('folders', drive, folder_path, description)
190205

191206
def add_external_file(self, drive, file_path, description):
207+
if file_path in self._store['files']:
208+
self.remove_file(file_path)
209+
if file_path in self._external_additions['files']:
210+
for d in self._external_additions['files'][file_path]:
211+
if d == drive:
212+
continue
213+
self.remove_external_file(d, file_path)
192214
self._add_external_entry('files', drive, file_path, description)
193215

194216
def _add_external_entry(self, kind, drive, path, description):
@@ -262,7 +284,7 @@ def _clean_external_additions(self, kind, path):
262284
if changed: self._top_wrapper.mark_force_save()
263285

264286
def _remove_entry(self, kind, path):
265-
self._clean_external_additions(kind, path)
287+
#self._clean_external_additions(kind, path)
266288
self._remove_local_entry(kind, path)
267289

268290
def _remove_local_entry(self, kind, path):
@@ -405,12 +427,12 @@ def drop_removed_zips_from_store(self, db_zips):
405427
self.remove_zip_ids(removed_zip_ids)
406428

407429
def save_filtered_zip_data(self, filtered_zip_data):
408-
for drive in list(filtered_zip_data):
409-
data = filtered_zip_data[drive]
430+
for zip_id in list(filtered_zip_data):
431+
data = filtered_zip_data[zip_id]
410432
empty_files = 'files' not in data or len(data['files']) == 0
411433
empty_folders = 'folders' not in data or len(data['folders']) == 0
412434
if empty_files and empty_folders:
413-
filtered_zip_data.pop(drive)
435+
filtered_zip_data.pop(zip_id)
414436

415437
if len(filtered_zip_data):
416438
if 'filtered_zip_data' in self._store and equal_dicts(self._store['filtered_zip_data'], filtered_zip_data):

src/downloader/online_importer.py

Lines changed: 16 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ def download_dbs_contents(self, db_pkgs: list[DbSectionPackage], full_resync: bo
127127
box.add_processed_files(job.non_duplicated_files, job.db.db_id)
128128
box.add_present_validated_files(job.present_validated_files)
129129
box.add_skipped_updated_files(job.skipped_updated_files, job.db.db_id)
130-
box.add_removed_copies(job.removed_folders)
130+
box.add_removed_copies(job.removed_folders, job.db.db_id)
131131
box.add_installed_folders(job.installed_folders)
132132
box.queue_directory_removal(job.directories_to_remove, job.db.db_id)
133133
box.queue_file_removal(job.files_to_remove, job.db.db_id)
@@ -145,7 +145,7 @@ def download_dbs_contents(self, db_pkgs: list[DbSectionPackage], full_resync: bo
145145
box.add_processed_files(job.non_duplicated_files, job.db.db_id)
146146
box.add_present_validated_files(job.present_validated_files)
147147
box.add_skipped_updated_files(job.skipped_updated_files, job.db.db_id)
148-
box.add_removed_copies(job.removed_folders)
148+
box.add_removed_copies(job.removed_folders, job.db.db_id)
149149
box.add_installed_folders(job.installed_folders)
150150
box.queue_directory_removal(job.directories_to_remove, job.db.db_id)
151151
box.queue_file_removal(job.files_to_remove, job.db.db_id)
@@ -278,97 +278,36 @@ def download_dbs_contents(self, db_pkgs: list[DbSectionPackage], full_resync: bo
278278
stores[db_id].write_only().remove_folder(pkg.rel_path)
279279
stores[db_id].write_only().remove_folder_from_zips(pkg.rel_path)
280280

281-
external_parents_by_db: dict[str, dict[str, set[str]]] = defaultdict(lambda: defaultdict(set))
282-
parents_by_db: dict[str, set[str]] = defaultdict(set)
283-
all_parents_by_db: dict[str, dict[str, set[str]]] = defaultdict(lambda: defaultdict(set))
284-
285-
def add_parent(el_pkg: PathPackage, db_id: str) -> None:
286-
if el_pkg.pext_props is not None:
287-
if el_pkg.is_pext_standard():
288-
parents_by_db[db_id].add(el_pkg.pext_props.parent)
289-
else:
290-
external_parents_by_db[db_id][el_pkg.pext_props.parent].add(el_pkg.pext_props.drive)
291-
292281
for file_path in box.installed_files():
293282
file = box.processed_file(file_path)
294283
if 'reboot' in file.pkg.description and file.pkg.description['reboot'] == True:
295284
self._needs_reboot = True
296-
297-
add_parent(file.pkg, file.db_id)
298-
all_parents_by_db[file.db_id][file.pkg.parent].add(file.pkg.drive)
299-
300-
for file_path in box.installed_files():
301-
file = box.processed_file(file_path)
302-
303-
for is_external, other_drive in stores[file.db_id].read_only().list_other_drives_for_file(file.pkg.rel_path, file.pkg.pext_drive()):
304-
other_file = os.path.join(other_drive, file.pkg.rel_path)
305-
if not self._worker_ctx.file_system.is_file(other_file):
306-
if is_external:
307-
stores[file.db_id].write_only().remove_external_file(other_drive, file.pkg.rel_path)
308-
else:
309-
stores[file.db_id].write_only().remove_local_file(file.pkg.rel_path)
310-
311285
stores[file.db_id].write_only().add_file_pkg(file.pkg)
312286

313-
if file.pkg.pext_props is not None:
314-
for other in file.pkg.pext_props.other_drives:
315-
if self._worker_ctx.file_system.is_file(os.path.join(other, file.pkg.rel_path)):
316-
stores[file.db_id].write_only().add_external_file(other, file.pkg.rel_path, file.pkg.description)
317-
318287
for folder_path in sorted(box.installed_folders(), key=lambda x: len(x), reverse=True):
319288
for db_id, folder_pkg in report.processed_folder(folder_path).items():
320-
if folder_pkg.is_pext_parent():
321-
continue
322-
323289
stores[db_id].write_only().add_folder_pkg(folder_pkg)
324-
add_parent(folder_pkg, db_id)
325-
326-
for folder_path in sorted(box.installed_folders(), key=lambda x: len(x), reverse=True):
327-
for db_id, folder_pkg in report.processed_folder(folder_path).items():
328-
if not folder_pkg.is_pext_parent():
329-
continue
330-
331-
if folder_pkg.pext_props.parent in parents_by_db[db_id]:
332-
stores[db_id].write_only().add_folder(folder_pkg.rel_path, folder_pkg.description)
333-
if folder_pkg.pext_props.parent in external_parents_by_db[db_id]:
334-
for drive in external_parents_by_db[db_id][folder_pkg.pext_props.parent]:
335-
stores[db_id].write_only().add_external_folder(drive, folder_pkg.rel_path, folder_pkg.description)
336290

337291
for file_path in box.removed_files():
338292
file = box.processed_file(file_path)
339-
stores[file.db_id].write_only().remove_file(file.pkg.rel_path)
293+
stores[file.db_id].write_only().remove_file_pkg(file.pkg)
340294

341-
for is_external, el_path, drive, ty in box.removed_copies():
295+
for db_id, is_external, el_path, drive, ty in box.removed_copies():
342296
if ty == PathType.FILE:
343297
file = box.processed_file(el_path)
344-
if is_external:
345-
stores[file.db_id].write_only().remove_external_file(drive, el_path)
346-
else:
347-
stores[file.db_id].write_only().remove_local_file(el_path)
298+
stores[file.db_id].write_only().remove_file_pkg(file.pkg)
348299

349300
elif ty == PathType.FOLDER:
350-
for db_id, folder_pkg in report.processed_folder(el_path).items():
351-
if is_external:
352-
stores[db_id].write_only().remove_external_folder(drive, el_path)
353-
else:
354-
stores[db_id].write_only().remove_local_folder(el_path)
301+
if is_external:
302+
stores[db_id].write_only().remove_external_folder(el_path)
303+
else:
304+
stores[db_id].write_only().remove_folder(el_path)
355305

356306
for db_id, zip_id, zip_summary, zip_description in box.installed_zip_summary():
357307
stores[db_id].write_only().add_zip_summary(zip_id, zip_summary, zip_description)
358308

359-
filtered_zip_data = {}
360-
for db_id, zip_id, files, folders in box.filtered_zip_data():
361-
if db_id not in filtered_zip_data:
362-
filtered_zip_data[db_id] = {}
363-
364-
if zip_id not in filtered_zip_data[db_id]:
365-
filtered_zip_data[db_id][zip_id] = {'files': {}, 'folders': {}}
366-
367-
filtered_zip_data[db_id][zip_id]['files'].update(files)
368-
filtered_zip_data[db_id][zip_id]['folders'].update(folders)
369-
370-
for db_id, filtered_zip_data_by_db in filtered_zip_data.items():
371-
stores[db_id].write_only().save_filtered_zip_data(filtered_zip_data_by_db)
309+
for db_id, filtered_zip_data in box.filtered_zip_data().items():
310+
stores[db_id].write_only().save_filtered_zip_data(filtered_zip_data)
372311

373312
for store in stores.values():
374313
store.write_only().cleanup_externals()
@@ -459,10 +398,10 @@ def __init__(self):
459398
self._full_partitions: dict[str, int] = dict()
460399
self._failed_db_options: list[WrongDatabaseOptions] = []
461400
self._removed_files: list[str] = []
462-
self._removed_copies: list[RemovedCopy] = []
401+
self._removed_copies: list[tuple[str, bool, str, str, PathType]] = []
463402
self._removed_zips: list[tuple[str, str]] = []
464403
self._skipped_updated_files: dict[str, list[str]] = dict()
465-
self._filtered_zip_data: list[tuple[str, str, dict[str, Any], dict[str, Any]]] = []
404+
self._filtered_zip_data: dict[str, dict[str, dict[str, dict[str, Any]]]] = defaultdict(dict)
466405
self._installed_zip_summary: list[tuple[str, str, StoreFragmentDrivePaths, dict[str, Any]]] = []
467406
self._installed_folders: set[str] = set()
468407
self._directories = dict()
@@ -534,9 +473,7 @@ def add_installed_db(self, db: DbEntity):
534473
def add_updated_db(self, db_id: str):
535474
self._updated_dbs.append(db_id)
536475
def add_filtered_zip_data(self, db_id: str, zip_id: str, filtered_data: FileFoldersHolder) -> None:
537-
files, folders = filtered_data['files'], filtered_data['folders']
538-
#if len(files) == 0 and len(folders) == 0: return
539-
self._filtered_zip_data.append((db_id, zip_id, files, folders))
476+
self._filtered_zip_data[db_id][zip_id] = filtered_data
540477
def add_failed_db_options(self, exception: WrongDatabaseOptions):
541478
self._failed_db_options.append(exception)
542479
def add_removed_file(self, file: str):
@@ -545,9 +482,9 @@ def add_removed_files(self, files: list[PathPackage]):
545482
if len(files) == 0: return
546483
for pkg in files:
547484
self._removed_files.append(pkg.rel_path)
548-
def add_removed_copies(self, copies: list[RemovedCopy]):
485+
def add_removed_copies(self, copies: list[RemovedCopy], db_id: str):
549486
if len(copies) == 0: return
550-
self._removed_copies.extend(copies)
487+
self._removed_copies.extend([(db_id, is_external, folder_path, other_drive, el_kind) for is_external, folder_path, other_drive, el_kind in copies])
551488
def add_installed_folders(self, folders: list[PathPackage]):
552489
if len(folders) == 0: return
553490
for pkg in folders:

src/downloader/path_package.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,16 @@ def is_pext_external_subfolder(self) -> bool:
106106
def is_pext_parent(self) -> bool:
107107
return self.pext_props is not None and self.pext_props.kind == PEXT_KIND_PARENT
108108

109+
def clone(self) -> 'PathPackage':
110+
return PathPackage(
111+
self.rel_path,
112+
self.drive,
113+
self.description,
114+
self.ty,
115+
self.kind,
116+
None if self.pext_props is None else self.pext_props.clone(),
117+
)
118+
109119
def db_path(self) -> str:
110120
if self.kind == PATH_PACKAGE_KIND_PEXT:
111121
return '|' + self.rel_path
@@ -147,6 +157,15 @@ def __init__(
147157
self.other_drives = other_drives
148158
self.is_subfolder = is_subfolder
149159

160+
def clone(self) -> 'PextPathProps':
161+
return PextPathProps(
162+
self.kind,
163+
self.parent,
164+
self.drive,
165+
self.other_drives,
166+
self.is_subfolder,
167+
)
168+
150169
def parent_pkg(self) -> PathPackage:
151170
return PathPackage(self.parent, self.drive, {}, PATH_TYPE_FOLDER, PATH_PACKAGE_KIND_PEXT, PextPathProps(
152171
PEXT_KIND_PARENT, self.parent, self.drive, self.other_drives, False

0 commit comments

Comments
 (0)