diff --git a/packaging_scripts/pkgfiles.py b/packaging_scripts/pkgfiles.py index 0f6a18a..eab873f 100644 --- a/packaging_scripts/pkgfiles.py +++ b/packaging_scripts/pkgfiles.py @@ -1,37 +1,50 @@ """Helper functions for dealing with package files.""" -import glob -import os -import os.path +import re + +from pathlib import Path # ========== Constants ========== -PKGEXT = "pkg.tar.xz" -SIGEXT = f"{PKGEXT}.sig" +# Match any pkgfile of any name with the .pkg.tar.* extension +PKGREGEX = "^[\w]+[.]pkg[.]tar([.][\w]+)?$" +# Match any sigfile of any name with the .pkg.tar.*.sig extension +SIGREGEX = "^[\w]+[.]pkg[.]tar[.][\w]*[.]sig$" # ========== Functions ========== -def get_pkgfiles(query=None, directory=None, *, signatures_only=False): +def get_pkgfiles(query=None, *, directory=None, signatures_only=False): """Return a list of package files in the current working directory. :param query: names of package files to search for :type query: str :param directory: a directory to search in - :type directory: str + :type directory: str or path-like object :param signatures_only: include only signature files :type signatures_only: bool :returns: paths of package files :rtype: list """ - if directory is not None: - path = directory - else: - path = os.getcwd() + path = Path.cwd() if directory is None else Path(directory) + filequery = f"*{query}*" if query is not None else "*" - if signatures_only and query is not None: - return glob.glob(f"{path}/*{query}*.{SIGEXT}") - elif signatures_only and query is None: - return glob.glob(f"{path}/*.{SIGEXT}") - elif not signatures_only and query is not None: - return glob.glob(f"{path}/*{query}*.{PKGEXT}") - elif not signatures_only and query is None: - return glob.glob(f"{path}/*.{PKGEXT}") + if signatures_only: + yield from _filter_by_regex(filequery, SIGREGEX, path) + else: + yield from _filter_by_regex(filequery, PKGREGEX, path) + + +def _filter_by_regex(query, regex_expression, path): + """Filter package files only. + + :param query: names of package files to search for + :type query: str + :param regex_expression: the expression to filter by + :type regex_expression: str + :param path: directory to look for files + :type path: path-like object + :yields: package files from either the current working directory + or an arbitrary directory + """ + for pkgfile in path.glob(query): + if re.match(regex_expression, str(pkgfile)): + yield pkgfile