Move "match_src_files" to FS module

This commit is contained in:
Ivan Kravets
2019-08-12 20:32:26 +03:00
parent 6a90388649
commit 04ebdf428b
4 changed files with 53 additions and 48 deletions

2
docs

Submodule docs updated: 005c8e7441...482ed6c6e6

View File

@ -78,7 +78,7 @@ class LibBuilderFactory(object):
if "mbed_lib.json" in files: if "mbed_lib.json" in files:
return ["mbed"] return ["mbed"]
for fname in files: for fname in files:
if not env.IsFileWithExt( if not fs.path_endswith_ext(
fname, piotool.SRC_BUILD_EXT + piotool.SRC_HEADER_EXT): fname, piotool.SRC_BUILD_EXT + piotool.SRC_HEADER_EXT):
continue continue
content = get_file_contents(join(root, fname)) content = get_file_contents(join(root, fname))
@ -351,7 +351,7 @@ class LibBuilderBase(object):
if not self.PARSE_SRC_BY_H_NAME: if not self.PARSE_SRC_BY_H_NAME:
continue continue
_h_path = item.get_abspath() _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 continue
_f_part = _h_path[:_h_path.rindex(".")] _f_part = _h_path[:_h_path.rindex(".")]
for ext in piotool.SRC_C_EXT: for ext in piotool.SRC_C_EXT:

View File

@ -14,10 +14,8 @@
from __future__ import absolute_import from __future__ import absolute_import
import re import os
import sys import sys
from glob import glob
from os import sep, walk
from os.path import basename, dirname, isdir, join, realpath from os.path import basename, dirname, isdir, join, realpath
from SCons import Builder, Util # pylint: disable=import-error 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 Export # pylint: disable=import-error
from SCons.Script import SConscript # 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 from platformio.util import pioversion_to_intstr
SRC_HEADER_EXT = ["h", "hpp"] SRC_HEADER_EXT = ["h", "hpp"]
SRC_C_EXT = ["c", "cc", "cpp"] SRC_C_EXT = ["c", "cc", "cpp"]
SRC_BUILD_EXT = SRC_C_EXT + ["S", "spp", "SPP", "sx", "s", "asm", "ASM"] SRC_BUILD_EXT = SRC_C_EXT + ["S", "spp", "SPP", "sx", "s", "asm", "ASM"]
SRC_FILTER_DEFAULT = ["+<*>", "-<.git%s>" % sep, "-<svn%s>" % sep] SRC_FILTER_DEFAULT = ["+<*>", "-<.git%s>" % os.sep, "-<.svn%s>" % os.sep]
SRC_FILTER_PATTERNS_RE = re.compile(r"(\+|\-)<([^>]+)>")
def scons_patched_match_splitext(path, suffixes=None): def scons_patched_match_splitext(path, suffixes=None):
@ -230,44 +228,11 @@ def ProcessUnFlags(env, flags):
env[key].remove(current) 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 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 = env.subst(src_filter) if src_filter else None
src_filter = src_filter or SRC_FILTER_DEFAULT src_filter = src_filter or SRC_FILTER_DEFAULT
if isinstance(src_filter, (list, tuple)): return fs.match_src_files(env.subst(src_dir), src_filter,
src_filter = " ".join(src_filter) SRC_BUILD_EXT + SRC_HEADER_EXT)
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))
def CollectBuildFiles(env, def CollectBuildFiles(env,
@ -279,7 +244,7 @@ def CollectBuildFiles(env,
variants = [] variants = []
src_dir = env.subst(src_dir) src_dir = env.subst(src_dir)
if src_dir.endswith(sep): if src_dir.endswith(os.sep):
src_dir = src_dir[:-1] src_dir = src_dir[:-1]
for item in env.MatchSourceFiles(src_dir, src_filter): for item in env.MatchSourceFiles(src_dir, src_filter):
@ -291,7 +256,7 @@ def CollectBuildFiles(env,
variants.append(_var_dir) variants.append(_var_dir)
env.VariantDir(_var_dir, _src_dir, duplicate) 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)))) sources.append(env.File(join(_var_dir, basename(item))))
return sources return sources
@ -352,7 +317,6 @@ def generate(env):
env.AddMethod(ParseFlagsExtended) env.AddMethod(ParseFlagsExtended)
env.AddMethod(ProcessFlags) env.AddMethod(ProcessFlags)
env.AddMethod(ProcessUnFlags) env.AddMethod(ProcessUnFlags)
env.AddMethod(IsFileWithExt)
env.AddMethod(MatchSourceFiles) env.AddMethod(MatchSourceFiles)
env.AddMethod(CollectBuildFiles) env.AddMethod(CollectBuildFiles)
env.AddMethod(BuildFrameworks) env.AddMethod(BuildFrameworks)

View File

@ -14,14 +14,16 @@
import json import json
import os import os
import re
import shutil import shutil
import stat import stat
import sys import sys
from glob import glob
import click import click
from platformio import exception from platformio import exception
from platformio.compat import get_file_contents from platformio.compat import get_file_contents, glob_escape
class cd(object): class cd(object):
@ -105,6 +107,45 @@ def ensure_udev_rules():
return True 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 rmtree(path):
def _onerror(_, name, __): def _onerror(_, name, __):