Unverified Commit da6ff861 authored by Sébastien Eustace's avatar Sébastien Eustace
Browse files

Fix solver adding uninstall operations for non-existing packages

parent 550481c9
Loading
Loading
Loading
Loading
+1 −0
Changes for CHANGELOG.md: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

- Fixed handling of markers with the `in` operator.
- 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
+12 −0
Changes for poetry/installation/installer.py: 12 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -330,6 +330,18 @@ class Installer:
        self._installer.update(source, target)

    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():
            self._io.writeln(
                '  - Removing <info>{}</> (<comment>{}</>)'.format(
+10 −4
Changes for poetry/puzzle/solver.py: 10 added lines, 4 removed lines.
Original line number Diff line number Diff line
@@ -105,12 +105,18 @@ class Solver:
                    break

            if remove:
                for locked in self._locked.packages:
                    if locked.name == pkg.name:
                        operations.append(Uninstall(pkg))

                skip = True
                for installed in self._installed.packages:
                    if installed.name == pkg.name:
                        skip = False
                        break

                op = Uninstall(pkg)
                if skip:
                    op.skip('Not currently installed')

                operations.append(op)

        requested_names = [r.name for r in requested]

        return sorted(
+17 −1
Changes for tests/puzzle/test_solver.py: 17 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -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')
    installed.add_package(package_a)
    locked.add_package(package_a)

    ops = solver.solve([])
@@ -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):
    package_a = get_package('A', '1.0')
    repo.add_package(package_a)