# Copyright (c) Open-MMLab. All rights reserved. import os import os.path as osp import sys from pathlib import Path if sys.version_info <= (3, 3): FileNotFoundError = IOError else: FileNotFoundError = FileNotFoundError def is_filepath(x): if isinstance(x, str) or isinstance(x, Path): return True else: return False def fopen(filepath, *args, **kwargs): if isinstance(filepath, str): return open(filepath, *args, **kwargs) elif isinstance(filepath, Path): return filepath.open(*args, **kwargs) def check_file_exist(filename, msg_tmpl='file "{}" does not exist'): if not osp.isfile(filename): raise FileNotFoundError(msg_tmpl.format(filename)) def mkdir_or_exist(dir_name, mode=0o777): if dir_name == '': return dir_name = osp.expanduser(dir_name) os.makedirs(dir_name, mode=mode, exist_ok=True) def symlink(src, dst, overwrite=True, **kwargs): if os.path.lexists(dst) and overwrite: os.remove(dst) os.symlink(src, dst, **kwargs) def _scandir_py35(dir_path, suffix=None): for entry in os.scandir(dir_path): if not entry.is_file(): continue filename = entry.name if suffix is None: yield filename elif filename.endswith(suffix): yield filename def _scandir_py(dir_path, suffix=None): for filename in os.listdir(dir_path): if not osp.isfile(osp.join(dir_path, filename)): continue if suffix is None: yield filename elif filename.endswith(suffix): yield filename def scandir(dir_path, suffix=None): if suffix is not None and not isinstance(suffix, (str, tuple)): raise TypeError('"suffix" must be a string or tuple of strings') if sys.version_info >= (3, 5): return _scandir_py35(dir_path, suffix) else: return _scandir_py(dir_path, suffix) def find_vcs_root(path, markers=('.git', )): """Finds the root directory (including itself) of specified markers. Args: path (str): Path of directory or file. markers (list[str], optional): List of file or directory names. Returns: The directory contained one of the markers or None if not found. """ if osp.isfile(path): path = osp.dirname(path) prev, cur = None, osp.abspath(osp.expanduser(path)) while cur != prev: if any(osp.exists(osp.join(cur, marker)) for marker in markers): return cur prev, cur = cur, osp.split(cur)[0] return None