python-poetry/poetry · error · IndexError

RepositoryPool can not remove unknown repository '{name}'.

Error message

RepositoryPool can not remove unknown repository '{name}'.

What it means

Raised by RepositoryPool.remove_repository when the name is not present in the pool (repository_pool.py:147-152). It guards against silently no-oping on a typo'd removal.

Source

Thrown at src/poetry/repositories/repository_pool.py:149

        self, repository: Repository, *, priority: Priority = Priority.PRIMARY
    ) -> RepositoryPool:
        """
        Adds a repository to the pool.
        """
        repository_name = repository.name.lower()
        if self.has_repository(repository_name):
            raise ValueError(
                f"A repository with name {repository_name} was already added."
            )

        self._repositories[repository_name] = PrioritizedRepository(
            repository, priority
        )
        return self

    def remove_repository(self, name: str) -> RepositoryPool:
        if not self.has_repository(name):
            raise IndexError(
                f"RepositoryPool can not remove unknown repository '{name}'."
            )
        del self._repositories[name.lower()]
        return self

    def package(
        self, name: str, version: Version, repository_name: str | None = None
    ) -> Package:
        if repository_name:
            return self.repository(repository_name).package(name, version)

        for repo in self.repositories:
            try:
                return repo.package(name, version)
            except PackageNotFoundError:
                continue
        raise PackageNotFoundError(f"Package {name} ({version}) not found.")

View on GitHub (pinned to 92b74dcfe3)

Solutions

  1. Guard the call with pool.has_repository(name) before removing.
  2. Verify the exact (case-insensitive) name you intend to remove.
  3. Avoid double-removal by tracking lifecycle state in calling code.

Example fix

// before
pool.remove_repository("myrepo")   # may raise if absent
// after
if pool.has_repository("myrepo"):
    pool.remove_repository("myrepo")
Defensive patterns

Strategy: validation

Validate before calling

if pool.has_repository(name):
    pool.remove_repository(name)
else:
    log.debug("repository '%s' not in pool; nothing to remove", name)

Try / catch

try:
    pool.remove_repository(name)
except IndexError as e:
    if "unknown repository" in str(e):
        log.debug("%s already absent", name)
    else:
        raise

Prevention

When it happens

Trigger: Calling pool.remove_repository('foo') when 'foo' was never added (or already removed).

Common situations: Programmatic pool manipulation that has lost track of registered names; double-removal; removal of a name that was never added due to a typo.

Related errors


AI-assisted analysis of python-poetry/poetry@92b74dcfe3 (2026-08-04). Data as JSON: /data/errors/61bb0735c7ad4a69.json. Report an issue: GitHub.