diff --git a/cli/src/lib.rs b/cli/src/lib.rs index 1f2d33cc2a..64fd99064c 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -3059,78 +3059,100 @@ fn deploy( program_str: Option, program_keypair: Option, ) -> Result<()> { + // Execute the code within the workspace with_workspace(cfg_override, |cfg| { let url = cluster_url(cfg, &cfg.test_validator); let keypair = cfg.provider.wallet.to_string(); // Deploy the programs. - println!("Deploying workspace: {url}"); - println!("Upgrade authority: {keypair}"); + println!("Deploying cluster: {}", url); + println!("Upgrade authority: {}", keypair); + + let mut program_found = true; // Flag to track if the specified program is found for mut program in cfg.read_all_programs()? { + // If a program string is provided if let Some(single_prog_str) = &program_str { let program_name = program.path.file_name().unwrap().to_str().unwrap(); + + // Check if the provided program string matches the program name if single_prog_str.as_str() != program_name { - continue; + program_found = false; + } else { + program_found = true; } } - let binary_path = program.binary_path().display().to_string(); - println!( - "Deploying program {:?}...", - program.path.file_name().unwrap().to_str().unwrap() - ); + if program_found { + let binary_path = program.binary_path().display().to_string(); - println!("Program path: {binary_path}..."); - - let (program_keypair_filepath, program_id) = match &program_keypair { - Some(path) => ( - path.clone(), - solana_sdk::signature::read_keypair_file(path) - .map_err(|_| anyhow!("Unable to read keypair file"))? - .pubkey(), - ), - None => ( - program.keypair_file()?.path().display().to_string(), - program.pubkey()?, - ), - }; + println!( + "Deploying program {:?}...", + program.path.file_name().unwrap().to_str().unwrap() + ); + println!("Program path: {}...", binary_path); + + let (program_keypair_filepath, program_id) = match &program_keypair { + Some(path) => ( + path.clone(), + solana_sdk::signature::read_keypair_file(path) + .map_err(|_| anyhow!("Unable to read keypair file"))? + .pubkey(), + ), + None => ( + program.keypair_file()?.path().display().to_string(), + program.pubkey()?, + ), + }; - // Send deploy transactions. - let exit = std::process::Command::new("solana") - .arg("program") - .arg("deploy") - .arg("--url") - .arg(&url) - .arg("--keypair") - .arg(&keypair) - .arg("--program-id") - .arg(strip_workspace_prefix(program_keypair_filepath)) - .arg(strip_workspace_prefix(binary_path)) - .stdout(Stdio::inherit()) - .stderr(Stdio::inherit()) - .output() - .expect("Must deploy"); - if !exit.status.success() { - println!("There was a problem deploying: {exit:?}."); - std::process::exit(exit.status.code().unwrap_or(1)); - } + // Send deploy transactions using the Solana CLI + let exit = std::process::Command::new("solana") + .arg("program") + .arg("deploy") + .arg("--url") + .arg(&url) + .arg("--keypair") + .arg(&keypair) + .arg("--program-id") + .arg(strip_workspace_prefix(program_keypair_filepath)) + .arg(strip_workspace_prefix(binary_path)) + .stdout(Stdio::inherit()) + .stderr(Stdio::inherit()) + .output() + .expect("Must deploy"); + + // Check if deployment was successful + if !exit.status.success() { + println!("There was a problem deploying: {exit:?}."); + std::process::exit(exit.status.code().unwrap_or(1)); + } - if let Some(mut idl) = program.idl.as_mut() { - // Add program address to the IDL. - idl.metadata = Some(serde_json::to_value(IdlTestMetadata { - address: program_id.to_string(), - })?); + if let Some(mut idl) = program.idl.as_mut() { + // Add program address to the IDL. + idl.metadata = Some(serde_json::to_value(IdlTestMetadata { + address: program_id.to_string(), + })?); + + // Persist it. + let idl_out = PathBuf::from("target/idl") + .join(&idl.name) + .with_extension("json"); + write_idl(idl, OutFile::File(idl_out))?; + } + } - // Persist it. - let idl_out = PathBuf::from("target/idl") - .join(&idl.name) - .with_extension("json"); - write_idl(idl, OutFile::File(idl_out))?; + // Break the loop if a specific programme is discovered and program_str is not None. + if program_str.is_some() && program_found { + break; } } - println!("Deploy success"); + // If a program string is provided but not found + if program_str.is_some() && !program_found { + println!("Specified program not found"); + } else { + println!("Deploy success"); + } Ok(()) })