@@ -5,6 +5,7 @@ use std::fmt::Formatter;
5
5
use std:: path:: { Component , Path , PathBuf } ;
6
6
7
7
use either:: Either ;
8
+ use owo_colors:: OwoColorize ;
8
9
use petgraph:: graph:: NodeIndex ;
9
10
use petgraph:: prelude:: EdgeRef ;
10
11
use petgraph:: visit:: IntoNodeReferences ;
@@ -312,6 +313,18 @@ impl<'lock> RequirementsTxtExport<'lock> {
312
313
. map ( |( index, package) | Requirement {
313
314
package,
314
315
marker : reachability. remove ( & index) . unwrap_or_default ( ) ,
316
+ parents : graph. edges_directed ( index, Direction :: Incoming )
317
+ . filter_map ( |edge| {
318
+ let src = edge. source ( ) ;
319
+ if src == root {
320
+ None
321
+ } else if let Some ( Node :: Package ( parent) ) = graph. node_weight ( src) {
322
+ Some ( * parent)
323
+ } else {
324
+ None
325
+ }
326
+ } )
327
+ . collect ( ) ,
315
328
} )
316
329
. filter ( |requirement| !requirement. marker . is_false ( ) )
317
330
. collect :: < Vec < _ > > ( ) ;
@@ -496,7 +509,7 @@ fn conflict_marker_reachability<'lock>(
496
509
impl std:: fmt:: Display for RequirementsTxtExport < ' _ > {
497
510
fn fmt ( & self , f : & mut Formatter < ' _ > ) -> std:: fmt:: Result {
498
511
// Write out each package.
499
- for Requirement { package, marker } in & self . nodes {
512
+ for Requirement { package, marker , parents } in & self . nodes {
500
513
match & package. id . source {
501
514
Source :: Registry ( _) => {
502
515
let version = package
@@ -587,6 +600,9 @@ impl std::fmt::Display for RequirementsTxtExport<'_> {
587
600
}
588
601
589
602
writeln ! ( f) ?;
603
+ for parent in parents {
604
+ writeln ! ( f, "{}" , format!( "# via {}" , parent. id. name) . green( ) ) ?;
605
+ }
590
606
}
591
607
592
608
Ok ( ( ) )
@@ -638,6 +654,7 @@ impl Reachable<MarkerTree> for Edge<'_> {
638
654
struct Requirement < ' lock > {
639
655
package : & ' lock Package ,
640
656
marker : MarkerTree ,
657
+ parents : Vec < & ' lock Package > ,
641
658
}
642
659
643
660
#[ derive( Debug , Clone , PartialEq , Eq , PartialOrd , Ord ) ]
0 commit comments