@@ -74,6 +74,7 @@ def calculate_operations(
74
74
operations .append (Install (result_package , priority = priority ))
75
75
76
76
if with_uninstalls :
77
+ uninstalls : set [str ] = set ()
77
78
for current_package in self ._current_packages :
78
79
found = any (
79
80
current_package .name == result_package .name
@@ -83,11 +84,12 @@ def calculate_operations(
83
84
if not found :
84
85
for installed_package in self ._installed_packages :
85
86
if installed_package .name == current_package .name :
87
+ uninstalls .add (installed_package .name )
86
88
operations .append (Uninstall (current_package ))
87
89
88
90
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
91
93
}
92
94
# We preserve pip/setuptools/wheel when not managed by poetry, this is
93
95
# done to avoid externally managed virtual environments causing
@@ -96,9 +98,12 @@ def calculate_operations(
96
98
"pip" ,
97
99
"setuptools" ,
98
100
"wheel" ,
99
- } - current_package_names
101
+ } - result_package_names
100
102
101
103
for installed_package in self ._installed_packages :
104
+ if installed_package .name in uninstalls :
105
+ continue
106
+
102
107
if (
103
108
self ._root_package
104
109
and installed_package .name == self ._root_package .name
@@ -108,7 +113,8 @@ def calculate_operations(
108
113
if installed_package .name in preserved_package_names :
109
114
continue
110
115
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 )
112
118
operations .append (Uninstall (installed_package ))
113
119
114
120
return sorted (
0 commit comments