From df2f6a71e7c32a477c141808d2dfdd49df8021fc Mon Sep 17 00:00:00 2001 From: Filipe Brandenburger Date: Thu, 31 May 2018 10:16:54 -0700 Subject: [PATCH] Make windows_proof_rmtree resilient to read-only files Start the process by traversing the tree and adding the S_IWRITE and S_IREAD bits to the file's mode (which are also preserved on Windows.) This fixes windows_proof_rmtree's inability to remove read-only files, which was uncovered in testing the new `install_mode` feature. Tested: ./run_tests.py passes on Linux, appveyor CI on Windows passes. --- mesonbuild/mesonlib.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/mesonbuild/mesonlib.py b/mesonbuild/mesonlib.py index eaa5359ec..d7000410c 100644 --- a/mesonbuild/mesonlib.py +++ b/mesonbuild/mesonlib.py @@ -975,12 +975,25 @@ def get_filenames_templates_dict(inputs, outputs): return values +def _make_tree_writable(topdir): + # Ensure all files and directories under topdir are writable + # (and readable) by owner. + for d, _, files in os.walk(topdir): + os.chmod(d, os.stat(d).st_mode | stat.S_IWRITE | stat.S_IREAD) + for fname in files: + fpath = os.path.join(d, fname) + if os.path.isfile(fpath): + os.chmod(fpath, os.stat(fpath).st_mode | stat.S_IWRITE | stat.S_IREAD) + + def windows_proof_rmtree(f): # On Windows if anyone is holding a file open you can't # delete it. As an example an anti virus scanner might # be scanning files you are trying to delete. The only # way to fix this is to try again and again. delays = [0.1, 0.1, 0.2, 0.2, 0.2, 0.5, 0.5, 1, 1, 1, 1, 2] + # Start by making the tree wriable. + _make_tree_writable(f) for d in delays: try: shutil.rmtree(f)