From 90d78509719ea02e2309772802533bc2adab19f0 Mon Sep 17 00:00:00 2001 From: deathaxe Date: Fri, 5 Apr 2024 19:08:22 +0200 Subject: [PATCH] Fix upgraded package not being cleared This commit fixes out-dated files in root directory of unpacked packages not being cleared due to skipped files in sub-directories causing ENOTEMPTY exception, when removing top-level directories. Example: /dir1/dir2/file <- if this is ignored and /dir1/ only contains dirs /plugin.py <- this wouldn't be deleted as /dir1 was not added to ignored_dirs and removing fails as not being empty Thus ignore non-empty directories. --- package_control/clear_directory.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/package_control/clear_directory.py b/package_control/clear_directory.py index 45143fee..54750966 100644 --- a/package_control/clear_directory.py +++ b/package_control/clear_directory.py @@ -1,3 +1,4 @@ +import errno import os import stat import sys @@ -53,21 +54,13 @@ def clear_directory(directory, ignored_files=None, ignore_errors=True): trash_dir = sys_path.trash_path() os.makedirs(trash_dir, exist_ok=True) - ignored_dirs = set() was_exception = False for root, dirs, files in os.walk(directory, topdown=False): try: - for d in dirs: - path = os.path.join(root, d) - if path not in ignored_dirs: - os.rmdir(path) - for f in files: path = os.path.normcase(os.path.join(root, f)) if ignored_files and path in ignored_files: - # also ignore parent folder from being removed - ignored_dirs.add(root) continue try: @@ -85,7 +78,15 @@ def clear_directory(directory, ignored_files=None, ignore_errors=True): ) os.rename(path, trash_path) - except OSError: + for d in dirs: + try: + os.rmdir(os.path.join(root, d)) + except OSError as e: + if e.errno == errno.ENOTEMPTY: + continue + raise + + except OSError as e: if not ignore_errors: raise was_exception = True