@@ -21,10 +21,11 @@ use uv_workspace::pyproject_mut::{DependencyTarget, PyProjectTomlMut};
2121use uv_workspace:: { DiscoveryOptions , VirtualProject , Workspace } ;
2222
2323use crate :: commands:: pip:: loggers:: { DefaultInstallLogger , DefaultResolveLogger } ;
24+ use crate :: commands:: pip:: operations;
2425use crate :: commands:: pip:: operations:: Modifications ;
25- use crate :: commands:: project:: default_dependency_groups;
2626use crate :: commands:: project:: lock:: LockMode ;
27- use crate :: commands:: { project, ExitStatus , SharedState } ;
27+ use crate :: commands:: project:: { default_dependency_groups, ProjectError } ;
28+ use crate :: commands:: { diagnostics, project, ExitStatus , SharedState } ;
2829use crate :: printer:: Printer ;
2930use crate :: settings:: ResolverInstallerSettings ;
3031
@@ -213,7 +214,7 @@ pub(crate) async fn remove(
213214 let state = SharedState :: default ( ) ;
214215
215216 // Lock and sync the environment, if necessary.
216- let lock = project:: lock:: do_safe_lock (
217+ let lock = match project:: lock:: do_safe_lock (
217218 mode,
218219 project. workspace ( ) ,
219220 settings. as_ref ( ) . into ( ) ,
@@ -227,8 +228,41 @@ pub(crate) async fn remove(
227228 cache,
228229 printer,
229230 )
230- . await ?
231- . into_lock ( ) ;
231+ . await
232+ {
233+ Ok ( result) => result. into_lock ( ) ,
234+ Err ( ProjectError :: Operation ( operations:: Error :: Resolve (
235+ uv_resolver:: ResolveError :: NoSolution ( err) ,
236+ ) ) ) => {
237+ diagnostics:: no_solution ( & err) ;
238+ return Ok ( ExitStatus :: Failure ) ;
239+ }
240+ Err ( ProjectError :: Operation ( operations:: Error :: Resolve (
241+ uv_resolver:: ResolveError :: DownloadAndBuild ( dist, err) ,
242+ ) ) ) => {
243+ diagnostics:: download_and_build ( dist, err) ;
244+ return Ok ( ExitStatus :: Failure ) ;
245+ }
246+ Err ( ProjectError :: Operation ( operations:: Error :: Resolve (
247+ uv_resolver:: ResolveError :: Build ( dist, err) ,
248+ ) ) ) => {
249+ diagnostics:: build ( dist, err) ;
250+ return Ok ( ExitStatus :: Failure ) ;
251+ }
252+ Err ( ProjectError :: Operation ( operations:: Error :: Requirements (
253+ uv_requirements:: Error :: DownloadAndBuild ( dist, err) ,
254+ ) ) ) => {
255+ diagnostics:: download_and_build ( dist, err) ;
256+ return Ok ( ExitStatus :: Failure ) ;
257+ }
258+ Err ( ProjectError :: Operation ( operations:: Error :: Requirements (
259+ uv_requirements:: Error :: Build ( dist, err) ,
260+ ) ) ) => {
261+ diagnostics:: build ( dist, err) ;
262+ return Ok ( ExitStatus :: Failure ) ;
263+ }
264+ Err ( err) => return Err ( err. into ( ) ) ,
265+ } ;
232266
233267 if no_sync {
234268 return Ok ( ExitStatus :: Success ) ;
@@ -255,7 +289,7 @@ pub(crate) async fn remove(
255289 } ,
256290 } ;
257291
258- project:: sync:: do_sync (
292+ match project:: sync:: do_sync (
259293 target,
260294 & venv,
261295 & extras,
@@ -272,7 +306,29 @@ pub(crate) async fn remove(
272306 cache,
273307 printer,
274308 )
275- . await ?;
309+ . await
310+ {
311+ Ok ( ( ) ) => { }
312+ Err ( ProjectError :: Operation ( operations:: Error :: Prepare (
313+ uv_installer:: PrepareError :: Build ( dist, err) ,
314+ ) ) ) => {
315+ diagnostics:: build ( dist, err) ;
316+ return Ok ( ExitStatus :: Failure ) ;
317+ }
318+ Err ( ProjectError :: Operation ( operations:: Error :: Prepare (
319+ uv_installer:: PrepareError :: DownloadAndBuild ( dist, err) ,
320+ ) ) ) => {
321+ diagnostics:: download_and_build ( dist, err) ;
322+ return Ok ( ExitStatus :: Failure ) ;
323+ }
324+ Err ( ProjectError :: Operation ( operations:: Error :: Prepare (
325+ uv_installer:: PrepareError :: Download ( dist, err) ,
326+ ) ) ) => {
327+ diagnostics:: download ( dist, err) ;
328+ return Ok ( ExitStatus :: Failure ) ;
329+ }
330+ Err ( err) => return Err ( err. into ( ) ) ,
331+ }
276332
277333 Ok ( ExitStatus :: Success )
278334}
0 commit comments