Skip to content

Commit 8a9708d

Browse files
committed
bugfix
1 parent 538e208 commit 8a9708d

File tree

4 files changed

+111
-30
lines changed

4 files changed

+111
-30
lines changed

bootstrap.sh

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22

33
cargo install just
44

5-
cargo install cargo-qtest
5+
cargo install cargo-watch
6+
cargo install cargo-qtest

crates/snm_shim/src/ensure_binary_path.rs

+15-21
Original file line numberDiff line numberDiff line change
@@ -17,33 +17,27 @@ where
1717
.exists()
1818
.not()
1919
{
20-
if atom.get_snm_config().get_strict() {
21-
return Err(SnmError::UnsupportedNodeVersionError {
22-
version: version.to_string(),
23-
});
24-
} else {
25-
let download_url = atom.get_download_url(version);
20+
let download_url = atom.get_download_url(version);
2621

27-
let downloaded_file_path_buf = atom.get_downloaded_file_path_buf(version)?;
22+
let downloaded_file_path_buf = atom.get_downloaded_file_path_buf(version)?;
2823

29-
DownloadBuilder::new()
30-
.retries(3)
31-
.timeout(atom.get_snm_config().get_download_timeout_secs())
32-
.write_strategy(WriteStrategy::WriteAfterDelete)
33-
.download(&download_url, &downloaded_file_path_buf)
34-
.await?;
24+
DownloadBuilder::new()
25+
.retries(3)
26+
.timeout(atom.get_snm_config().get_download_timeout_secs())
27+
.write_strategy(WriteStrategy::WriteAfterDelete)
28+
.download(&download_url, &downloaded_file_path_buf)
29+
.await?;
3530

36-
let runtime_dir_path_buf = atom.get_runtime_dir_path_buf(version)?;
31+
let runtime_dir_path_buf = atom.get_runtime_dir_path_buf(version)?;
3732

38-
if is_check {
39-
check(version, atom).await?;
40-
}
33+
if is_check {
34+
check(version, atom).await?;
35+
}
4136

42-
atom.decompress_download_file(&downloaded_file_path_buf, &runtime_dir_path_buf)?;
37+
atom.decompress_download_file(&downloaded_file_path_buf, &runtime_dir_path_buf)?;
4338

44-
if let Some(parent) = downloaded_file_path_buf.parent() {
45-
fs::remove_dir_all(parent)?;
46-
}
39+
if let Some(parent) = downloaded_file_path_buf.parent() {
40+
fs::remove_dir_all(parent)?;
4741
}
4842
}
4943

crates/snm_shim/src/get_node_bin_dir.rs

+59-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
use std::env::current_dir;
1+
use std::{env::current_dir, fs, ops::Not as _};
22

33
use snm_atom::{atom::AtomTrait as _, node_atom::NodeAtom};
44
use snm_config::parse_snm_config;
5+
use snm_download_builder::{DownloadBuilder, WriteStrategy};
56
use snm_utils::snm_error::SnmError;
67
use tracing::{instrument, Level};
78

@@ -14,7 +15,6 @@ pub async fn get_node_bin_dir() -> Result<String, SnmError> {
1415
let snm_config = parse_snm_config(&dir)?;
1516

1617
let snm_node = NodeAtom::new(snm_config.clone());
17-
1818
let version = if let Some(version) = snm_config.get_runtime_node_version() {
1919
version
2020
} else if snm_config.get_strict() {
@@ -24,6 +24,63 @@ pub async fn get_node_bin_dir() -> Result<String, SnmError> {
2424
version.ok_or(SnmError::NoDefaultNodeBinary)?
2525
};
2626

27+
if snm_node
28+
.get_anchor_file_path_buf(version.as_str())?
29+
.exists()
30+
.not()
31+
{
32+
if snm_node.get_snm_config().get_strict() {
33+
return Err(SnmError::UnsupportedNodeVersionError {
34+
version: version.to_string(),
35+
});
36+
} else {
37+
let download_url = snm_node.get_download_url(&version);
38+
39+
let downloaded_file_path_buf = snm_node.get_downloaded_file_path_buf(&version)?;
40+
41+
DownloadBuilder::new()
42+
.retries(3)
43+
.timeout(snm_node.get_snm_config().get_download_timeout_secs())
44+
.write_strategy(WriteStrategy::WriteAfterDelete)
45+
.download(&download_url, &downloaded_file_path_buf)
46+
.await?;
47+
48+
let runtime_dir_path_buf = snm_node.get_runtime_dir_path_buf(&version)?;
49+
50+
let downloaded_file_path_buf = snm_node.get_downloaded_file_path_buf(&version)?;
51+
52+
let expect = snm_node.get_expect_shasum(&version).await?;
53+
54+
let actual = snm_node
55+
.get_actual_shasum(&downloaded_file_path_buf)
56+
.await?;
57+
58+
if actual.is_none() || expect.is_none() {
59+
fs::remove_file(&downloaded_file_path_buf)?;
60+
return Err(SnmError::ShasumError {
61+
file_path: downloaded_file_path_buf.display().to_string(),
62+
expect: "None".to_string(),
63+
actual: "None".to_string(),
64+
});
65+
}
66+
67+
if actual.eq(&expect).not() {
68+
fs::remove_file(&downloaded_file_path_buf)?;
69+
return Err(SnmError::ShasumError {
70+
file_path: downloaded_file_path_buf.display().to_string(),
71+
expect: expect.unwrap_or("None".to_string()),
72+
actual: actual.unwrap_or("None".to_string()),
73+
});
74+
}
75+
76+
snm_node.decompress_download_file(&downloaded_file_path_buf, &runtime_dir_path_buf)?;
77+
78+
if let Some(parent) = downloaded_file_path_buf.parent() {
79+
fs::remove_dir_all(parent)?;
80+
}
81+
}
82+
}
83+
2784
let binary_dir_string = ensure_binary_path(&snm_node, &version, true).await?;
2885

2986
Ok(binary_dir_string)

crates/snm_shim/src/lib.rs

+35-6
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@ mod get_node_bin_dir;
55
use crate::get_default_bin_dir::get_default_bin_dir;
66
use crate::get_node_bin_dir::get_node_bin_dir;
77
use ensure_binary_path::ensure_binary_path;
8-
use snm_atom::package_manager_atom::PackageManagerAtom;
8+
use snm_atom::{atom::AtomTrait, package_manager_atom::PackageManagerAtom};
99
use snm_config::parse_snm_config;
10+
use snm_download_builder::{DownloadBuilder, WriteStrategy};
1011
use snm_utils::{exec::exec_cli, snm_error::SnmError};
11-
use std::env::{self, current_dir};
12+
use std::{
13+
env::{self, current_dir},
14+
fs,
15+
};
1216
use tracing_subscriber::{self};
1317

1418
pub async fn load_package_manage_shim(prefix: &str, bin_name: &str) -> Result<(), SnmError> {
@@ -38,10 +42,35 @@ pub async fn load_package_manage_shim(prefix: &str, bin_name: &str) -> Result<()
3842
);
3943
if package_manager.name == prefix {
4044
let version = package_manager.version;
41-
vec![
42-
node_dir.clone(),
43-
ensure_binary_path(&snm_package_manage, &version, false).await?,
44-
]
45+
46+
let download_url = snm_package_manage.get_download_url(&version);
47+
48+
let downloaded_file_path_buf =
49+
snm_package_manage.get_downloaded_file_path_buf(&version)?;
50+
51+
DownloadBuilder::new()
52+
.retries(3)
53+
.timeout(
54+
snm_package_manage
55+
.get_snm_config()
56+
.get_download_timeout_secs(),
57+
)
58+
.write_strategy(WriteStrategy::WriteAfterDelete)
59+
.download(&download_url, &downloaded_file_path_buf)
60+
.await?;
61+
62+
let runtime_dir_path_buf = snm_package_manage.get_runtime_dir_path_buf(&version)?;
63+
64+
snm_package_manage
65+
.decompress_download_file(&downloaded_file_path_buf, &runtime_dir_path_buf)?;
66+
67+
if let Some(parent) = downloaded_file_path_buf.parent() {
68+
fs::remove_dir_all(parent)?;
69+
}
70+
71+
let binary = snm_package_manage.get_runtime_binary_dir_string(version.as_str())?;
72+
73+
vec![node_dir.clone(), binary]
4574
} else if restricted_list.contains(&command.as_str()) {
4675
return Err(SnmError::NotMatchPackageManagerError {
4776
raw_command: args_all.join(" ").to_string(),

0 commit comments

Comments
 (0)