Skip to content

Commit 10957d5

Browse files
dimblebyneersighted
authored andcommitted
Don't uninstall packages that should be kept
1 parent 196d666 commit 10957d5

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

src/poetry/puzzle/transaction.py

+10-4
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ def calculate_operations(
7474
operations.append(Install(result_package, priority=priority))
7575

7676
if with_uninstalls:
77+
uninstalls: set[str] = set()
7778
for current_package in self._current_packages:
7879
found = any(
7980
current_package.name == result_package.name
@@ -83,11 +84,12 @@ def calculate_operations(
8384
if not found:
8485
for installed_package in self._installed_packages:
8586
if installed_package.name == current_package.name:
87+
uninstalls.add(installed_package.name)
8688
operations.append(Uninstall(current_package))
8789

8890
if synchronize:
89-
current_package_names = {
90-
current_package.name for current_package in self._current_packages
91+
result_package_names = {
92+
result_package.name for result_package, _ in self._result_packages
9193
}
9294
# We preserve pip/setuptools/wheel when not managed by poetry, this is
9395
# done to avoid externally managed virtual environments causing
@@ -96,9 +98,12 @@ def calculate_operations(
9698
"pip",
9799
"setuptools",
98100
"wheel",
99-
} - current_package_names
101+
} - result_package_names
100102

101103
for installed_package in self._installed_packages:
104+
if installed_package.name in uninstalls:
105+
continue
106+
102107
if (
103108
self._root_package
104109
and installed_package.name == self._root_package.name
@@ -108,7 +113,8 @@ def calculate_operations(
108113
if installed_package.name in preserved_package_names:
109114
continue
110115

111-
if installed_package.name not in current_package_names:
116+
if installed_package.name not in result_package_names:
117+
uninstalls.add(installed_package.name)
112118
operations.append(Uninstall(installed_package))
113119

114120
return sorted(

tests/puzzle/test_transaction.py

+25
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,31 @@ def test_it_should_remove_installed_packages_if_required():
121121
)
122122

123123

124+
def test_it_should_not_remove_installed_packages_that_are_in_result():
125+
transaction = Transaction(
126+
[],
127+
[
128+
(Package("a", "1.0.0"), 1),
129+
(Package("b", "2.0.0"), 2),
130+
(Package("c", "3.0.0"), 0),
131+
],
132+
installed_packages=[
133+
Package("a", "1.0.0"),
134+
Package("b", "2.0.0"),
135+
Package("c", "3.0.0"),
136+
],
137+
)
138+
139+
check_operations(
140+
transaction.calculate_operations(synchronize=True),
141+
[
142+
{"job": "install", "package": Package("a", "1.0.0"), "skipped": True},
143+
{"job": "install", "package": Package("b", "2.0.0"), "skipped": True},
144+
{"job": "install", "package": Package("c", "3.0.0"), "skipped": True},
145+
],
146+
)
147+
148+
124149
def test_it_should_update_installed_packages_if_sources_are_different():
125150
transaction = Transaction(
126151
[Package("a", "1.0.0")],

0 commit comments

Comments
 (0)