def handle(self, project: Project, options: argparse.Namespace) -> None: if not project.meta and click._compat.isatty(sys.stdout): actions.ask_for_import(project) if options.lock: if not project.lockfile_file.exists(): project.core.ui.echo( "Lock file does not exist, trying to generate one...") actions.do_lock(project, strategy="all") elif not project.is_lockfile_compatible(): project.core.ui.echo( "Lock file version is not compatible with PDM, regenerate..." ) actions.do_lock(project, strategy="all") elif not project.is_lockfile_hash_match(): project.core.ui.echo( "Lock file hash doesn't match pyproject.toml, regenerating..." ) actions.do_lock(project, strategy="reuse") actions.do_sync( project, sections=options.sections, dev=options.dev, default=options.default, no_editable=options.no_editable, no_self=options.no_self, )
def do_sync( project: Project, *, groups: Sequence[str] = (), dev: bool = True, default: bool = True, dry_run: bool = False, clean: bool = False, requirements: list[Requirement] | None = None, tracked_names: Sequence[str] | None = None, no_editable: bool = False, no_self: bool = False, reinstall: bool = False, ) -> None: """Synchronize project""" if requirements is None: if not project.lockfile_file.exists(): raise ProjectError("Lock file does not exist, nothing to sync") elif not project.is_lockfile_compatible(): project.core.ui.echo( "Lock file version is not compatible with PDM, " "install may fail, please regenerate the pdm.lock", err=True, ) elif not project.is_lockfile_hash_match(): project.core.ui.echo( "Lock file hash doesn't match pyproject.toml, packages may be outdated", err=True, ) groups = translate_groups(project, default, dev, groups or ()) requirements = [] for group in groups: requirements.extend(project.get_dependencies(group).values()) candidates = resolve_candidates_from_lockfile(project, requirements) if tracked_names and dry_run: candidates = { name: c for name, c in candidates.items() if name in tracked_names } handler = project.core.synchronizer_class( candidates, project.environment, clean, dry_run, no_editable=no_editable, install_self=not no_self and "default" in groups and bool(project.meta.name), use_install_cache=project.config["feature.install_cache"], reinstall=reinstall, ) handler.synchronize()
def handle(self, project: Project, options: argparse.Namespace) -> None: if not project.meta and click._compat.isatty(sys.stdout): actions.ask_for_import(project) if options.lock: if not project.lockfile_file.exists(): stream.echo( "Lock file does not exist, trying to generate one...") actions.do_lock(project, strategy="all") elif not project.is_lockfile_hash_match(): stream.echo( "Lock file hash doesn't match pyproject.toml, regenerating..." ) actions.do_lock(project, strategy="reuse") actions.do_sync(project, options.sections, options.dev, options.default, False, False)
def check_lockfile(project: Project, raise_not_exist: bool = True) -> str | None: """Check if the lock file exists and is up to date. Return the update strategy.""" if not project.lockfile_file.exists(): if raise_not_exist: raise ProjectError("Lock file does not exist, nothing to install") project.core.ui.echo("Lock file does not exist", fg="yellow", err=True) return "all" elif not project.is_lockfile_compatible(): project.core.ui.echo( "Lock file version is not compatible with PDM, installation may fail", fg="yellow", err=True, ) return "all" elif not project.is_lockfile_hash_match(): project.core.ui.echo( "Lock file hash doesn't match pyproject.toml, packages may be outdated", fg="yellow", err=True, ) return "reuse" return None