From a34ace2fa6608ee8b8316110375b4e0f1ffac4b1 Mon Sep 17 00:00:00 2001 From: Arun Babu Neelicattu Date: Fri, 2 Oct 2020 01:18:30 +0200 Subject: [PATCH] lock: allow for no-update refresh of lock files Relates-to: #3028 --- poetry/console/commands/lock.py | 10 ++++++++- poetry/installation/installer.py | 36 ++++++++++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/poetry/console/commands/lock.py b/poetry/console/commands/lock.py index ddedb055d87..2fae0abc26b 100644 --- a/poetry/console/commands/lock.py +++ b/poetry/console/commands/lock.py @@ -1,3 +1,5 @@ +from cleo import option + from .installer_command import InstallerCommand @@ -6,6 +8,12 @@ class LockCommand(InstallerCommand): name = "lock" description = "Locks the project dependencies." + options = [ + option( + "no-update", None, "Do not update locked versions, only refresh lock file." + ), + ] + help = """ The lock command reads the pyproject.toml file from the current directory, processes it, and locks the dependencies in the poetry.lock @@ -21,6 +29,6 @@ def handle(self): self.poetry.config.get("experimental.new-installer", False) ) - self._installer.lock() + self._installer.lock(self.option("no-update")) return self._installer.run() diff --git a/poetry/installation/installer.py b/poetry/installation/installer.py index f0c9a62d65d..a35e2bf7479 100644 --- a/poetry/installation/installer.py +++ b/poetry/installation/installer.py @@ -85,6 +85,10 @@ def set_locker(self, locker): # type: (Locker) -> Installer return self def run(self): + # Check if refresh + if not self._update and self._lock and self._locker.is_locked(): + return self._do_refresh() + # Force update if there is no lock file present if not self._update and not self._locker.is_locked(): self._update = True @@ -137,11 +141,11 @@ def update(self, update=True): # type: (bool) -> Installer return self - def lock(self): # type: () -> Installer + def lock(self, update=True): # type: (bool) -> Installer """ Prepare the installer for locking only. """ - self.update() + self.update(update=update) self.execute_operations(False) self._lock = True @@ -173,6 +177,34 @@ def use_executor(self, use_executor=True): # type: (bool) -> Installer return self + def _do_refresh(self): + from poetry.puzzle import Solver + + locked_repository = self._locker.locked_repository(True) + + # Checking extras + for extra in self._extras: + if extra not in self._package.extras: + raise ValueError("Extra [{}] is not specified.".format(extra)) + + solver = Solver( + self._package, + self._pool, + self._installed_repository, + locked_repository, + self._io, + remove_untracked=self._remove_untracked, + ) + + ops = solver.solve(use_latest=[]) + + local_repo = Repository() + self._populate_local_repo(local_repo, ops) + + self._write_lock_file(local_repo) + + return 0 + def _do_install(self, local_repo): from poetry.puzzle import Solver