flowey_lib_common/
download_cargo_nextest.rs1use crate::cache::CacheHit;
7use flowey::node::prelude::*;
8
9flowey_request! {
10 pub enum Request {
11 Version(String),
13 Get(ReadVar<target_lexicon::Triple>, WriteVar<PathBuf>),
18 }
19}
20
21new_flow_node!(struct Node);
22
23impl FlowNode for Node {
24 type Request = Request;
25
26 fn imports(ctx: &mut ImportCtx<'_>) {
27 ctx.import::<crate::cache::Node>();
28 }
29
30 fn emit(requests: Vec<Self::Request>, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
31 let mut version = None;
32 let mut reqs = Vec::new();
33
34 for req in requests {
35 match req {
36 Request::Version(v) => same_across_all_reqs("Version", &mut version, v)?,
37 Request::Get(target, path) => reqs.push((target, path)),
38 }
39 }
40
41 let version = version.ok_or(anyhow::anyhow!("Missing essential request: Version"))?;
42 let reqs = reqs;
43
44 if reqs.is_empty() {
47 return Ok(());
48 }
49
50 let cache_dir = ctx.emit_rust_stepv("create cargo-nextest cache dir", |_| {
51 |_| Ok(std::env::current_dir()?.absolute()?)
52 });
53
54 for (target, path) in reqs {
55 let (cache_key, cache_dir) = {
56 let version = version.clone();
57 let cache_key = target.map(ctx, move |target| {
58 format!("cargo-nextest-{version}-{target}")
59 });
60 let cache_dir = cache_dir
61 .zip(ctx, cache_key.clone())
62 .map(ctx, |(p, k)| p.join(k));
63 (cache_key, cache_dir)
64 };
65
66 let hitvar = ctx.reqv(|v| {
67 crate::cache::Request {
68 label: "cargo-nextest".into(),
69 dir: cache_dir.clone(),
70 key: cache_key,
71 restore_keys: None, hitvar: v,
73 }
74 });
75
76 let version = version.clone();
77 ctx.emit_rust_step("downloading cargo-nextest", |ctx| {
78 let path = path.claim(ctx);
79 let cache_dir = cache_dir.claim(ctx);
80 let hitvar = hitvar.claim(ctx);
81 let target = target.claim(ctx);
82
83 move |rt| {
84 let cache_dir = rt.read(cache_dir);
85 let target = rt.read(target);
86
87 let cargo_nextest_bin = match target.operating_system {
88 target_lexicon::OperatingSystem::Windows => "cargo-nextest.exe",
89 _ => "cargo-nextest",
90 };
91 let cached_bin_path = cache_dir.join(cargo_nextest_bin);
92 let target = target.to_string();
93
94 if !matches!(rt.read(hitvar), CacheHit::Hit) {
95 let nextest_archive = "nextest.tar.gz";
96 flowey::shell_cmd!(rt, "curl --fail -L https://get.nexte.st/{version}/{target}.tar.gz -o {nextest_archive}").run()?;
97 flowey::shell_cmd!(rt, "tar -xf {nextest_archive}").run()?;
98
99 fs_err::create_dir_all(&cache_dir)?;
101 fs_err::rename(cargo_nextest_bin, &cached_bin_path)?;
102 }
103
104 let cached_bin_path = cached_bin_path.absolute()?;
105 log::info!("downloaded to {}", cached_bin_path.to_string_lossy());
106 assert!(cached_bin_path.exists());
107 rt.write(path, &cached_bin_path);
108
109 Ok(())
110 }
111 });
112 }
113
114 Ok(())
115 }
116}