@@ -178,12 +178,15 @@ pub fn update_workspace_lockfile(
178178
179179 req_file. flush ( ) ?;
180180
181- let exclusions = find_exclusions ( & projects) ?;
181+ let exclusions = find_requirements ( & projects, & DependencyKind :: Excluded ) ?;
182+ let overrides = find_requirements ( & projects, & DependencyKind :: Override ) ?;
183+ let overrides_file = maybe_write_requirements_to_temp ( & overrides) ?;
182184 generate_lockfile (
183185 output,
184186 py_ver,
185187 & workspace. path ( ) ,
186188 req_file. path ( ) ,
189+ overrides_file. as_ref ( ) . map ( |v| v. path ( ) ) ,
187190 lockfile,
188191 sources,
189192 & lock_options,
@@ -194,6 +197,20 @@ pub fn update_workspace_lockfile(
194197 Ok ( ( ) )
195198}
196199
200+ fn maybe_write_requirements_to_temp ( requirements : & HashSet < Requirement > ) -> Result < Option < NamedTempFile > , Error > {
201+ if requirements. is_empty ( ) {
202+ Ok ( None )
203+ }
204+ else {
205+ let mut nt_file = NamedTempFile :: new ( ) ?;
206+ for dep in requirements {
207+ writeln ! ( & nt_file, "{}" , dep) ?;
208+ }
209+ nt_file. flush ( ) ?;
210+ Ok ( Some ( nt_file) )
211+ }
212+ }
213+
197214/// Tries to restore the lock options from the given lockfile.
198215fn restore_lock_options < ' o > (
199216 lockfile : & Path ,
@@ -263,10 +280,10 @@ fn collect_workspace_features(
263280 Some ( features_by_project)
264281}
265282
266- fn find_exclusions ( projects : & [ PyProject ] ) -> Result < HashSet < Requirement > , Error > {
283+ fn find_requirements ( projects : & [ PyProject ] , kind : & DependencyKind ) -> Result < HashSet < Requirement > , Error > {
267284 let mut rv = HashSet :: new ( ) ;
268285 for project in projects {
269- for dep in project. iter_dependencies ( DependencyKind :: Excluded ) {
286+ for dep in project. iter_dependencies ( & kind ) {
270287 rv. insert ( dep. expand ( |name : & str | {
271288 if name == "PROJECT_ROOT" {
272289 Some ( project. workspace_path ( ) . to_string_lossy ( ) . to_string ( ) )
@@ -285,7 +302,7 @@ fn dump_dependencies(
285302 out : & mut fs:: File ,
286303 dep_kind : DependencyKind ,
287304) -> Result < ( ) , Error > {
288- for dep in pyproject. iter_dependencies ( dep_kind) {
305+ for dep in pyproject. iter_dependencies ( & dep_kind) {
289306 if let Ok ( expanded_dep) = dep. expand ( |_| {
290307 // we actually do not care what it expands to much, for as long
291308 // as the end result parses
@@ -334,23 +351,26 @@ pub fn update_single_project_lockfile(
334351 ) ?;
335352 }
336353
337- for dep in pyproject. iter_dependencies ( DependencyKind :: Normal ) {
354+ for dep in pyproject. iter_dependencies ( & DependencyKind :: Normal ) {
338355 writeln ! ( req_file, "{}" , dep) ?;
339356 }
340357 if lock_mode == LockMode :: Dev {
341- for dep in pyproject. iter_dependencies ( DependencyKind :: Dev ) {
358+ for dep in pyproject. iter_dependencies ( & DependencyKind :: Dev ) {
342359 writeln ! ( req_file, "{}" , dep) ?;
343360 }
344361 }
345362
346363 req_file. flush ( ) ?;
347364
348- let exclusions = find_exclusions ( std:: slice:: from_ref ( pyproject) ) ?;
365+ let exclusions = find_requirements ( std:: slice:: from_ref ( pyproject) , & DependencyKind :: Excluded ) ?;
366+ let overrides = find_requirements ( std:: slice:: from_ref ( pyproject) , & DependencyKind :: Override ) ?;
367+ let overrides_file = maybe_write_requirements_to_temp ( & overrides) ?;
349368 generate_lockfile (
350369 output,
351370 py_ver,
352371 & pyproject. workspace_path ( ) ,
353372 req_file. path ( ) ,
373+ overrides_file. as_ref ( ) . map ( |v| v. path ( ) ) ,
354374 lockfile,
355375 sources,
356376 & lock_options,
@@ -367,6 +387,7 @@ fn generate_lockfile(
367387 py_ver : & PythonVersion ,
368388 workspace_path : & Path ,
369389 requirements_file_in : & Path ,
390+ overrides_file_in : Option < & Path > ,
370391 lockfile : & Path ,
371392 sources : & ExpandedSources ,
372393 lock_options : & LockOptions ,
@@ -405,12 +426,16 @@ fn generate_lockfile(
405426 . lockfile (
406427 py_ver,
407428 requirements_file_in,
429+ overrides_file_in,
408430 & requirements_file,
409431 lock_options. pre ,
410432 env:: var ( "__RYE_UV_EXCLUDE_NEWER" ) . ok ( ) ,
411433 upgrade,
412434 ) ?;
413435 } else {
436+ if overrides_file_in. is_some ( ) {
437+ bail ! ( "dependency overrides are only supported by uv" ) ;
438+ }
414439 let mut cmd = Command :: new ( get_pip_compile ( py_ver, output) ?) ;
415440 // legacy pip tools requires some extra parameters
416441 if get_pip_tools_version ( py_ver) == PipToolsVersion :: Legacy {
0 commit comments