# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this, # file, You can obtain one at http://mozilla.org/MPL/2.0/. import toml from compare_locales import mozpath, paths from compare_locales.paths.matcher import expand from .projectconfig import generate_filename class HGFiles(paths.ProjectFiles): def __init__(self, repo, rev, projects): self.repo = repo self.ctx = repo[rev] self.root = repo.root() self.manifest = None self.configs_map = {} # get paths for our TOML files for p in projects: all_configpaths = { mozpath.abspath(c.path).encode("utf-8") for c in p.configs } for refpath in all_configpaths: local_path = mozpath.relpath(refpath, self.root) if local_path not in self.ctx: print("ignoring", refpath) continue targetpath = b"/".join( ( expand(None, "{l10n_base}", p.environ).encode("utf-8"), b"en-US", generate_filename(local_path), ) ) self.configs_map[refpath] = targetpath super(HGFiles, self).__init__("en-US", projects) for m in self.matchers: m["l10n"].encoding = "utf-8" if "reference" in m: m["reference"].encoding = "utf-8" if self.exclude: for m in self.exclude.matchers: m["l10n"].encoding = "utf-8" if "reference" in m: m["reference"].encoding = "utf-8" def _files(self, matcher): for f in self.ctx.manifest(): f = mozpath.join(self.root, f) if matcher.match(f): yield f def __iter__(self): for t in super(HGFiles, self).__iter__(): yield t for refpath, targetpath in self.configs_map.items(): yield targetpath, refpath, None, set() def match(self, path): m = super(HGFiles, self).match(path) if m: return m for refpath, targetpath in self.configs_map.items(): if path in [refpath, targetpath]: return targetpath, refpath, None, set() class HgTOMLParser(paths.TOMLParser): "subclass to load from our hg context" def __init__(self, repo, rev): self.repo = repo self.rev = rev self.root = repo.root().decode("utf-8") def load(self, parse_ctx): try: path = parse_ctx.path local_path = "path:" + mozpath.relpath(path, self.root) data = self.repo.cat(files=[local_path.encode("utf-8")], rev=self.rev) except Exception: raise paths.ConfigNotFound(parse_ctx.path) try: parse_ctx.data = toml.loads(data.decode()) except toml.TomlDecodeError as e: raise RuntimeError(f"In file '{parse_ctx.path}':\n {e!s}") from e