python-poetry/poetry · error · ValueError

A repository with name {repository_name} was already added.

Error message

A repository with name {repository_name} was already added.

What it means

Raised by RepositoryPool.add_repository when a repository with the same (lowercased) name is already registered (repository_pool.py:136-140). Names must be unique within a pool because lookups are keyed by name.

Source

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

    def get_priority(self, name: str) -> Priority:
        return self._get_prioritized_repository(name).priority

    def _get_prioritized_repository(self, name: str) -> PrioritizedRepository:
        name = name.lower()
        if self.has_repository(name):
            return self._repositories[name]
        raise IndexError(f'Repository "{name}" does not exist.')

    def add_repository(
        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

View on GitHub (pinned to 92b74dcfe3)

Solutions

  1. Remove the duplicate [[tool.poetry.source]] entry with the colliding name.
  2. If adding programmatically, call pool.has_repository(name) before add_repository.
  3. Rename one of the repositories to a unique name.

Example fix

// before
[[tool.poetry.source]]
name = "private"
url = "https://a.example.com/simple/"
[[tool.poetry.source]]
name = "private"          # duplicate
url = "https://b.example.com/simple/"
// after
[[tool.poetry.source]]
name = "private-a"
url = "https://a.example.com/simple/"
[[tool.poetry.source]]
name = "private-b"
url = "https://b.example.com/simple/"
Defensive patterns

Strategy: validation

Validate before calling

if pool.has_repository(repo.name):
    raise ValueError(f"repository '{repo.name}' already in pool; rename it")
pool.add_repository(repo)

Try / catch

try:
    pool.add_repository(repo)
except ValueError as e:
    if "already added" in str(e):
        log.warning("%s already registered; skipping", repo.name)
    else:
        raise

Prevention

When it happens

Trigger: Calling pool.add_repository(repo) twice with repositories sharing a name; or a config that declares two [[tool.poetry.source]] entries with the same name.

Common situations: Duplicate source entries in pyproject.toml; programmatic pool assembly adding the default PyPI twice; copy-paste error in source config.

Related errors


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