@@ -127,8 +127,8 @@ def create_packages_from_index(ctx: DownloaderWorkerContext, config: Config, sum
127127 List [_DeleteFolderPackage ]
128128]:
129129 calculator = ctx .target_paths_calculator_factory .target_paths_calculator (config )
130- check_file_pkgs , remove_files_pkgs = _translate_items (ctx , calculator , summary .files , PathType .FILE , store .files )
131- create_folder_pkgs , delete_folder_pkgs = _translate_items (ctx , calculator , summary .folders , PathType .FOLDER , store .folders )
130+ check_file_pkgs , remove_files_pkgs = _translate_items (ctx , calculator , summary .files , PathType .FILE , store .all_files () )
131+ create_folder_pkgs , delete_folder_pkgs = _translate_items (ctx , calculator , summary .folders , PathType .FOLDER , store .all_folders () )
132132 return check_file_pkgs , remove_files_pkgs , create_folder_pkgs , delete_folder_pkgs
133133
134134def _translate_items (ctx : DownloaderWorkerContext , calculator : TargetPathsCalculator , items : Dict [str , Dict [str , Any ]], path_type : PathType , stored : Dict [str , Dict [str , Any ]]) -> Tuple [List [PathPackage ], List [PathPackage ]]:
@@ -216,7 +216,7 @@ def try_reserve_space(ctx: DownloaderWorkerContext, file_pkgs: Iterable[PathPack
216216 return full_partitions
217217
218218
219- def process_create_folder_packages (ctx : DownloaderWorkerContext , create_folder_pkgs : List [PathPackage ], db_id : str , db_folder_index : Dict [str , Any ], store : ReadOnlyStoreAdapter ) -> Tuple [List [RemovedCopy ], List [PathPackage ], List [str ]]:
219+ def process_create_folder_packages (ctx : DownloaderWorkerContext , create_folder_pkgs : List [PathPackage ], db_id : str , db_folder_index : Dict [str , Any ], store : ReadOnlyStoreAdapter ) -> Tuple [List [PathPackage ], List [PathPackage ], List [str ]]:
220220 if len (create_folder_pkgs ) == 0 :
221221 return [], [], []
222222
@@ -225,37 +225,52 @@ def process_create_folder_packages(ctx: DownloaderWorkerContext, create_folder_p
225225 except Exception as e :
226226 ctx .swallow_error (e )
227227
228- folder_copies_to_be_removed : List [Tuple [ bool , str , str , PathType ] ] = []
228+ folder_copies_to_be_removed : List [PathPackage ] = []
229229 processing_folders : List [PathPackage ] = []
230230
231231 parent_drives : Dict [str , set [str ]] = defaultdict (set )
232232 parent_pkgs : Dict [str , PathPackage ] = dict ()
233- parents_to_add : List [PathPackage ] = []
234233
235234 for pkg in sorted (create_folder_pkgs , key = lambda x : len (x .rel_path )):
236- if pkg .kind != PATH_PACKAGE_KIND_PEXT :
237- processing_folders .append (pkg )
238- elif pkg .is_pext_parent ():
235+ if pkg .is_pext_parent ():
239236 parent_pkgs [pkg .rel_path ] = pkg
240237 continue
241- else :
242- processing_folders .append (pkg )
243238
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 )
239+ processing_folders .append (pkg )
240+ if pkg .kind != PATH_PACKAGE_KIND_PEXT :
241+ continue
253242
254- _maybe_add_copies_to_remove (ctx , folder_copies_to_be_removed , store , pkg .rel_path , pkg .pext_drive ())
243+ pkg_parent = pkg .pext_props .parent
244+ if pkg_parent not in parent_pkgs or pkg .drive in parent_drives :
245+ continue
255246
256- for parent_pkg in parents_to_add :
247+ parent_drives [pkg_parent ].add (pkg .drive )
248+ parent_pkg = parent_pkgs [pkg_parent ].clone ()
249+ parent_pkg .drive = pkg .drive
250+ parent_pkg .pext_props .kind = pkg .pext_props .kind
251+ parent_pkg .pext_props .drive = pkg .pext_props .drive
252+ parent_pkg .pext_props .parent = ''
257253 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 )
254+
255+ for pkg in processing_folders :
256+ folder_path , drive = pkg .rel_path , pkg .drive
257+ for is_external , other_drive in store .list_other_drives_for_folder (pkg ):
258+ if ctx .file_system .is_folder (os .path .join (other_drive , folder_path )):
259+ continue
260+
261+ if is_external :
262+ removed_pkg = pkg .clone_as_pext ()
263+ removed_pkg .drive = other_drive
264+ removed_pkg .pext_props .drive = other_drive
265+ removed_pkg .pext_props .kind = PEXT_KIND_EXTERNAL
266+ else :
267+ removed_pkg = pkg .clone ()
268+ removed_pkg .drive = other_drive
269+ if removed_pkg .pext_props is not None :
270+ removed_pkg .pext_props .kind = PEXT_KIND_STANDARD
271+ removed_pkg .pext_props .drive = other_drive
272+
273+ folder_copies_to_be_removed .append (removed_pkg )
259274
260275 ctx .logger .bench ('add_processed_folders start: ' , db_id , len (processing_folders ))
261276 non_existing_folders = ctx .installation_report .add_processed_folders (processing_folders , db_id )
@@ -273,15 +288,6 @@ def process_create_folder_packages(ctx: DownloaderWorkerContext, create_folder_p
273288 installed_folders = [f for f in processing_folders if f .db_path () in db_folder_index ]
274289 return folder_copies_to_be_removed , installed_folders , errors
275290
276- def _maybe_add_copies_to_remove (ctx : DownloaderWorkerContext , copies : List [Tuple [bool , str , str , PathType ]], store : ReadOnlyStoreAdapter , folder_path : str , drive : Optional [str ]):
277- if store .folder_drive (folder_path ) == drive : return
278- copies .extend ([
279- (is_external , folder_path , other_drive , PathType .FOLDER )
280- for is_external , other_drive in store .list_other_drives_for_folder (folder_path , drive )
281- if not ctx .file_system .is_folder (os .path .join (other_drive , folder_path ))
282- ])
283-
284-
285291def create_fetch_jobs (ctx : DownloaderWorkerContext , db_id : str , non_existing_pkgs : List [_FetchFilePackage ], need_update_pkgs : List [_FetchFilePackage ], base_files_url : str ) -> List [Job ]:
286292 if len (non_existing_pkgs ) == 0 and len (need_update_pkgs ) == 0 :
287293 return []
0 commit comments