未验证 提交 347300ee 编写于 作者: F Frost Ming 提交者: GitHub

feat: Delay the trigger of post_lock in add and update command (#1320)

上级 dfaea348
Delay the trigger of `post_lock` for `add` and `update` operations, to ensure the `pyproject.toml` is updated before the hook is run.
...@@ -275,9 +275,10 @@ def do_add( ...@@ -275,9 +275,10 @@ def do_add(
req.specifier = get_specifier("") req.specifier = get_specifier("")
group_deps.update(requirements) group_deps.update(requirements)
reqs = [r for deps in all_dependencies.values() for r in deps.values()] reqs = [r for deps in all_dependencies.values() for r in deps.values()]
resolved = do_lock( with hooks.skipping("post_lock"):
project, strategy, tracked_names, reqs, dry_run=dry_run, hooks=hooks resolved = do_lock(
) project, strategy, tracked_names, reqs, dry_run=dry_run, hooks=hooks
)
# Update dependency specifiers and lockfile hash. # Update dependency specifiers and lockfile hash.
deps_to_update = group_deps if unconstrained else requirements deps_to_update = group_deps if unconstrained else requirements
...@@ -285,6 +286,7 @@ def do_add( ...@@ -285,6 +286,7 @@ def do_add(
if not dry_run: if not dry_run:
project.add_dependencies(deps_to_update, group, dev) project.add_dependencies(deps_to_update, group, dev)
project.write_lockfile(project.lockfile, False) project.write_lockfile(project.lockfile, False)
hooks.try_emit("post_lock", resolution=resolved, dry_run=dry_run)
_populate_requirement_names(group_deps) _populate_requirement_names(group_deps)
if sync: if sync:
do_sync( do_sync(
...@@ -384,6 +386,13 @@ def do_update( ...@@ -384,6 +386,13 @@ def do_update(
) )
for deps in updated_deps.values(): for deps in updated_deps.values():
_populate_requirement_names(deps) _populate_requirement_names(deps)
if unconstrained and not dry_run:
# Need to update version constraints
save_version_specifiers(updated_deps, resolved, save)
for group, deps in updated_deps.items():
project.add_dependencies(deps, group, dev or False)
lockfile = project.lockfile
project.write_lockfile(lockfile, False)
if sync or dry_run: if sync or dry_run:
do_sync( do_sync(
project, project,
...@@ -400,13 +409,6 @@ def do_update( ...@@ -400,13 +409,6 @@ def do_update(
no_self=no_self, no_self=no_self,
hooks=hooks, hooks=hooks,
) )
if unconstrained and not dry_run:
# Need to update version constraints
save_version_specifiers(updated_deps, resolved, save)
for group, deps in updated_deps.items():
project.add_dependencies(deps, group, dev or False)
lockfile = project.lockfile
project.write_lockfile(lockfile, False)
def do_remove( def do_remove(
......
from __future__ import annotations from __future__ import annotations
from typing import Any import contextlib
from typing import Any, Generator
from blinker import Signal from blinker import Signal
...@@ -21,6 +22,16 @@ class HookManager: ...@@ -21,6 +22,16 @@ class HookManager:
self.project = project self.project = project
self.skip = skip or [] self.skip = skip or []
@contextlib.contextmanager
def skipping(self, *names: str) -> Generator[None, None, None]:
"""
Temporarily skip some hooks.
"""
old_skip = self.skip[:]
self.skip.extend(names)
yield
self.skip = old_skip
@cached_property @cached_property
def skip_all(self) -> bool: def skip_all(self) -> bool:
return ":all" in self.skip return ":all" in self.skip
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册