fluentci_ext/
proto.rs

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}