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 = NoneView on GitHub (pinned to 92b74dcfe3)
Solutions
- Remove the duplicate [[tool.poetry.source]] entry with the colliding name.
- If adding programmatically, call pool.has_repository(name) before add_repository.
- 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
- Always check pool.has_repository(name) before add_repository.
- Lint pyproject.toml for duplicate [[tool.poetry.source]] names.
- Generate source names deterministically to avoid accidental duplicates.
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
- Repository "{name}" does not exist.
- Key {'.'.join(keys)} not in config
- Key {'.'.join(keys)} not in config
- You must pass exactly 1 value
- Invalid build config setting '{value}'. It must be a valid J
AI-assisted analysis of python-poetry/poetry@92b74dcfe3 (2026-08-04).
Data as JSON: /data/errors/79d857250967abbe.json.
Report an issue: GitHub.