diff --git a/forge-client/src/main.rs b/forge-client/src/main.rs index 5806bf5..6c1578f 100644 --- a/forge-client/src/main.rs +++ b/forge-client/src/main.rs @@ -59,6 +59,10 @@ enum Commands { /// Optional cargo flag #[arg(long, require_equals = true, num_args = 0..=1, default_value_t = Tag::Debug, default_missing_value = "debug")] tag: Tag, + + /// Basename of the repository + #[arg(long, value_name = "NAME")] + basename: String, }, } @@ -140,6 +144,7 @@ async fn main() -> Result<(), Box> { subcommand, features, tag, + basename, } => { // Connect to a peer let remote = format!("{}:{}", args.host, args.port); @@ -165,7 +170,7 @@ async fn main() -> Result<(), Box> { profile, command: test_command, repository: Url::parse(&repo).unwrap(), - basename: "serde_json".to_string(), + basename, }; info!("Message UUID: {}", &test_message.uuid); diff --git a/forge-server/src/main.rs b/forge-server/src/main.rs index 9dfae5a..fe87c29 100644 --- a/forge-server/src/main.rs +++ b/forge-server/src/main.rs @@ -16,6 +16,7 @@ use uuid_simd::UuidExt; struct HostConfig { ip: String, port: u16, + build_directory: Option, } #[derive(Serialize, Deserialize, Clone)] @@ -100,7 +101,7 @@ struct Message { basename: String, } -async fn build(msg: Message, address: SocketAddr) { +async fn build(msg: Message, address: SocketAddr, dir: String) { let mut features = String::new(); match msg.command.features { Some(f) => { @@ -115,14 +116,16 @@ async fn build(msg: Message, address: SocketAddr) { } success!( - "Received message from {:?}: {}\ngit clone {}\n{} {} {} {}\n", + "Received message from {:?}: {}\ncd {}\ngit clone {}\ncd {}\n{} {} {} {}\n", address, msg.uuid.format_hyphenated(), + dir, msg.repository, + msg.basename, msg.command.build_system, msg.command.subcommand, msg.command.tag, - features + features, ); match msg.pre_exec { @@ -162,6 +165,7 @@ async fn process_socket( mut socket: TcpStream, address: SocketAddr, auth: AuthConfig, + dir: String, salt: SaltString, argon2: Argon2<'_>, ) { @@ -187,12 +191,13 @@ async fn process_socket( if auth.authenticate { match &auth.password { Some(pass) => { + let directory = dir.clone(); if json .authenticate(pass.clone(), salt.clone(), argon2.clone()) .await { tokio::spawn(async move { - build(json, address).await; + build(json, address, directory).await; }); } } @@ -201,7 +206,10 @@ async fn process_socket( } } } else { - build(json, address).await; + let directory = dir.clone(); + tokio::spawn(async move { + build(json, address, directory).await; + }); } } } @@ -220,10 +228,11 @@ async fn main() -> io::Result<()> { match listener.accept().await { Ok((socket, addr)) => { let auth = config.auth.clone(); + let dir = config.host.build_directory.clone().unwrap(); let m_salt = salt.clone(); let m_argon2 = argon2.clone(); tokio::spawn(async move { - process_socket(socket, addr, auth, m_salt, m_argon2).await; + process_socket(socket, addr, auth, dir, m_salt, m_argon2).await; }); } Err(e) => error!("couldn't get client: {:?}", e), @@ -236,6 +245,9 @@ async fn configure() -> Config { default_config.push("forge"); default_config.push("config.toml"); + let mut default_build_dir = dirs::home_dir().unwrap(); + default_build_dir.push("src"); + let config_contents = match fs::read_to_string(&default_config) { Ok(f) => f, Err(e) => { @@ -244,6 +256,7 @@ async fn configure() -> Config { host: HostConfig { ip: "127.0.0.1".to_string(), port: 9134, + build_directory: Some(default_build_dir.to_str().unwrap().to_string()), }, auth: AuthConfig { authenticate: false,