Skip to content

Commit 717a6e0

Browse files
committed
Added binary resolver.
1 parent 193e01e commit 717a6e0

18 files changed

+450
-107
lines changed

Cargo.lock

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ async-trait = "0.1.75"
1616
async-recursion = "1.0.5"
1717
homedir = "0.3.3"
1818
serde_yaml_ng = "0.10.0"
19+
path-clean = "1.0.1"
1920

2021
serde = { version = "1.0.193", features = ["derive"] }
2122
serde_json = "1.0.108"

package.json

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
{
22
"type": "module",
33
"dependencies": {
4-
"is-even": "^1.0.0"
5-
},
6-
"devDependencies": {
7-
"eslint": "^7.2.0"
4+
"typescript": "^5.6.2"
85
},
96
"scripts": {
107
"start": "node"

src/actors/PeerResolver.rs

+108
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
use std::sync::mpsc::Sender;
2+
use async_trait::async_trait;
3+
use crate::cache::RegistryKey;
4+
use crate::contracts::{Pipe, PipeArtifact};
5+
use crate::errors::ExecutionError;
6+
use crate::package::{BinType, PackageMetaRecorder, PackageRecorder, ResolvedBinary};
7+
8+
pub struct PeerResolver {
9+
recorder: PackageRecorder
10+
}
11+
12+
impl PeerResolver {
13+
pub fn new(recorder: PackageRecorder) -> Self {
14+
PeerResolver {
15+
recorder
16+
}
17+
}
18+
19+
fn handle_insert( req: &mut PackageMetaRecorder, outer_dep: (&RegistryKey, &PackageMetaRecorder)) {
20+
match &mut req.resolved_dependencies {
21+
Some(deps) => {
22+
deps.insert(outer_dep.0.name.clone(), outer_dep.0
23+
.version.clone());
24+
}
25+
None => {
26+
let mut deps = std::collections::HashMap::new();
27+
deps.insert(outer_dep.0.name.clone(), outer_dep.0.version.clone());
28+
req.resolved_dependencies = Some(deps)
29+
}
30+
}
31+
if let Some(bin) = &outer_dep.1.bin {
32+
match &mut req.resolved_binaries {
33+
Some(b) => {
34+
match bin {
35+
BinType::Bin(s) => {
36+
let splitted_name = s.rsplitn(2, '/').next().unwrap().replace(".js", "");
37+
b.push(ResolvedBinary{
38+
name: splitted_name,
39+
path: format!("{}/{}", outer_dep.1.name, s),
40+
package_name: outer_dep.1.name.clone()
41+
});
42+
}
43+
BinType::BinMappings(a) => {
44+
a.iter().for_each(|s| {
45+
b.push(ResolvedBinary{
46+
name: s.0.to_string(),
47+
path: format!("{}/{}", outer_dep.1.name, s.1),
48+
package_name: outer_dep.1.name.clone()
49+
});
50+
});
51+
}
52+
}
53+
}
54+
None => {
55+
match bin {
56+
BinType::Bin(s) => {
57+
let splitted_name = s.rsplitn(2, '/').next().unwrap().replace("\
58+
.js", "");
59+
let vec = vec![ResolvedBinary{
60+
name: splitted_name,
61+
path: format!("{}/{}", outer_dep.1.name, s),
62+
package_name: outer_dep.1.name.clone()
63+
}];
64+
req.resolved_binaries = Some(vec);
65+
}
66+
BinType::BinMappings(a) => {
67+
let mut bin_vec = vec![];
68+
a.iter().for_each(|s| {
69+
bin_vec.push(ResolvedBinary{
70+
name: s.0.to_string(),
71+
path: format!("{}/{}", outer_dep.1.name, s.1),
72+
package_name: outer_dep.1.name.clone()
73+
});
74+
});
75+
req.resolved_binaries = Some(bin_vec);
76+
}
77+
}
78+
}
79+
}
80+
}
81+
}
82+
}
83+
84+
#[async_trait]
85+
impl Pipe<PackageRecorder> for PeerResolver {
86+
async fn run(&mut self) -> Result<PackageRecorder, ExecutionError> {
87+
self.recorder.sub_dependencies.clone().iter().for_each(|outer_dep|{
88+
if let Some(mut deps) = outer_dep.1.depth_traces.clone() {
89+
// Iterate over the traces
90+
deps.iter_mut().for_each(|mut d|{
91+
d.reverse();
92+
for (i, parent_of_outer_dep) in d.iter().enumerate() {
93+
// This is a direct parent
94+
if i == 0 {
95+
if let Some(reg) = self.recorder.sub_dependencies.get_mut(parent_of_outer_dep) {
96+
PeerResolver::handle_insert(reg, outer_dep);
97+
} else if let Some(req) = self.recorder.main_packages.get_mut
98+
(parent_of_outer_dep) {
99+
PeerResolver::handle_insert(req, outer_dep);
100+
}
101+
}
102+
}
103+
})
104+
}
105+
});
106+
Ok(self.recorder.clone())
107+
}
108+
}

src/actors/install.rs

+14-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::{
1515
pipeline::{DownloaderPipe, ExtractorPipe, LinkerPipe, ResolverPipe},
1616
ui::UIProgress,
1717
};
18-
use crate::pipeline::BinaryLinkerPipeline;
18+
use crate::actors::PeerResolver::PeerResolver;
1919

2020
#[derive(Debug, Clone)]
2121
pub enum PackageType {
@@ -106,6 +106,14 @@ impl Actor<PipeResult> for InstallActor {
106106
resolve_artifacts.0.get_artifacts().len()
107107
));
108108

109+
110+
// ─── Start Mutating ───────────────────────
111+
let recorder = PeerResolver::new(resolve_artifacts.1)
112+
.run()
113+
.await?;
114+
115+
116+
109117
// ─── Start Downloading ──────────────────────
110118

111119
CraftLogger::verbose("Downloading dependencies");
@@ -118,6 +126,8 @@ impl Actor<PipeResult> for InstallActor {
118126
download_artifacts.get_artifacts().len()
119127
));
120128

129+
130+
121131
// ─── Start Extracting ───────────────────────
122132

123133
CraftLogger::verbose("Extracting dependencies");
@@ -137,12 +147,14 @@ impl Actor<PipeResult> for InstallActor {
137147
tx.clone(),
138148
resolve_artifacts.0.get_artifacts(),
139149
extracted_artifacts.get_artifacts(),
150+
recorder.clone()
140151
)
141152
.run()
142153
.await?;
143154

155+
144156
// ─── Sync Lock File ────────────────────────
145-
LockFileActor::new(resolve_artifacts.0.get_artifacts(), resolve_artifacts.1.clone())
157+
LockFileActor::new(resolve_artifacts.0.get_artifacts(), recorder)
146158
.run()
147159
.expect("Error writing lockfile");
148160

@@ -152,7 +164,6 @@ impl Actor<PipeResult> for InstallActor {
152164

153165

154166
// ─── Link binaries ────────────────────────────────
155-
let bin_linker = BinaryLinkerPipeline::new(resolve_artifacts.1.main_packages);
156167

157168

158169
drop(tx);

src/actors/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ mod cache_clean;
22
mod install;
33
mod preprocesse_dependency_install;
44
mod run;
5+
mod PeerResolver;
56

67
pub use cache_clean::CacheCleanActor;
78
pub use install::InstallActor;

src/cache/registry.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ use async_trait::async_trait;
55
use nodejs_semver::{Range, Version};
66
use std::fmt::Display;
77
use std::{collections::HashMap, fs::File, io, path::PathBuf};
8+
use serde::{Deserialize, Serialize};
89

910
//
10-
#[derive(Eq, Debug, Hash, PartialEq, Clone)]
11+
#[derive(Eq, Debug, Hash, PartialEq, Clone, Serialize, Deserialize)]
1112
pub struct RegistryKey {
1213
pub name: String,
1314
pub version: String,

src/lockfile/lock_file_actor.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -177,13 +177,13 @@ impl LockFileActor {
177177
let mut hashmap: HashMap<String, PackageMetaHandler> = HashMap::new();
178178

179179
self.recorder.main_packages.iter().for_each(|p| {
180-
let pm_handler: PackageMetaHandler = p.clone().into();
181-
hashmap.insert(p.to_string(), pm_handler);
180+
let pm_handler: PackageMetaHandler = p.1.clone().into();
181+
hashmap.insert(p.0.to_string(), pm_handler);
182182
});
183183

184184
self.recorder.sub_dependencies.iter().for_each(|p| {
185-
let pm_handler: PackageMetaHandler = p.clone().into();
186-
hashmap.insert(p.to_string(), pm_handler);
185+
let pm_handler: PackageMetaHandler = p.1.clone().into();
186+
hashmap.insert(p.0.to_string(), pm_handler);
187187
});
188188

189189
lockfile_structure.packages = Some(hashmap)

src/package/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ pub use package_recorder::PackageMetaHandler;
1414
pub use package_recorder::PackageRecorder;
1515
pub use pkg::Package;
1616
pub use npm_package::BinType;
17-
pub use package_recorder::PackageMetaRecorder;
17+
pub use package_recorder::PackageMetaRecorder;
18+
pub use package_recorder::ResolvedBinary;

src/package/npm_package.rs

+3
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ pub struct NpmPackage {
6969
#[serde(skip_serializing_if = "Option::is_none")]
7070
pub workspaces: Option<Vec<String>>,
7171
pub dist: Distribution,
72+
#[serde(skip_serializing)]
73+
pub depth_traces: Option<Vec<Vec<RegistryKey>>>
7274
}
7375

7476
#[derive(Deserialize, Serialize, Debug, Clone)]
@@ -109,6 +111,7 @@ impl From<NpmPackage> for PackageMetaRecorder {
109111
engines: val.engines,
110112
os: val.os,
111113
bin: val.bin.clone(),
114+
depth_traces: val.depth_traces,
112115
..Default::default()
113116
};
114117

src/package/package_recorder.rs

+38-7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ use crate::package::npm_package::{EnginesType, PeerDependencyMeta};
22
use serde::{Deserialize, Serialize};
33
use std::collections::HashMap;
44
use std::fmt::{Display, Formatter};
5+
use std::path::PathBuf;
6+
use crate::cache::{RegistryKey, DEP_CACHE_FOLDER};
7+
use crate::fs::get_config_dir;
58
use crate::package::BinType;
69

710
#[derive(Clone, Default, Debug)]
@@ -17,9 +20,29 @@ pub struct PackageMetaRecorder {
1720
pub os: Option<Vec<String>>,
1821
pub dependencies: Option<HashMap<String, String>>,
1922
pub resolved_dependencies: Option<HashMap<String, String>>,
20-
pub bin: Option<BinType>
23+
pub bin: Option<BinType>,
24+
pub depth_traces: Option<Vec<Vec<RegistryKey>>>,
25+
pub resolved_binaries: Option<Vec<ResolvedBinary>>,
26+
// This involves transitive dependencies
27+
pub resolved_peer_dependencies: Option<HashMap<String, String>>,
2128
}
2229

30+
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
31+
pub struct ResolvedBinary {
32+
pub name: String,
33+
pub path: String,
34+
pub package_name: String,
35+
}
36+
37+
impl PackageMetaRecorder {
38+
pub fn resolve_path_to_package(&self) -> PathBuf {
39+
get_config_dir(DEP_CACHE_FOLDER.clone())
40+
.join(format!("{}-{}", self.name, self.version))
41+
.join("package")
42+
}
43+
}
44+
45+
2346
impl Display for PackageMetaRecorder {
2447
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
2548
write!(f, "{}@{}", self.name, self.version)
@@ -38,7 +61,10 @@ impl From<PackageMetaRecorder> for PackageMetaHandler {
3861
peer_dependencies_meta: val.peer_dependencies_meta,
3962
dependencies: val.dependencies,
4063
resolved_dependencies: val.resolved_dependencies,
41-
bin: val.bin
64+
bin: val.bin,
65+
depth_traces: val.depth_traces,
66+
resolved_binaries: val.resolved_binaries,
67+
resolved_peer_dependencies: val.resolved_peer_dependencies
4268
}
4369
}
4470
}
@@ -62,11 +88,16 @@ pub struct PackageMetaHandler {
6288
pub os: Option<Vec<String>>,
6389
#[serde(skip_serializing_if = "Option::is_none")]
6490
pub dependencies: Option<HashMap<String, String>>,
65-
#[serde(skip_serializing_if = "Option::is_none")]
91+
#[serde(skip_serializing)]
6692
pub resolved_dependencies: Option<HashMap<String, String>>,
93+
#[serde(skip_serializing)]
94+
pub resolved_peer_dependencies: Option<HashMap<String, String>>,
6795
#[serde(skip_serializing_if = "Option::is_none")]
68-
pub bin: Option<BinType>
69-
96+
pub bin: Option<BinType>,
97+
#[serde(skip_serializing)]
98+
pub resolved_binaries: Option<Vec<ResolvedBinary>>,
99+
#[serde(skip_serializing)]
100+
pub depth_traces: Option<Vec<Vec<RegistryKey>>>
70101
}
71102

72103
#[derive(Clone, Default, Debug, Deserialize, Serialize)]
@@ -76,6 +107,6 @@ pub struct PackageResolution {
76107

77108
#[derive(Clone, Default, Debug)]
78109
pub struct PackageRecorder {
79-
pub main_packages: Vec<PackageMetaRecorder>,
80-
pub sub_dependencies: Vec<PackageMetaRecorder>,
110+
pub main_packages: HashMap<RegistryKey,PackageMetaRecorder>,
111+
pub sub_dependencies: HashMap<RegistryKey,PackageMetaRecorder>,
81112
}

src/pipeline/artifacts/extract_artifacts.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,11 @@ impl ExtractArtifacts {
5151
}
5252

5353
pub fn add(&mut self, package: NpmPackage, unzip_at: PathBuf) {
54-
let name = format!("{}@{}", package.name.clone(), package.version.clone());
5554
let item = ExtractArtifactItem::new(package.clone(), unzip_at);
5655

57-
self.tmp_cache.insert(name, item);
56+
self.tmp_cache.insert(package.to_string(), item);
5857
}
5958

60-
#[cfg(test)]
6159
pub fn get(&self, package_name: &str) -> Option<&ExtractArtifactItem> {
6260
self.tmp_cache.get(package_name)
6361
}

0 commit comments

Comments
 (0)