Pin lock futures (#16643)

These futures are quite large (~16,000 bytes) and adding new fields to
the `ResolverOptions` in another pull request caused a lint error from
Clippy.
This commit is contained in:
Zanie Blue 2025-11-09 10:37:16 -06:00 committed by GitHub
parent caf49f845f
commit 2d9fe7ca70
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 176 additions and 154 deletions

View File

@ -990,24 +990,26 @@ async fn lock_and_sync(
printer: Printer, printer: Printer,
preview: Preview, preview: Preview,
) -> Result<(), ProjectError> { ) -> Result<(), ProjectError> {
let mut lock = project::lock::LockOperation::new( let mut lock = Box::pin(
if let LockCheck::Enabled(lock_check) = lock_check { project::lock::LockOperation::new(
LockMode::Locked(target.interpreter(), lock_check) if let LockCheck::Enabled(lock_check) = lock_check {
} else { LockMode::Locked(target.interpreter(), lock_check)
LockMode::Write(target.interpreter()) } else {
}, LockMode::Write(target.interpreter())
&settings.resolver, },
client_builder, &settings.resolver,
&lock_state, client_builder,
Box::new(DefaultResolveLogger), &lock_state,
concurrency, Box::new(DefaultResolveLogger),
cache, concurrency,
&WorkspaceCache::default(), cache,
printer, &WorkspaceCache::default(),
preview, printer,
preview,
)
.with_constraints(constraints)
.execute((&target).into()),
) )
.with_constraints(constraints)
.execute((&target).into())
.await? .await?
.into_lock(); .into_lock();
@ -1112,23 +1114,25 @@ async fn lock_and_sync(
// If the file was modified, we have to lock again, though the only expected change is // If the file was modified, we have to lock again, though the only expected change is
// the addition of the minimum version specifiers. // the addition of the minimum version specifiers.
lock = project::lock::LockOperation::new( lock = Box::pin(
if let LockCheck::Enabled(lock_check) = lock_check { project::lock::LockOperation::new(
LockMode::Locked(target.interpreter(), lock_check) if let LockCheck::Enabled(lock_check) = lock_check {
} else { LockMode::Locked(target.interpreter(), lock_check)
LockMode::Write(target.interpreter()) } else {
}, LockMode::Write(target.interpreter())
&settings.resolver, },
client_builder, &settings.resolver,
&lock_state, client_builder,
Box::new(SummaryResolveLogger), &lock_state,
concurrency, Box::new(SummaryResolveLogger),
cache, concurrency,
&WorkspaceCache::default(), cache,
printer, &WorkspaceCache::default(),
preview, printer,
preview,
)
.execute((&target).into()),
) )
.execute((&target).into())
.await? .await?
.into_lock(); .into_lock();
} }

View File

@ -199,19 +199,21 @@ pub(crate) async fn export(
let state = UniversalState::default(); let state = UniversalState::default();
// Lock the project. // Lock the project.
let lock = match LockOperation::new( let lock = match Box::pin(
mode, LockOperation::new(
&settings, mode,
&client_builder, &settings,
&state, &client_builder,
Box::new(DefaultResolveLogger), &state,
concurrency, Box::new(DefaultResolveLogger),
cache, concurrency,
&workspace_cache, cache,
printer, &workspace_cache,
preview, printer,
preview,
)
.execute((&target).into()),
) )
.execute((&target).into())
.await .await
{ {
Ok(result) => result.into_lock(), Ok(result) => result.into_lock(),

View File

@ -190,20 +190,22 @@ pub(crate) async fn lock(
let state = UniversalState::default(); let state = UniversalState::default();
// Perform the lock operation. // Perform the lock operation.
match LockOperation::new( match Box::pin(
mode, LockOperation::new(
&settings, mode,
&client_builder, &settings,
&state, &client_builder,
Box::new(DefaultResolveLogger), &state,
concurrency, Box::new(DefaultResolveLogger),
cache, concurrency,
&workspace_cache, cache,
printer, &workspace_cache,
preview, printer,
preview,
)
.with_refresh(&refresh)
.execute(target),
) )
.with_refresh(&refresh)
.execute(target)
.await .await
{ {
Ok(lock) => { Ok(lock) => {
@ -355,7 +357,7 @@ impl<'env> LockOperation<'env> {
.ok_or_else(|| ProjectError::MissingLockfile)?; .ok_or_else(|| ProjectError::MissingLockfile)?;
// Perform the lock operation, but don't write the lockfile to disk. // Perform the lock operation, but don't write the lockfile to disk.
let result = do_lock( let result = Box::pin(do_lock(
target, target,
interpreter, interpreter,
Some(existing), Some(existing),
@ -370,7 +372,7 @@ impl<'env> LockOperation<'env> {
self.workspace_cache, self.workspace_cache,
self.printer, self.printer,
self.preview, self.preview,
) ))
.await?; .await?;
// If the lockfile changed, return an error. // If the lockfile changed, return an error.
@ -399,7 +401,7 @@ impl<'env> LockOperation<'env> {
}; };
// Perform the lock operation. // Perform the lock operation.
let result = do_lock( let result = Box::pin(do_lock(
target, target,
interpreter, interpreter,
existing, existing,
@ -414,7 +416,7 @@ impl<'env> LockOperation<'env> {
self.workspace_cache, self.workspace_cache,
self.printer, self.printer,
self.preview, self.preview,
) ))
.await?; .await?;
// If the lockfile changed, write it to disk. // If the lockfile changed, write it to disk.

View File

@ -301,19 +301,21 @@ pub(crate) async fn remove(
let state = UniversalState::default(); let state = UniversalState::default();
// Lock and sync the environment, if necessary. // Lock and sync the environment, if necessary.
let lock = match project::lock::LockOperation::new( let lock = match Box::pin(
mode, project::lock::LockOperation::new(
&settings.resolver, mode,
&client_builder, &settings.resolver,
&state, &client_builder,
Box::new(DefaultResolveLogger), &state,
concurrency, Box::new(DefaultResolveLogger),
cache, concurrency,
&WorkspaceCache::default(), cache,
printer, &WorkspaceCache::default(),
preview, printer,
preview,
)
.execute((&target).into()),
) )
.execute((&target).into())
.await .await
{ {
Ok(result) => result.into_lock(), Ok(result) => result.into_lock(),

View File

@ -271,23 +271,25 @@ hint: If you are running a script with `{}` in the shebang, you may need to incl
}; };
// Generate a lockfile. // Generate a lockfile.
let lock = match project::lock::LockOperation::new( let lock = match Box::pin(
mode, project::lock::LockOperation::new(
&settings.resolver, mode,
&client_builder, &settings.resolver,
&lock_state, &client_builder,
if show_resolution { &lock_state,
Box::new(DefaultResolveLogger) if show_resolution {
} else { Box::new(DefaultResolveLogger)
Box::new(SummaryResolveLogger) } else {
}, Box::new(SummaryResolveLogger)
concurrency, },
&cache, concurrency,
&workspace_cache, &cache,
printer, &workspace_cache,
preview, printer,
preview,
)
.execute(target),
) )
.execute(target)
.await .await
{ {
Ok(result) => result.into_lock(), Ok(result) => result.into_lock(),
@ -748,23 +750,25 @@ hint: If you are running a script with `{}` in the shebang, you may need to incl
LockMode::Write(venv.interpreter()) LockMode::Write(venv.interpreter())
}; };
let result = match project::lock::LockOperation::new( let result = match Box::pin(
mode, project::lock::LockOperation::new(
&settings.resolver, mode,
&client_builder, &settings.resolver,
&lock_state, &client_builder,
if show_resolution { &lock_state,
Box::new(DefaultResolveLogger) if show_resolution {
} else { Box::new(DefaultResolveLogger)
Box::new(SummaryResolveLogger) } else {
}, Box::new(SummaryResolveLogger)
concurrency, },
&cache, concurrency,
&workspace_cache, &cache,
printer, &workspace_cache,
preview, printer,
preview,
)
.execute(project.workspace().into()),
) )
.execute(project.workspace().into())
.await .await
{ {
Ok(result) => result, Ok(result) => result,

View File

@ -331,19 +331,21 @@ pub(crate) async fn sync(
SyncTarget::Script(script) => LockTarget::from(script), SyncTarget::Script(script) => LockTarget::from(script),
}; };
let outcome = match LockOperation::new( let outcome = match Box::pin(
mode, LockOperation::new(
&settings.resolver, mode,
&client_builder, &settings.resolver,
&state, &client_builder,
Box::new(DefaultResolveLogger), &state,
concurrency, Box::new(DefaultResolveLogger),
cache, concurrency,
&workspace_cache, cache,
printer, &workspace_cache,
preview, printer,
preview,
)
.execute(lock_target),
) )
.execute(lock_target)
.await .await
{ {
Ok(result) => Outcome::Success(result), Ok(result) => Outcome::Success(result),

View File

@ -139,19 +139,21 @@ pub(crate) async fn tree(
let state = UniversalState::default(); let state = UniversalState::default();
// Update the lockfile, if necessary. // Update the lockfile, if necessary.
let lock = match LockOperation::new( let lock = match Box::pin(
mode, LockOperation::new(
&settings, mode,
client_builder, &settings,
&state, client_builder,
Box::new(DefaultResolveLogger), &state,
concurrency, Box::new(DefaultResolveLogger),
cache, concurrency,
&WorkspaceCache::default(), cache,
printer, &WorkspaceCache::default(),
preview, printer,
preview,
)
.execute(target),
) )
.execute(target)
.await .await
{ {
Ok(result) => result.into_lock(), Ok(result) => result.into_lock(),

View File

@ -450,19 +450,21 @@ async fn print_frozen_version(
let state = UniversalState::default(); let state = UniversalState::default();
// Lock and sync the environment, if necessary. // Lock and sync the environment, if necessary.
let lock = match project::lock::LockOperation::new( let lock = match Box::pin(
LockMode::Frozen, project::lock::LockOperation::new(
&settings.resolver, LockMode::Frozen,
&client_builder, &settings.resolver,
&state, &client_builder,
Box::new(DefaultResolveLogger), &state,
concurrency, Box::new(DefaultResolveLogger),
cache, concurrency,
&WorkspaceCache::default(), cache,
printer, &WorkspaceCache::default(),
preview, printer,
preview,
)
.execute((&target).into()),
) )
.execute((&target).into())
.await .await
{ {
Ok(result) => result.into_lock(), Ok(result) => result.into_lock(),
@ -590,19 +592,21 @@ async fn lock_and_sync(
let workspace_cache = WorkspaceCache::default(); let workspace_cache = WorkspaceCache::default();
// Lock and sync the environment, if necessary. // Lock and sync the environment, if necessary.
let lock = match project::lock::LockOperation::new( let lock = match Box::pin(
mode, project::lock::LockOperation::new(
&settings.resolver, mode,
&client_builder, &settings.resolver,
&state, &client_builder,
Box::new(DefaultResolveLogger), &state,
concurrency, Box::new(DefaultResolveLogger),
cache, concurrency,
&workspace_cache, cache,
printer, &workspace_cache,
preview, printer,
preview,
)
.execute((&target).into()),
) )
.execute((&target).into())
.await .await
{ {
Ok(result) => result.into_lock(), Ok(result) => result.into_lock(),