Commit da6ff861 by Sébastien Eustace

Fix solver adding uninstall operations for non-existing packages

parent 550481c9
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
- Fixed handling of markers with the `in` operator. - Fixed handling of markers with the `in` operator.
- Fixed `update` not properly adding new packages to the lock file. - Fixed `update` not properly adding new packages to the lock file.
- Fixed solver adding uninstall operations for non-installed packages.
## [0.6.5] - 2018-03-22 ## [0.6.5] - 2018-03-22
......
...@@ -330,6 +330,18 @@ class Installer: ...@@ -330,6 +330,18 @@ class Installer:
self._installer.update(source, target) self._installer.update(source, target)
def _execute_uninstall(self, operation: Uninstall) -> None: def _execute_uninstall(self, operation: Uninstall) -> None:
if operation.skipped:
if self.is_verbose() and (self._execute_operations or self.is_dry_run()):
self._io.writeln(
' - Not removing <info>{}</> (<comment>{}</>) {}'.format(
operation.package.pretty_name,
operation.package.full_pretty_version,
operation.skip_reason
)
)
return
if self._execute_operations or self.is_dry_run(): if self._execute_operations or self.is_dry_run():
self._io.writeln( self._io.writeln(
' - Removing <info>{}</> (<comment>{}</>)'.format( ' - Removing <info>{}</> (<comment>{}</>)'.format(
......
...@@ -105,12 +105,18 @@ class Solver: ...@@ -105,12 +105,18 @@ class Solver:
break break
if remove: if remove:
for locked in self._locked.packages: skip = True
if locked.name == pkg.name: for installed in self._installed.packages:
operations.append(Uninstall(pkg)) if installed.name == pkg.name:
skip = False
break break
op = Uninstall(pkg)
if skip:
op.skip('Not currently installed')
operations.append(op)
requested_names = [r.name for r in requested] requested_names = [r.name for r in requested]
return sorted( return sorted(
......
...@@ -88,8 +88,9 @@ def test_solver_install_single(solver, repo): ...@@ -88,8 +88,9 @@ def test_solver_install_single(solver, repo):
]) ])
def test_solver_remove_if_no_longer_locked(solver, locked): def test_solver_remove_if_no_longer_locked(solver, locked, installed):
package_a = get_package('A', '1.0') package_a = get_package('A', '1.0')
installed.add_package(package_a)
locked.add_package(package_a) locked.add_package(package_a)
ops = solver.solve([]) ops = solver.solve([])
...@@ -99,6 +100,21 @@ def test_solver_remove_if_no_longer_locked(solver, locked): ...@@ -99,6 +100,21 @@ def test_solver_remove_if_no_longer_locked(solver, locked):
]) ])
def test_remove_non_installed(solver, repo, locked):
package_a = get_package('A', '1.0')
locked.add_package(package_a)
repo.add_package(package_a)
request = []
ops = solver.solve(request)
check_solver_result(ops, [
{'job': 'remove', 'package': package_a, 'skipped': True},
])
def test_install_non_existing_package_fail(solver, repo): def test_install_non_existing_package_fail(solver, repo):
package_a = get_package('A', '1.0') package_a = get_package('A', '1.0')
repo.add_package(package_a) repo.add_package(package_a)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment