Skip to content

Commit

Permalink
empty directories cleaning only on processed branch
Browse files Browse the repository at this point in the history
  • Loading branch information
PJDude committed Jan 17, 2024
1 parent 2c3f59f commit 949a232
Showing 1 changed file with 53 additions and 14 deletions.
67 changes: 53 additions & 14 deletions src/dude.py
Original file line number Diff line number Diff line change
Expand Up @@ -1970,6 +1970,8 @@ def goto_first_last_dir_entry(self,index):
self.folder_tree_sel_change(next_item)
self.folder_tree.update()

@catched
@logwrapper
def create_my_next_dict(self,tree):
my_next_dict = self.my_next_dict[tree]={}
my_prev_dict = self.my_prev_dict[tree]={}
Expand Down Expand Up @@ -3595,7 +3597,7 @@ def tree_folder_update(self,arbitrary_path=None):

#t2=perf_counter()

folder_items_len = len(folder_items)
folder_items_len = len(self.current_folder_items)

#fact1 = format((t1-t0)/folder_items_len, '.10f')
#fact2 = format((t2-t1)/folder_items_len, '.10f')
Expand Down Expand Up @@ -4252,16 +4254,15 @@ def process_files_confirm(self,action,processed_items,remaining_items,scope_titl
@gui_block
def empty_dirs_removal(self,path,report_empty=False):
removal_func = send2trash if self.cfg_get_bool(CFG_SEND_TO_TRASH) else rmdir
os_path_abspath = abspath

clean,removed = self.empty_dirs_removal_core(path,removal_func,os_path_abspath)
clean,removed = self.empty_dirs_removal_core(path,removal_func)

if report_empty and not removed:
removed.append(f'No empty subdirectories in:\'{path}\'')

return removed

def empty_dirs_removal_core(self,path,removal_func,os_path_abspath):
def empty_dirs_removal_core(self,path,removal_func):
result = []
result_extend = result.extend
result_append = result.append
Expand All @@ -4273,7 +4274,7 @@ def empty_dirs_removal_core(self,path,removal_func,os_path_abspath):
if entry.is_symlink():
clean = False
elif entry.is_dir():
sub_clean,sub_result = self_empty_dirs_removal_core(os_path_abspath(path_join(path, entry.name)),removal_func,os_path_abspath)
sub_clean,sub_result = self_empty_dirs_removal_core(abspath(path_join(path, entry.name)),removal_func)
clean = clean and sub_clean
result_extend(sub_result)
else:
Expand All @@ -4293,6 +4294,23 @@ def empty_dirs_removal_core(self,path,removal_func,os_path_abspath):
l_error('empty_dirs_removal:%s',e)
return (False,result)

def empty_dirs_removal_single(self,path,removal_func):
try:
with scandir(path) as res:
for entry in res:
return ''

try:
l_info('empty_dirs_removal_single %s(%s)',removal_func.__name__,path)
removal_func(path)
return(str(path))
except Exception as removal_e:
l_error('empty_dirs_removal_single:%s',removal_e)
return f'error (remove {path}): {removal_e}'
except Exception as e:
l_error('empty_dirs_removal_single scandir :%s',e)
return f' error (scandir {path}): {e}'

@block_actions_processing
@gui_block
@logwrapper
Expand Down Expand Up @@ -4337,8 +4355,10 @@ def process_files_core(self,action,processed_items,remaining_items):
(pathnr,path,file_name,ctime,dev,inode)=index_tuple

if erase_empty_dirs:
full_path = dude_core.scanned_paths[pathnr]+path
directories_to_check_add(full_path)
#print(f'{path=}')
if path:
#directories_to_check_add(dude_core.scanned_paths[pathnr]+path)
directories_to_check_add( tuple( [pathnr] + path.strip(sep).split(sep) ) )
if counter%128==0:
self_status('processing files %s ...' % counter)

Expand All @@ -4354,15 +4374,31 @@ def process_files_core(self,action,processed_items,remaining_items):
self_crc_node_update(crc)

if erase_empty_dirs:
directories_to_check_list=list(directories_to_check)
directories_to_check_list.sort(key=lambda d : (len(str(d).split(sep)),d),reverse=True )
#directories_to_check_list=

directories_to_check_expanded=set()
directories_to_check_expanded_add = directories_to_check_expanded.add

for dir_tuple in directories_to_check:
elems = len(dir_tuple)-1
for i in range(elems):
combo_to_check = tuple(dir_tuple[0:2+i])
directories_to_check_expanded_add( combo_to_check )
#print(f'{combo_to_check=}')

removed=[]
removed_extend = removed.extend
for directory in directories_to_check_list:
removed_extend(self_empty_dirs_removal(directory))
removed_append=removed.append
removal_func = send2trash if self.cfg_get_bool(CFG_SEND_TO_TRASH) else rmdir

for dir_tuple in sorted(directories_to_check_expanded,key=lambda p : len(p),reverse=True):
real_path = normpath(abspath(dude_core.scanned_paths[dir_tuple[0]] + sep + sep.join(dir_tuple[1:])))

info = self.empty_dirs_removal_single(real_path,removal_func)
if info:
removed_append(info)

final_info.extend(removed)
if removed:
final_info.extend(removed)

elif action==SOFTLINK:
do_rel_symlink = self.cfg_get_bool(CFG_KEY_REL_SYMLINKS)
Expand Down Expand Up @@ -4408,6 +4444,8 @@ def process_files_core(self,action,processed_items,remaining_items):
for crc in processed_items:
self_crc_node_update(crc)

self.create_my_next_dict(self.groups_tree)

self.data_precalc()

if end_message_list:
Expand Down Expand Up @@ -4563,7 +4601,8 @@ def process_files(self,action,processed_items,scope_title):

self.calc_mark_stats_groups()

self.selected={}
self.selected[self.groups_tree]=None
self.selected[self.folder_tree]=None
self.find_result=()

@logwrapper
Expand Down

0 comments on commit 949a232

Please sign in to comment.