@@ -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,21 @@ pub fn update_workspace_lockfile(
194197 Ok ( ( ) )
195198}
196199
200+ fn maybe_write_requirements_to_temp (
201+ requirements : & HashSet < Requirement > ,
202+ ) -> Result < Option < NamedTempFile > , Error > {
203+ if requirements. is_empty ( ) {
204+ Ok ( None )
205+ } else {
206+ let mut nt_file = NamedTempFile :: new ( ) ?;
207+ for dep in requirements {
208+ writeln ! ( & nt_file, "{}" , dep) ?;
209+ }
210+ nt_file. flush ( ) ?;
211+ Ok ( Some ( nt_file) )
212+ }
213+ }
214+
197215/// Tries to restore the lock options from the given lockfile.
198216fn restore_lock_options < ' o > (
199217 lockfile : & Path ,
@@ -263,10 +281,13 @@ fn collect_workspace_features(
263281 Some ( features_by_project)
264282}
265283
266- fn find_exclusions ( projects : & [ PyProject ] ) -> Result < HashSet < Requirement > , Error > {
284+ fn find_requirements (
285+ projects : & [ PyProject ] ,
286+ kind : & DependencyKind ,
287+ ) -> Result < HashSet < Requirement > , Error > {
267288 let mut rv = HashSet :: new ( ) ;
268289 for project in projects {
269- for dep in project. iter_dependencies ( DependencyKind :: Excluded ) {
290+ for dep in project. iter_dependencies ( kind ) {
270291 rv. insert ( dep. expand ( |name : & str | {
271292 if name == "PROJECT_ROOT" {
272293 Some ( project. workspace_path ( ) . to_string_lossy ( ) . to_string ( ) )
@@ -285,7 +306,7 @@ fn dump_dependencies(
285306 out : & mut fs:: File ,
286307 dep_kind : DependencyKind ,
287308) -> Result < ( ) , Error > {
288- for dep in pyproject. iter_dependencies ( dep_kind) {
309+ for dep in pyproject. iter_dependencies ( & dep_kind) {
289310 if let Ok ( expanded_dep) = dep. expand ( |_| {
290311 // we actually do not care what it expands to much, for as long
291312 // as the end result parses
@@ -334,23 +355,26 @@ pub fn update_single_project_lockfile(
334355 ) ?;
335356 }
336357
337- for dep in pyproject. iter_dependencies ( DependencyKind :: Normal ) {
358+ for dep in pyproject. iter_dependencies ( & DependencyKind :: Normal ) {
338359 writeln ! ( req_file, "{}" , dep) ?;
339360 }
340361 if lock_mode == LockMode :: Dev {
341- for dep in pyproject. iter_dependencies ( DependencyKind :: Dev ) {
362+ for dep in pyproject. iter_dependencies ( & DependencyKind :: Dev ) {
342363 writeln ! ( req_file, "{}" , dep) ?;
343364 }
344365 }
345366
346367 req_file. flush ( ) ?;
347368
348- let exclusions = find_exclusions ( std:: slice:: from_ref ( pyproject) ) ?;
369+ let exclusions = find_requirements ( std:: slice:: from_ref ( pyproject) , & DependencyKind :: Excluded ) ?;
370+ let overrides = find_requirements ( std:: slice:: from_ref ( pyproject) , & DependencyKind :: Override ) ?;
371+ let overrides_file = maybe_write_requirements_to_temp ( & overrides) ?;
349372 generate_lockfile (
350373 output,
351374 py_ver,
352375 & pyproject. workspace_path ( ) ,
353376 req_file. path ( ) ,
377+ overrides_file. as_ref ( ) . map ( |v| v. path ( ) ) ,
354378 lockfile,
355379 sources,
356380 & lock_options,
@@ -367,6 +391,7 @@ fn generate_lockfile(
367391 py_ver : & PythonVersion ,
368392 workspace_path : & Path ,
369393 requirements_file_in : & Path ,
394+ overrides_file_in : Option < & Path > ,
370395 lockfile : & Path ,
371396 sources : & ExpandedSources ,
372397 lock_options : & LockOptions ,
@@ -405,12 +430,16 @@ fn generate_lockfile(
405430 . lockfile (
406431 py_ver,
407432 requirements_file_in,
433+ overrides_file_in,
408434 & requirements_file,
409435 lock_options. pre ,
410436 env:: var ( "__RYE_UV_EXCLUDE_NEWER" ) . ok ( ) ,
411437 upgrade,
412438 ) ?;
413439 } else {
440+ if overrides_file_in. is_some ( ) {
441+ bail ! ( "dependency overrides are only supported by uv" ) ;
442+ }
414443 let mut cmd = Command :: new ( get_pip_compile ( py_ver, output) ?) ;
415444 // legacy pip tools requires some extra parameters
416445 if get_pip_tools_version ( py_ver) == PipToolsVersion :: Legacy {
0 commit comments