def _update_sub_repo(self, path): from dvc.repo import Repo if path == self.root_dir: return dvc_dir = os.path.join(path, Repo.DVC_DIR) if not os.path.exists(dvc_dir): return root, dname = os.path.split(path) self._ignored_subrepos[root] = self._ignored_subrepos.get( root, set() ) | {dname} pattern_info = PatternInfo(f"/{dname}/", f"in sub_repo:{dname}") new_pattern = DvcIgnorePatterns([pattern_info], root) old_pattern = self.ignores_trie_tree.longest_prefix(root).value if old_pattern: self.ignores_trie_tree[root] = DvcIgnorePatterns( *merge_patterns( old_pattern.pattern_list, old_pattern.dirname, new_pattern.pattern_list, new_pattern.dirname, ) ) else: self.ignores_trie_tree[root] = new_pattern
def _update_sub_repo(self, path, ignore_trie: Trie): from dvc.repo import Repo if path == self.root_dir: return dvc_dir = self.fs.path.join(path, Repo.DVC_DIR) if not self.fs.exists(dvc_dir): return root, dname = self.fs.path.split(path) key = self._get_key(root) pattern_info = PatternInfo(f"/{dname}/", f"in sub_repo:{dname}") new_pattern = DvcIgnorePatterns([pattern_info], root, self.fs.sep) old_pattern = ignore_trie.longest_prefix(key).value if old_pattern: plist, prefix = merge_patterns( self.fs.path.flavour, old_pattern.pattern_list, old_pattern.dirname, new_pattern.pattern_list, new_pattern.dirname, ) ignore_trie[key] = DvcIgnorePatterns(plist, prefix, self.fs.sep) else: ignore_trie[key] = new_pattern
def from_file(cls, path, fs, name): assert fs.path.isabs(path) dirname = fs.path.normpath(fs.path.dirname(path)) with fs.open(path, encoding="utf-8") as fobj: path_spec_lines = [ PatternInfo(line, f"{name}:{line_no + 1}:{line}") for line_no, line in enumerate(map(str.strip, fobj.readlines())) if line and not (line.strip().startswith("#")) ] return cls(path_spec_lines, dirname, fs.sep)
def from_files(cls, ignore_file_path, fs): assert os.path.isabs(ignore_file_path) dirname = os.path.normpath(os.path.dirname(ignore_file_path)) ignore_file_rel_path = os.path.relpath(ignore_file_path, fs.fs_root) with fs.open(ignore_file_path, encoding="utf-8") as fobj: path_spec_lines = [ PatternInfo( line, "{}:{}:{}".format(ignore_file_rel_path, line_no + 1, line), ) for line_no, line in enumerate( map(str.strip, fobj.readlines())) if line and not (line.strip().startswith("#")) ] return cls(path_spec_lines, dirname)
def __init__(self, pattern_list, dirname): if pattern_list: if isinstance(pattern_list[0], str): pattern_list = [ PatternInfo(pattern, "") for pattern in pattern_list ] self.pattern_list = pattern_list self.dirname = dirname self.prefix = self.dirname + os.sep self.regex_pattern_list = [ GitWildMatchPattern.pattern_to_regex(pattern_info.patterns) for pattern_info in pattern_list ] self.ignore_spec = [(ignore, re.compile("|".join(item[0] for item in group))) for ignore, group in groupby( self.regex_pattern_list, lambda x: x[1]) if ignore is not None]
def _update_sub_repo(self, root, dirs): for d in dirs: if self._is_dvc_repo(root, d): self._ignored_subrepos[root] = self._ignored_subrepos.get( root, set() ) | {d} pattern_info = PatternInfo( f"/{d}/", "in sub_repo:{}".format(d) ) new_pattern = DvcIgnorePatterns([pattern_info], root) old_pattern = self.ignores_trie_tree.longest_prefix(root).value if old_pattern: self.ignores_trie_tree[root] = DvcIgnorePatterns( *merge_patterns( old_pattern.pattern_list, old_pattern.dirname, new_pattern.pattern_list, new_pattern.dirname, ) ) else: self.ignores_trie_tree[root] = new_pattern
def _to_pattern_info_list(str_list: List): return [PatternInfo(a, "") for a in str_list]
def test_dvcignore_pattern_change_dir(tmp_dir, patterns, dirname, changed): assert _change_dirname(dirname, [PatternInfo(patterns, "")], "/") == [PatternInfo(changed, "")]