示例#1
0
    def remove(self):
        """
        Delete a conda environment.
        Use 'conda env remove', then 'rm_tree' to be safe.

        Conda seems to load "vcruntime140.dll" from all its environment on startup.
        This means environment have to be deleted using 'conda env remove'.
        If necessary, conda can be fooled into deleting a partially-deleted environment by creating an empty file
        in '<ENV>\conda-meta\history' (value found in 'conda.gateways.disk.test.PREFIX_MAGIC_FILE').
        Otherwise, it complains that said directory is not a conda environment.

        See: https://github.com/conda/conda/issues/7682
        """
        try:
            self._run_command(("env", "remove", "-p", self.path))
        except Exception:
            pass
        rm_tree(self.path)
        # if we failed removing the path, change it's name
        if is_windows_platform() and Path(self.path).exists():
            try:
                Path(self.path).rename(
                    Path(self.path).as_posix() + '_' + str(time()))
            except Exception:
                pass
示例#2
0
def clone_repository_cached(session, execution, destination):
    # type: (Session, ExecutionInfo, Path) -> Tuple[VCS, RepoInfo]
    """
    Clone a remote repository.
    :param execution: execution info
    :param destination: directory to clone to (in which a directory for the repository will be created)
    :param session: program session
    :return: repository information
    :raises: CommandFailedError if git/hg is not installed
    """
    repo_url = execution.repository  # type: str
    parsed_url = furl(repo_url)
    no_password_url = parsed_url.copy().remove(password=True).url

    clone_folder_name = Path(str(furl(repo_url).path)).name  # type: str
    clone_folder = Path(destination) / clone_folder_name
    cached_repo_path = (
        Path(session.config["agent.vcs_cache.path"]).expanduser() /
        "{}.{}".format(clone_folder_name,
                       md5(ensure_binary(repo_url)).hexdigest()) /
        clone_folder_name)  # type: Path

    vcs = VcsFactory.create(session,
                            execution_info=execution,
                            location=cached_repo_path)
    if not find_executable(vcs.executable_name):
        raise CommandFailedError(vcs.executable_not_found_error_help())

    if session.config["agent.vcs_cache.enabled"] and cached_repo_path.exists():
        print('Using cached repository in "{}"'.format(cached_repo_path))
    else:
        print("cloning: {}".format(no_password_url))
        rm_tree(cached_repo_path)
        # We clone the entire repository, not a specific branch
        vcs.clone()  # branch=execution.branch)

    vcs.pull()
    rm_tree(destination)
    shutil.copytree(Text(cached_repo_path), Text(clone_folder))
    if not clone_folder.is_dir():
        raise CommandFailedError(
            "copying of repository failed: from {} to {}".format(
                cached_repo_path, clone_folder))

    # checkout in the newly copy destination
    vcs.location = Text(clone_folder)
    vcs.checkout()

    repo_info = vcs.get_repository_copy_info(clone_folder)

    # make sure we have no user/pass in the returned repository structure
    repo_info = attr.evolve(repo_info, url=no_password_url)

    return vcs, repo_info
示例#3
0
 def remove(self):
     """
     Delete virtualenv.
     Only valid if instantiated with path.
     """
     rm_tree(self.path)