diff --git a/build/protobuf.py b/build/protobuf.py index edfc826c..d83d7ee8 100644 --- a/build/protobuf.py +++ b/build/protobuf.py @@ -11,6 +11,7 @@ PROTO_SEPARATOR = ";" if (platform.system() == "Windows") else ":" + def _getprotodeps(deps): r = set() for d in deps: diff --git a/build/utils.py b/build/utils.py index da1742c5..224cae40 100644 --- a/build/utils.py +++ b/build/utils.py @@ -40,31 +40,37 @@ def collectattrs(*, targets, name, initial=[]): @functools.cache def _glob_to_re(glob_str): - opts = re.compile('([.]|[*][*]/|[*]|[?])|(.)') - out = '' - for (pattern_match, literal_text) in opts.findall(glob_str): - if pattern_match == '.': - out += '[.]' - elif pattern_match == '**/': - out += '(?:.*/)?' - elif pattern_match == '*': - out += '[^/]*' - elif pattern_match == '?': - out += '.' + if glob_str.startswith("./"): + glob_str = normpath(join(getcwd(), glob_str)) + + opts = re.compile("([.]|[*][*]/|[*]|[?])|(.)") + out = "" + for pattern_match, literal_text in opts.findall(glob_str): + if pattern_match == ".": + out += "[.]" + elif pattern_match == "**/": + out += "(?:.*/)?" + elif pattern_match == "*": + out += "[^/]*" + elif pattern_match == "?": + out += "." elif literal_text: out += literal_text return re.compile(out) + def _glob_filter(paths, pattern): r = _glob_to_re(pattern) for f in paths: if r.match(f): yield f + def _glob_matches(path, pattern): r = _glob_to_re(pattern) return r.match(path) + def glob(include=["*"], exclude=[], dir=None, relative_to="."): if not dir: dir = getcwd() @@ -77,15 +83,15 @@ def iterate(): for dirpath, dirnames, filenames in walk( dir, topdown=True, followlinks=True ): - dirpath = relpath(dirpath, dir) + dirpath = relpath(dirpath, relative_to) filenames = [normpath(join(dirpath, f)) for f in filenames] matching = set() for p in include: - matching.update(_glob_filter(filenames, p)) + matching.update([f for f in _glob_filter(filenames, p)]) for p in exclude: - matching = [n for n in matching if not _glob_matches(n, p)] + matching = [n for n in matching if not _glob_matches(n, p)] for f in matching: - yield normpath(relpath(join(dir, f), relative_to)) + yield f return list(iterate())