1use std::{
2 env,
3 process::{Command, ExitStatus, Stdio},
4 sync::mpsc::Sender,
5};
6
7use crate::{exec, pkgx::Pkgx, Extension};
8use anyhow::Error;
9use fluentci_types::Output;
10
11#[derive(Default)]
12pub struct Proto {}
13
14impl Extension for Proto {
15 fn exec(
16 &mut self,
17 cmd: &str,
18 tx: Sender<String>,
19 out: Output,
20 last_cmd: bool,
21 work_dir: &str,
22 ) -> Result<ExitStatus, Error> {
23 self.setup()?;
24
25 if cmd.is_empty() {
26 return Ok(ExitStatus::default());
27 }
28
29 exec(&cmd, tx, out, last_cmd, work_dir)
30 }
31
32 fn setup(&self) -> Result<(), Error> {
33 let pkgx = Pkgx::default();
34 pkgx.setup()?;
35
36 let proto_home = format!("{}/.proto", env::var("HOME")?);
37 env::set_var("PROTO_HOME", &proto_home);
38
39 let path = format!(
40 "{}:{}:{}",
41 format!("{}/shims", proto_home),
42 format!("{}/bin", proto_home),
43 env::var("PATH")?,
44 );
45
46 env::set_var("PATH", &path);
47
48 pkgx.install(vec!["unzip", "zip", "git", "xz"])?;
49
50 let mut child = Command::new("sh")
51 .arg("-c")
52 .arg("type proto > /dev/null || curl -fsSL https://moonrepo.dev/install/proto.sh | bash -s -- --yes")
53 .stdin(Stdio::inherit())
54 .stdout(Stdio::inherit())
55 .stderr(Stdio::inherit())
56 .spawn()?;
57 child.wait()?;
58
59 Ok(())
60 }
61}