def fetch_git_dependency(dep_mapping, save_dir): """ fetches a git repository at source into save_dir, and copy the repository into output_path ref is used to checkout if exists only subdir is copied into output_path if specified """ source, deps = dep_mapping fetch_git_source(source, save_dir) for dep in deps: repo_path = os.path.join(save_dir, os.path.basename(source)) repo = Repo(repo_path) output_path = dep["output_path"] copy_src_path = repo_path if "ref" in dep: ref = dep["ref"] repo.git.checkout(ref) else: repo = Repo(repo_path) repo.git.checkout("master") # default ref if "subdir" in dep: sub_dir = dep["subdir"] full_subdir = os.path.join(repo_path, sub_dir) if os.path.isdir(full_subdir): copy_src_path = full_subdir else: raise GitSubdirNotFoundError( "Dependency {} : subdir {} not found in repo".format( source, sub_dir)) if not os.path.exists(os.path.abspath(output_path)): copy_tree(copy_src_path, output_path) logger.info("Dependency {} : saved to {}".format( source, output_path))
def fetch_git_dependency(dep_mapping, save_dir, force, item_type="Dependency"): """ fetches a git repository at source into save_dir, and copy the repository into output_path stored in dep_mapping. ref is used to checkout if exists, fetches master branch by default. only subdir is copied into output_path if specified. """ source, deps = dep_mapping # to avoid collisions between basename(source) path_hash = hashlib.sha256( os.path.dirname(source).encode()).hexdigest()[:8] cached_repo_path = os.path.join(save_dir, path_hash + os.path.basename(source)) if not exists_in_cache(cached_repo_path) or force: fetch_git_source(source, cached_repo_path, item_type) else: logger.debug("Using cached {} {}".format(item_type, cached_repo_path)) for dep in deps: repo = Repo(cached_repo_path) output_path = dep["output_path"] copy_src_path = cached_repo_path if "ref" in dep: ref = dep["ref"] repo.git.checkout(ref) else: repo.git.checkout("master") # default ref if "subdir" in dep: sub_dir = dep["subdir"] full_subdir = os.path.join(cached_repo_path, sub_dir) if os.path.isdir(full_subdir): copy_src_path = full_subdir else: raise GitSubdirNotFoundError( "{} {}: subdir {} not found in repo".format( item_type, source, sub_dir)) if force: copy_tree(copy_src_path, output_path) else: safe_copy_tree(copy_src_path, output_path) logger.info("{} {}: saved to {}".format(item_type, source, output_path))
def fetch_git_dependency(dep_mapping, save_dir): """ fetches a git repository at source into save_dir, and copy the repository into output_path ref is used to checkout if exists only subdir is copied into output_path if specified """ source, deps = dep_mapping fetch_git_source(source, save_dir) for dep in deps: repo_path = os.path.join(save_dir, os.path.basename(source)) repo = Repo(repo_path) output_path = dep["output_path"] copy_src_path = repo_path if 'ref' in dep: ref = dep['ref'] repo.git.checkout(ref) else: repo = Repo(repo_path) repo.git.checkout("master") # default ref if 'subdir' in dep: sub_dir = dep['subdir'] full_subdir = os.path.join(repo_path, sub_dir) if os.path.isdir(full_subdir): copy_src_path = full_subdir else: raise GitSubdirNotFoundError( "Dependency {} : subdir {} not found in repo".format( source, sub_dir)) if not os.path.exists(os.path.abspath(output_path)): # output_path could exist if this dependency is duplicated by inheritance or otherwise. # in such cases, simply skip the copy process copy_tree(copy_src_path, output_path) logger.info("Dependency {} : saved to {}".format( source, output_path))