From ac1f25d0be46b63fd83da976f022edf37b2e985b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Thu, 25 Mar 2021 16:09:45 +0000 Subject: [PATCH] Handle case sensitivity. --- ognibuild/debian/apt.py | 4 ++-- ognibuild/debian/file_search.py | 27 ++++++++++++++++++++------- ognibuild/resolver/apt.py | 13 ++++++++----- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/ognibuild/debian/apt.py b/ognibuild/debian/apt.py index 17875ee..c435b56 100644 --- a/ognibuild/debian/apt.py +++ b/ognibuild/debian/apt.py @@ -81,10 +81,10 @@ class AptManager(object): self._apt_cache = apt.Cache(rootdir=self.session.location) return package in self._apt_cache - def get_packages_for_paths(self, paths, regex=False): + def get_packages_for_paths(self, paths, regex=False, case_insensitive=False): logging.debug("Searching for packages containing %r", paths) # TODO(jelmer): Make sure we use whatever is configured in self.session - return get_packages_for_paths(paths, self.searchers(), regex=regex) + return get_packages_for_paths(paths, self.searchers(), regex=regex, case_insensitive=case_insensitive) def missing(self, packages): root = getattr(self.session, "location", "/") diff --git a/ognibuild/debian/file_search.py b/ognibuild/debian/file_search.py index ead9909..21c570f 100644 --- a/ognibuild/debian/file_search.py +++ b/ognibuild/debian/file_search.py @@ -29,7 +29,7 @@ from .. import USER_AGENT class FileSearcher(object): - def search_files(self, path: str, regex: bool = False) -> Iterator[str]: + def search_files(self, path: str, regex: bool = False, case_insensitive: bool = False) -> Iterator[str]: raise NotImplementedError(self.search_files) @@ -216,10 +216,16 @@ class AptCachedContentsFileSearcher(FileSearcher): def __setitem__(self, path, package): self._db[path] = package - def search_files(self, path, regex=False): + def search_files(self, path, regex=False, case_insensitive=False): path = path.lstrip('/').encode('utf-8', 'surrogateescape') + if case_insensitive and not regex: + regex = True + path = re.escape(path) if regex: - c = re.compile(path) + flags = 0 + if case_insensitive: + flags |= re.I + c = re.compile(path, flags=flags) ret = [] for p, rest in self._db.items(): if c.match(p): @@ -256,10 +262,16 @@ class GeneratedFileSearcher(FileSearcher): (path, pkg) = line.strip().split(None, 1) self._db[path] = pkg - def search_files(self, path: str, regex: bool = False) -> Iterator[str]: + def search_files(self, path: str, regex: bool = False, case_insensitive: bool = False) -> Iterator[str]: for p, pkg in sorted(self._db.items()): if regex: - if re.match(path, p): + flags = 0 + if case_insensitive: + flags |= re.I + if re.match(path, p, flags=flags): + yield pkg + elif case_insensitive: + if path.lower() == p.lower(): yield pkg else: if path == p: @@ -281,12 +293,13 @@ GENERATED_FILE_SEARCHER = GeneratedFileSearcher( def get_packages_for_paths( - paths: List[str], searchers: List[FileSearcher], regex: bool = False + paths: List[str], searchers: List[FileSearcher], regex: bool = False, + case_insensitive: bool = False ) -> List[str]: candidates: List[str] = list() for path in paths: for searcher in searchers: - for pkg in searcher.search_files(path, regex=regex): + for pkg in searcher.search_files(path, regex=regex, case_insensitive=case_insensitive): if pkg not in candidates: candidates.append(pkg) return candidates diff --git a/ognibuild/resolver/apt.py b/ognibuild/resolver/apt.py index 0b80e44..da332af 100644 --- a/ognibuild/resolver/apt.py +++ b/ognibuild/resolver/apt.py @@ -110,16 +110,19 @@ class AptRequirement(Requirement): return False -def find_package_names(apt_mgr: AptManager, paths: List[str], regex: bool = False) -> List[str]: +def find_package_names(apt_mgr: AptManager, paths: List[str], regex: bool = False, case_insensitive=False) -> List[str]: if not isinstance(paths, list): raise TypeError(paths) - return apt_mgr.get_packages_for_paths(paths, regex) + return apt_mgr.get_packages_for_paths(paths, regex, case_insensitive) -def find_reqs_simple(apt_mgr: AptManager, paths: List[str], regex: bool = False, minimum_version=None) -> List[str]: +def find_reqs_simple( + apt_mgr: AptManager, paths: List[str], regex: bool = False, + minimum_version=None, case_insensitive=False) -> List[str]: if not isinstance(paths, list): raise TypeError(paths) - return [AptRequirement.simple(package, minimum_version=minimum_version) for package in find_package_names(apt_mgr, paths, regex)] + return [AptRequirement.simple(package, minimum_version=minimum_version) + for package in find_package_names(apt_mgr, paths, regex, case_insensitive)] def python_spec_to_apt_rels(pkg_name, specs): @@ -163,7 +166,7 @@ def get_package_for_python_package(apt_mgr, package, python_version: Optional[st paths = [cpython3_regex, cpython2_regex, pypy_regex] else: raise NotImplementedError('unsupported python version %s' % python_version) - names = find_package_names(apt_mgr, paths, regex=True) + names = find_package_names(apt_mgr, paths, regex=True, case_insensitive=True) return [AptRequirement(python_spec_to_apt_rels(name, specs)) for name in names]