From db267513ca9f194c9ebdd2f64405549c4bbde5a7 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 5 Aug 2016 18:43:20 +0300 Subject: [PATCH] Implement custom "rmtree"; resolve issue with Windows and .git --- platformio/__init__.py | 2 +- platformio/commands/ci.py | 16 ++++++---------- platformio/commands/run.py | 5 ++--- platformio/managers/package.py | 12 ++++++------ platformio/util.py | 11 +++++++++++ tests/test_examples.py | 7 +++---- 6 files changed, 29 insertions(+), 24 deletions(-) diff --git a/platformio/__init__.py b/platformio/__init__.py index 8948d92b..d3eaf0e4 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -14,7 +14,7 @@ import sys -VERSION = (3, 0, "0.dev20") +VERSION = (3, 0, "0.dev21") __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" diff --git a/platformio/commands/ci.py b/platformio/commands/ci.py index 886c9506..c7da3943 100644 --- a/platformio/commands/ci.py +++ b/platformio/commands/ci.py @@ -12,16 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -import stat from glob import glob -from os import chmod, getenv, makedirs, remove +from os import getenv, makedirs, remove from os.path import abspath, basename, expanduser, isdir, isfile, join -from shutil import copyfile, copytree, rmtree +from shutil import copyfile, copytree from tempfile import mkdtemp import click -from platformio import app +from platformio import app, util from platformio.commands.init import cli as cmd_init from platformio.commands.init import validate_boards from platformio.commands.run import cli as cmd_run @@ -119,14 +118,11 @@ def cli(ctx, # pylint: disable=R0913 ctx.invoke(cmd_run, project_dir=build_dir, verbose=verbose) finally: if not keep_build_dir: - rmtree( - build_dir, - onerror=lambda action, name, exc: (chmod(name, stat.S_IWRITE), - remove(name))) + util.rmtree_(build_dir) def _clean_dir(dirpath): - rmtree(dirpath) + util.rmtree_(dirpath) makedirs(dirpath) @@ -165,7 +161,7 @@ def _exclude_contents(dst_dir, patterns): for path in contents: path = abspath(path) if isdir(path): - rmtree(path) + util.rmtree_(path) elif isfile(path): remove(path) diff --git a/platformio/commands/run.py b/platformio/commands/run.py index 9f4043e0..cdc8d944 100644 --- a/platformio/commands/run.py +++ b/platformio/commands/run.py @@ -16,7 +16,6 @@ from datetime import datetime from hashlib import sha1 from os import getcwd, makedirs, walk from os.path import getmtime, isdir, isfile, join -from shutil import rmtree from time import time import click @@ -234,14 +233,14 @@ def _clean_pioenvs_dir(pioenvs_dir): if (isdir(pioenvs_dir) and getmtime(join(util.get_project_dir(), "platformio.ini")) > getmtime(pioenvs_dir)): - rmtree(pioenvs_dir) + util.rmtree_(pioenvs_dir) # check project structure if isdir(pioenvs_dir) and isfile(structhash_file): with open(structhash_file) as f: if f.read() == proj_hash: return - rmtree(pioenvs_dir) + util.rmtree_(pioenvs_dir) if not isdir(pioenvs_dir): makedirs(pioenvs_dir) diff --git a/platformio/managers/package.py b/platformio/managers/package.py index ea1f6321..9b8cdc4f 100644 --- a/platformio/managers/package.py +++ b/platformio/managers/package.py @@ -15,7 +15,7 @@ import json import os from os.path import basename, dirname, isdir, isfile, islink, join -from shutil import copyfile, copytree, rmtree +from shutil import copyfile, copytree from tempfile import mkdtemp import click @@ -159,7 +159,7 @@ class PkgInstallerMixin(object): copytree(item_path, join(pkg_dir, item), symlinks=True) # remove not used contents while True: - rmtree(root) + util.rmtree_(root) root = dirname(root) if root == pkg_dir: break @@ -205,7 +205,7 @@ class PkgInstallerMixin(object): if isfile(url): self.unpack(url, tmp_dir) else: - rmtree(tmp_dir) + util.rmtree_(tmp_dir) copytree(url, tmp_dir) elif url.startswith(("http://", "https://")): dlpath = self.download(url, tmp_dir, sha1) @@ -228,7 +228,7 @@ class PkgInstallerMixin(object): pkg_dir = self._install_from_tmp_dir(tmp_dir, requirements) finally: if isdir(tmp_dir): - rmtree(tmp_dir) + util.rmtree_(tmp_dir) return pkg_dir def _install_from_tmp_dir(self, tmp_dir, requirements=None): @@ -267,7 +267,7 @@ class PkgInstallerMixin(object): # remove previous/not-satisfied package if isdir(pkg_dir): - rmtree(pkg_dir) + util.rmtree_(pkg_dir) os.rename(tmp_dir, pkg_dir) assert isdir(pkg_dir) return pkg_dir @@ -478,7 +478,7 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin): if islink(installed_dir): os.unlink(installed_dir) else: - rmtree(installed_dir) + util.rmtree_(installed_dir) click.echo("[%s]" % click.style("OK", fg="green")) diff --git a/platformio/util.py b/platformio/util.py index eeb02caf..cd87103c 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -17,12 +17,14 @@ import functools import json import os import re +import stat import subprocess import sys from glob import glob from os.path import (abspath, basename, dirname, expanduser, isdir, isfile, join, splitdrive) from platform import system, uname +from shutil import rmtree from threading import Thread from platformio import __apiip__, __apiurl__, __version__, exception @@ -454,3 +456,12 @@ def where_is_program(program, envpath=None): def pepver_to_semver(pepver): return re.sub(r"(\.\d+)\.?(dev|a|b|rc|post)", r"\1-\2", pepver, 1) + + +def rmtree_(path): + + def _onerror(_, name, __): + os.chmod(name, stat.S_IWRITE) + os.remove(name) + + return rmtree(path, onerror=_onerror) diff --git a/tests/test_examples.py b/tests/test_examples.py index 959d974b..bfe428d9 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -15,11 +15,10 @@ from glob import glob from os import listdir, walk from os.path import dirname, getsize, isdir, isfile, join, normpath -from shutil import rmtree import pytest -from platformio.util import exec_command +from platformio import util def pytest_generate_tests(metafunc): @@ -38,9 +37,9 @@ def pytest_generate_tests(metafunc): @pytest.mark.examples def test_run(platformio_setup, pioproject_dir): if isdir(join(pioproject_dir, ".pioenvs")): - rmtree(join(pioproject_dir, ".pioenvs")) + util.rmtree_(join(pioproject_dir, ".pioenvs")) - result = exec_command( + result = util.exec_command( ["platformio", "--force", "run", "--project-dir", pioproject_dir] ) if result['returncode'] != 0: