Skip to content

Commit a66f99e

Browse files
jre21radoering
andauthored
Ensure repository deletion is consistent (#6214)
This change improves the consistency of `Pool().remove_repository()` to make it easier to write poetry plugins which mutate the repository pool. 1. Deleting an element from the middle of `Pool()._repositories` decrements the index of later entries. Update `Pool()._lookup` to reflect this. 2. If a primary repository is deleted, decrement `Pool()._secondary_start_idx` to ensure that any additional primary repositories are still added before all secondary repositories. 3. If the default repository is deleted, reset `Pool()._default` so a new one can be added. Co-authored-by: Randy Döring <[email protected]>
1 parent 6307f80 commit a66f99e

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

src/poetry/repositories/pool.py

+14
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,20 @@ def remove_repository(self, repository_name: str) -> Pool:
112112
idx = self._lookup.get(repository_name)
113113
if idx is not None:
114114
del self._repositories[idx]
115+
del self._lookup[repository_name]
116+
117+
if idx == 0:
118+
self._default = False
119+
120+
for name in self._lookup:
121+
if self._lookup[name] > idx:
122+
self._lookup[name] -= 1
123+
124+
if (
125+
self._secondary_start_idx is not None
126+
and self._secondary_start_idx > idx
127+
):
128+
self._secondary_start_idx -= 1
115129

116130
return self
117131

tests/repositories/test_pool.py

+68
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,71 @@ def test_repository_with_normal_default_and_secondary_repositories():
7474
assert pool.repository("foo") is repo1
7575
assert pool.repository("bar") is repo2
7676
assert pool.has_default()
77+
78+
79+
def test_remove_repository():
80+
repo1 = LegacyRepository("foo", "https://foo.bar")
81+
repo2 = LegacyRepository("bar", "https://bar.baz")
82+
repo3 = LegacyRepository("baz", "https://baz.quux")
83+
84+
pool = Pool()
85+
pool.add_repository(repo1)
86+
pool.add_repository(repo2)
87+
pool.add_repository(repo3)
88+
pool.remove_repository("bar")
89+
90+
assert pool.repository("foo") is repo1
91+
assert not pool.has_repository("bar")
92+
assert pool.repository("baz") is repo3
93+
94+
95+
def test_remove_default_repository():
96+
default = LegacyRepository("default", "https://default.com")
97+
repo1 = LegacyRepository("foo", "https://foo.bar")
98+
repo2 = LegacyRepository("bar", "https://bar.baz")
99+
new_default = LegacyRepository("new_default", "https://new.default.com")
100+
101+
pool = Pool()
102+
pool.add_repository(repo1)
103+
pool.add_repository(repo2)
104+
pool.add_repository(default, default=True)
105+
106+
assert pool.has_default()
107+
108+
pool.remove_repository("default")
109+
110+
assert not pool.has_default()
111+
112+
pool.add_repository(new_default, default=True)
113+
114+
assert pool.has_default()
115+
assert pool.repositories[0] is new_default
116+
assert not pool.has_repository("default")
117+
118+
119+
def test_repository_ordering():
120+
default1 = LegacyRepository("default1", "https://default1.com")
121+
default2 = LegacyRepository("default2", "https://default2.com")
122+
primary1 = LegacyRepository("primary1", "https://primary1.com")
123+
primary2 = LegacyRepository("primary2", "https://primary2.com")
124+
primary3 = LegacyRepository("primary3", "https://primary3.com")
125+
secondary1 = LegacyRepository("secondary1", "https://secondary1.com")
126+
secondary2 = LegacyRepository("secondary2", "https://secondary2.com")
127+
secondary3 = LegacyRepository("secondary3", "https://secondary3.com")
128+
129+
pool = Pool()
130+
pool.add_repository(secondary1, secondary=True)
131+
pool.add_repository(primary1)
132+
pool.add_repository(default1, default=True)
133+
pool.add_repository(primary2)
134+
pool.add_repository(secondary2, secondary=True)
135+
136+
pool.remove_repository("primary2")
137+
pool.remove_repository("secondary2")
138+
139+
pool.add_repository(primary3)
140+
pool.add_repository(secondary3, secondary=True)
141+
142+
assert pool.repositories == [default1, primary1, primary3, secondary1, secondary3]
143+
with pytest.raises(ValueError):
144+
pool.add_repository(default2, default=True)

0 commit comments

Comments
 (0)