From 04ebdf428b955f445b6136153a5727efcb2f705b Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Mon, 12 Aug 2019 20:32:26 +0300 Subject: [PATCH] Move "match_src_files" to FS module --- docs | 2 +- platformio/builder/tools/piolib.py | 4 +- platformio/builder/tools/platformio.py | 52 ++++---------------------- platformio/fs.py | 43 ++++++++++++++++++++- 4 files changed, 53 insertions(+), 48 deletions(-) diff --git a/docs b/docs index 005c8e74..482ed6c6 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 005c8e7441100012689371501b2e77d3a93be502 +Subproject commit 482ed6c6e6b0ae4e7536bdab40a36710ad8e8feb diff --git a/platformio/builder/tools/piolib.py b/platformio/builder/tools/piolib.py index 73d681d9..b0fd9470 100644 --- a/platformio/builder/tools/piolib.py +++ b/platformio/builder/tools/piolib.py @@ -78,7 +78,7 @@ class LibBuilderFactory(object): if "mbed_lib.json" in files: return ["mbed"] for fname in files: - if not env.IsFileWithExt( + if not fs.path_endswith_ext( fname, piotool.SRC_BUILD_EXT + piotool.SRC_HEADER_EXT): continue content = get_file_contents(join(root, fname)) @@ -351,7 +351,7 @@ class LibBuilderBase(object): if not self.PARSE_SRC_BY_H_NAME: continue _h_path = item.get_abspath() - if not self.env.IsFileWithExt(_h_path, piotool.SRC_HEADER_EXT): + if not fs.path_endswith_ext(_h_path, piotool.SRC_HEADER_EXT): continue _f_part = _h_path[:_h_path.rindex(".")] for ext in piotool.SRC_C_EXT: diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index 97072ddd..057d39aa 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -14,10 +14,8 @@ from __future__ import absolute_import -import re +import os import sys -from glob import glob -from os import sep, walk from os.path import basename, dirname, isdir, join, realpath from SCons import Builder, Util # pylint: disable=import-error @@ -27,14 +25,14 @@ from SCons.Script import DefaultEnvironment # pylint: disable=import-error from SCons.Script import Export # pylint: disable=import-error from SCons.Script import SConscript # pylint: disable=import-error -from platformio.compat import glob_escape, string_types +from platformio import fs +from platformio.compat import string_types from platformio.util import pioversion_to_intstr SRC_HEADER_EXT = ["h", "hpp"] SRC_C_EXT = ["c", "cc", "cpp"] SRC_BUILD_EXT = SRC_C_EXT + ["S", "spp", "SPP", "sx", "s", "asm", "ASM"] -SRC_FILTER_DEFAULT = ["+<*>", "-<.git%s>" % sep, "-" % sep] -SRC_FILTER_PATTERNS_RE = re.compile(r"(\+|\-)<([^>]+)>") +SRC_FILTER_DEFAULT = ["+<*>", "-<.git%s>" % os.sep, "-<.svn%s>" % os.sep] def scons_patched_match_splitext(path, suffixes=None): @@ -230,44 +228,11 @@ def ProcessUnFlags(env, flags): env[key].remove(current) -def IsFileWithExt(env, file_, ext): # pylint: disable=W0613 - if basename(file_).startswith("."): - return False - for e in ext: - if file_.endswith(".%s" % e): - return True - return False - - def MatchSourceFiles(env, src_dir, src_filter=None): - - def _append_build_item(items, item, src_dir): - if env.IsFileWithExt(item, SRC_BUILD_EXT + SRC_HEADER_EXT): - items.add(item.replace(src_dir + sep, "")) - - src_dir = env.subst(src_dir) src_filter = env.subst(src_filter) if src_filter else None src_filter = src_filter or SRC_FILTER_DEFAULT - if isinstance(src_filter, (list, tuple)): - src_filter = " ".join(src_filter) - - matches = set() - # correct fs directory separator - src_filter = src_filter.replace("/", sep).replace("\\", sep) - for (action, pattern) in SRC_FILTER_PATTERNS_RE.findall(src_filter): - items = set() - for item in glob(join(glob_escape(src_dir), pattern)): - if isdir(item): - for root, _, files in walk(item, followlinks=True): - for f in files: - _append_build_item(items, join(root, f), src_dir) - else: - _append_build_item(items, item, src_dir) - if action == "+": - matches |= items - else: - matches -= items - return sorted(list(matches)) + return fs.match_src_files(env.subst(src_dir), src_filter, + SRC_BUILD_EXT + SRC_HEADER_EXT) def CollectBuildFiles(env, @@ -279,7 +244,7 @@ def CollectBuildFiles(env, variants = [] src_dir = env.subst(src_dir) - if src_dir.endswith(sep): + if src_dir.endswith(os.sep): src_dir = src_dir[:-1] for item in env.MatchSourceFiles(src_dir, src_filter): @@ -291,7 +256,7 @@ def CollectBuildFiles(env, variants.append(_var_dir) env.VariantDir(_var_dir, _src_dir, duplicate) - if env.IsFileWithExt(item, SRC_BUILD_EXT): + if fs.path_endswith_ext(item, SRC_BUILD_EXT): sources.append(env.File(join(_var_dir, basename(item)))) return sources @@ -352,7 +317,6 @@ def generate(env): env.AddMethod(ParseFlagsExtended) env.AddMethod(ProcessFlags) env.AddMethod(ProcessUnFlags) - env.AddMethod(IsFileWithExt) env.AddMethod(MatchSourceFiles) env.AddMethod(CollectBuildFiles) env.AddMethod(BuildFrameworks) diff --git a/platformio/fs.py b/platformio/fs.py index 3d01b05d..25883d78 100644 --- a/platformio/fs.py +++ b/platformio/fs.py @@ -14,14 +14,16 @@ import json import os +import re import shutil import stat import sys +from glob import glob import click from platformio import exception -from platformio.compat import get_file_contents +from platformio.compat import get_file_contents, glob_escape class cd(object): @@ -105,6 +107,45 @@ def ensure_udev_rules(): return True +def path_endswith_ext(path, extensions): + if not isinstance(extensions, list): + extensions = [extensions] + for ext in extensions: + if path.endswith("." + ext): + return True + return False + + +def match_src_files(src_dir, src_filter=None, src_exts=None): + + def _append_build_item(items, item, src_dir): + if not src_exts or path_endswith_ext(item, src_exts): + items.add(item.replace(src_dir + os.sep, "")) + + src_filter = src_filter or "" + if isinstance(src_filter, (list, tuple)): + src_filter = " ".join(src_filter) + + matches = set() + # correct fs directory separator + src_filter = src_filter.replace("/", os.sep).replace("\\", os.sep) + for (action, pattern) in re.findall(r"(\+|\-)<([^>]+)>", src_filter): + items = set() + for item in glob(os.path.join(glob_escape(src_dir), pattern)): + if os.path.isdir(item): + for root, _, files in os.walk(item, followlinks=True): + for f in files: + _append_build_item(items, os.path.join(root, f), + src_dir) + else: + _append_build_item(items, item, src_dir) + if action == "+": + matches |= items + else: + matches -= items + return sorted(list(matches)) + + def rmtree(path): def _onerror(_, name, __):