|
1 | | -use std::{collections::BTreeMap, fmt::Display, path::PathBuf}; |
| 1 | +use std::{collections::BTreeMap, fmt::Display}; |
2 | 2 |
|
3 | 3 | use base64::prelude::*; |
4 | 4 | use serde::{Deserialize, Serialize}; |
5 | 5 | use url::Url; |
6 | 6 |
|
7 | 7 | use crate::{ |
8 | 8 | manifest::{ExternalSpec, PackageManifest}, |
9 | | - registry, |
| 9 | + registry::{self, SystemSpec}, |
10 | 10 | }; |
11 | 11 |
|
12 | 12 | #[derive(Serialize, Deserialize, Clone, Debug)] |
13 | 13 | #[serde(tag = "version")] |
14 | 14 | pub enum Lockfile { |
15 | | - V1 { |
| 15 | + #[serde(rename = "2")] |
| 16 | + V2 { |
16 | 17 | dependencies: BTreeMap<String, Dependency>, |
17 | 18 | }, |
18 | 19 | } |
19 | 20 |
|
20 | 21 | impl Default for Lockfile { |
21 | 22 | fn default() -> Self { |
22 | | - Self::V1 { |
| 23 | + Self::V2 { |
23 | 24 | dependencies: BTreeMap::default(), |
24 | 25 | } |
25 | 26 | } |
26 | 27 | } |
27 | 28 |
|
28 | 29 | impl Lockfile { |
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]; |
| 30 | + pub fn add_dependency(&mut self, install_path: String, dependency: Dependency) { |
| 31 | + let Self::V2 { dependencies, .. } = self; |
| 32 | + if let Some(old) = dependencies.insert(install_path.clone(), dependency) { |
| 33 | + let new = &dependencies[&install_path]; |
33 | 34 | if old.manifest != new.manifest { |
34 | 35 | log::warn!(r#"Found duplicate dependency "{old}", using "{new}"#) |
35 | 36 | } |
36 | | - } |
| 37 | + }; |
37 | 38 | } |
38 | 39 | } |
39 | 40 |
|
@@ -69,74 +70,58 @@ impl NixSystem { |
69 | 70 | #[derive(Serialize, Deserialize, Clone, Debug)] |
70 | 71 | pub struct Dependency { |
71 | 72 | pub name: String, |
72 | | - pub install_path: PathBuf, |
73 | | - pub version: String, |
74 | | - pub manifest: String, |
75 | | - pub systems: BTreeMap<NixSystem, FetchUrl>, |
| 73 | + pub manifest: PackageManifest, |
| 74 | + pub src: Src, |
| 75 | +} |
| 76 | + |
| 77 | +#[derive(Serialize, Deserialize, Clone, Debug)] |
| 78 | +#[serde(rename_all = "camelCase")] |
| 79 | +pub enum Src { |
| 80 | + Universal(FetchUrl), |
| 81 | + Systems(BTreeMap<NixSystem, FetchUrl>), |
76 | 82 | } |
77 | 83 |
|
78 | 84 | impl Dependency { |
79 | | - pub fn from_url( |
80 | | - manifest: &PackageManifest, |
81 | | - install_path: PathBuf, |
82 | | - package_spec: &ExternalSpec, |
83 | | - sha256: &[u8], |
84 | | - ) -> Self { |
85 | | - let systems = NixSystem::ALL |
86 | | - .iter() |
87 | | - .map(|nix_system| (*nix_system, FetchUrl::new(package_spec.uri.clone(), sha256))) |
88 | | - .collect(); |
89 | | - Self::new( |
90 | | - manifest, |
91 | | - install_path, |
92 | | - package_spec.name.clone(), |
93 | | - manifest.version.clone(), |
94 | | - systems, |
95 | | - ) |
| 85 | + pub fn from_url(manifest: PackageManifest, package_spec: &ExternalSpec, sha256: &[u8]) -> Self { |
| 86 | + let src = Src::Universal(FetchUrl::new(package_spec.uri.clone(), sha256)); |
| 87 | + Self::new(manifest, package_spec.name.clone(), src) |
96 | 88 | } |
97 | 89 |
|
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; |
104 | | - let systems = NixSystem::ALL |
| 90 | + pub fn from_registry(manifest: PackageManifest, package_spec: registry::PackageSpec) -> Self { |
| 91 | + let src = if let Some(universal) = package_spec |
| 92 | + .version |
| 93 | + .files |
105 | 94 | .iter() |
106 | | - .filter_map(|nix_system| { |
107 | | - let file = version.supports(&nix_system.to_registry()); |
108 | | - file.map(|file| (*nix_system, FetchUrl::from(file))) |
109 | | - }) |
110 | | - .collect(); |
111 | | - Self::new( |
112 | | - manifest, |
113 | | - install_path, |
114 | | - package_spec.name, |
115 | | - version.name.clone(), |
116 | | - systems, |
117 | | - ) |
| 95 | + .find(|f| f.system == SystemSpec::Wildcard) |
| 96 | + { |
| 97 | + Src::Universal(FetchUrl::from(universal)) |
| 98 | + } else { |
| 99 | + Src::Systems( |
| 100 | + NixSystem::ALL |
| 101 | + .iter() |
| 102 | + .filter_map(|nix_system| { |
| 103 | + let file = package_spec.version.supports(&nix_system.to_registry()); |
| 104 | + file.map(|file| (*nix_system, FetchUrl::from(file))) |
| 105 | + }) |
| 106 | + .collect(), |
| 107 | + ) |
| 108 | + }; |
| 109 | + |
| 110 | + Self::new(manifest, package_spec.name, src) |
118 | 111 | } |
119 | 112 |
|
120 | | - fn new( |
121 | | - manifest: &PackageManifest, |
122 | | - install_path: PathBuf, |
123 | | - name: String, |
124 | | - version: String, |
125 | | - systems: BTreeMap<NixSystem, FetchUrl>, |
126 | | - ) -> Self { |
| 113 | + fn new(manifest: PackageManifest, name: String, src: Src) -> Self { |
127 | 114 | Self { |
128 | 115 | name, |
129 | | - install_path, |
130 | | - manifest: serde_json::to_string(manifest).expect("serializable manifest"), |
131 | | - version, |
132 | | - systems, |
| 116 | + manifest, |
| 117 | + src, |
133 | 118 | } |
134 | 119 | } |
135 | 120 | } |
136 | 121 |
|
137 | 122 | impl Display for Dependency { |
138 | 123 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
139 | | - write!(f, "{}@{}", self.name, self.version) |
| 124 | + write!(f, "{}@{}", self.name, self.manifest.version) |
140 | 125 | } |
141 | 126 | } |
142 | 127 |
|
|
0 commit comments