Fix printing relative paths on Windows // Resolve #3542

Fixes "ValueError" when running "clean" target if "build_dir"
points to a folder on a different logical drive
This commit is contained in:
Valerii Koval
2020-06-16 12:27:49 +03:00
parent a9c13aa20e
commit 21f3dd11f4
2 changed files with 11 additions and 3 deletions

View File

@ -27,6 +27,7 @@ PlatformIO Core 4
* Added a new ``-e, --environment`` option to `platformio project init <https://docs.platformio.org/page/core/userguide/project/cmd_init.html#cmdoption-platformio-project-init-e>`__ command that helps to update a PlatformIO project using existing environment
* Fixed an issue with PIO Unit Testing when running multiple environments (`issue #3523 <https://github.com/platformio/platformio-core/issues/3523>`_)
* Fixed an issue with improper processing of source files added via multiple Build Middlewares (`issue #3531 <https://github.com/platformio/platformio-core/issues/3531>`_)
* Fixed an issue with ``clean`` target on Windows when project and build directories are located on different logical drives (`issue #3542 <https://github.com/platformio/platformio-core/issues/3542>`_)
4.3.4 (2020-05-23)
~~~~~~~~~~~~~~~~~~

View File

@ -20,7 +20,7 @@ from SCons.Action import Action # pylint: disable=import-error
from SCons.Script import ARGUMENTS # pylint: disable=import-error
from SCons.Script import AlwaysBuild # pylint: disable=import-error
from platformio import fs
from platformio import compat, fs
def VerboseAction(_, act, actstr):
@ -30,17 +30,24 @@ def VerboseAction(_, act, actstr):
def PioClean(env, clean_dir):
def _relpath(path):
if compat.WINDOWS:
prefix = os.getcwd()[:2].lower()
if ":" not in prefix or not path.lower().startswith(prefix):
return path
return os.path.relpath(path)
if not os.path.isdir(clean_dir):
print("Build environment is clean")
env.Exit(0)
clean_rel_path = os.path.relpath(clean_dir)
clean_rel_path = _relpath(clean_dir)
for root, _, files in os.walk(clean_dir):
for f in files:
dst = os.path.join(root, f)
os.remove(dst)
print(
"Removed %s"
% (dst if clean_rel_path.startswith(".") else os.path.relpath(dst))
% (dst if not clean_rel_path.startswith(".") else _relpath(dst))
)
print("Done cleaning")
fs.rmtree(clean_dir)