1- use  std:: collections:: BTreeMap ; 
1+ use  std:: { collections:: BTreeMap ,  fmt :: Display ,  path :: PathBuf } ; 
22
33use  base64:: prelude:: * ; 
44use  serde:: { Deserialize ,  Serialize } ; 
55use  url:: Url ; 
66
77use  crate :: { 
8-     manifest:: { ExternalSpec ,  Manifest ,   PackageType } , 
8+     manifest:: { ExternalSpec ,  PackageManifest } , 
99    registry, 
1010} ; 
1111
@@ -26,9 +26,14 @@ impl Default for Lockfile {
2626} 
2727
2828impl  Lockfile  { 
29-     pub  fn  insert ( & mut  self ,  dependency :  Dependency )  { 
30-         let  Self :: V1  {  dependencies }  = self ; 
31-         dependencies. insert ( dependency. name . clone ( ) ,  dependency) ; 
29+     pub  fn  add_dependency ( & mut  self ,  dependency :  Dependency )  { 
30+         let  Self :: V1  {  dependencies,  .. }  = self ; 
31+         if  let  Some ( old)  = dependencies. insert ( dependency. name . clone ( ) ,  dependency)  { 
32+             let  new = & dependencies[ & old. name ] ; 
33+             if  old. manifest  != new. manifest  { 
34+                 log:: warn!( r#"Found duplicate dependency "{old}", using "{new}"# ) 
35+             } 
36+         } 
3237    } 
3338} 
3439
@@ -64,28 +69,38 @@ impl NixSystem {
6469#[ derive( Serialize ,  Deserialize ,  Clone ,  Debug ) ]  
6570pub  struct  Dependency  { 
6671    pub  name :  String , 
67-     pub  install_path :  String , 
72+     pub  install_path :  PathBuf , 
6873    pub  version :  String , 
6974    pub  manifest :  String , 
7075    pub  systems :  BTreeMap < NixSystem ,  FetchUrl > , 
7176} 
7277
7378impl  Dependency  { 
74-     pub  fn  from_url ( manifest :  & Manifest ,  package_spec :  & ExternalSpec ,  sha256 :  & [ u8 ] )  -> Self  { 
79+     pub  fn  from_url ( 
80+         manifest :  & PackageManifest , 
81+         install_path :  PathBuf , 
82+         package_spec :  & ExternalSpec , 
83+         sha256 :  & [ u8 ] , 
84+     )  -> Self  { 
7585        let  systems = NixSystem :: ALL 
7686            . iter ( ) 
7787            . map ( |nix_system| ( * nix_system,  FetchUrl :: new ( package_spec. uri . clone ( ) ,  sha256) ) ) 
7888            . collect ( ) ; 
7989        Self :: new ( 
8090            manifest, 
91+             install_path, 
8192            package_spec. name . clone ( ) , 
8293            manifest. version . clone ( ) , 
8394            systems, 
8495        ) 
8596    } 
8697
87-     pub  fn  from_registry ( manifest :  & Manifest ,  package_spec :  & registry:: PackageSpec )  -> Self  { 
88-         let  version = & package_spec. version ; 
98+     pub  fn  from_registry ( 
99+         manifest :  & PackageManifest , 
100+         install_path :  PathBuf , 
101+         package_spec :  registry:: PackageSpec , 
102+     )  -> Self  { 
103+         let  version = package_spec. version ; 
89104        let  systems = NixSystem :: ALL 
90105            . iter ( ) 
91106            . filter_map ( |nix_system| { 
@@ -95,37 +110,36 @@ impl Dependency {
95110            . collect ( ) ; 
96111        Self :: new ( 
97112            manifest, 
98-             package_spec. name . clone ( ) , 
113+             install_path, 
114+             package_spec. name , 
99115            version. name . clone ( ) , 
100116            systems, 
101117        ) 
102118    } 
103119
104120    fn  new ( 
105-         manifest :  & Manifest , 
121+         manifest :  & PackageManifest , 
122+         install_path :  PathBuf , 
106123        name :  String , 
107124        version :  String , 
108125        systems :  BTreeMap < NixSystem ,  FetchUrl > , 
109126    )  -> Self  { 
110-         let  install_path = format ! ( 
111-             "{}/{}" , 
112-             match  manifest. ty { 
113-                 PackageType :: Platform  => "platforms" , 
114-                 PackageType :: Package  | PackageType :: Tool  => "packages" , 
115-                 PackageType :: Library  => "libdeps" , 
116-             } , 
117-             name
118-         ) ; 
119127        Self  { 
120128            name, 
121129            install_path, 
122-             manifest :  serde_json:: to_string ( & manifest) . expect ( "serializable manifest" ) , 
130+             manifest :  serde_json:: to_string ( manifest) . expect ( "serializable manifest" ) , 
123131            version, 
124132            systems, 
125133        } 
126134    } 
127135} 
128136
137+ impl  Display  for  Dependency  { 
138+     fn  fmt ( & self ,  f :  & mut  std:: fmt:: Formatter < ' _ > )  -> std:: fmt:: Result  { 
139+         write ! ( f,  "{}@{}" ,  self . name,  self . version) 
140+     } 
141+ } 
142+ 
129143#[ derive( Serialize ,  Deserialize ,  Clone ,  Debug ) ]  
130144pub  struct  FetchUrl  { 
131145    pub  url :  Url , 
0 commit comments