diff --git a/CHANGELOG.md b/CHANGELOG.md index d6932d44fb..e0d7b4f0f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,10 @@ The minor version will be incremented upon a breaking change and the patch versi ## [Unreleased] +### Features + +* cli: Add `--program-keypair` to `anchor deploy` ([#1786](https://github.com/project-serum/anchor/pull/1786)). + ### Fixes * lang: Fix `returns` being serialized as `null` instead of `undefined` in IDL ([#1782](https://github.com/project-serum/anchor/pull/1782)). diff --git a/cli/src/lib.rs b/cli/src/lib.rs index db5f23d1aa..2b95e9f958 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -198,8 +198,12 @@ pub enum Command { Clean, /// Deploys each program in the workspace. Deploy { + /// Only deploy this program #[clap(short, long)] program_name: Option, + /// Keypair of the program (filepath) (requires program-name) + #[clap(long, requires = "program-name")] + program_keypair: Option, }, /// Runs the deploy migration script. Migrate, @@ -415,7 +419,10 @@ pub fn entry(opts: Opts) -> Result<()> { cargo_args, ), Command::Clean => clean(&opts.cfg_override), - Command::Deploy { program_name } => deploy(&opts.cfg_override, program_name), + Command::Deploy { + program_name, + program_keypair, + } => deploy(&opts.cfg_override, program_name, program_keypair), Command::Expand { program_name, cargo_args, @@ -1839,7 +1846,7 @@ fn test( // In either case, skip the deploy if the user specifies. let is_localnet = cfg.provider.cluster == Cluster::Localnet; if (!is_localnet || skip_local_validator) && !skip_deploy { - deploy(cfg_override, None)?; + deploy(cfg_override, None, None)?; } let mut is_first_suite = true; if cfg.scripts.get("test").is_some() { @@ -2338,7 +2345,11 @@ fn clean(cfg_override: &ConfigOverride) -> Result<()> { Ok(()) } -fn deploy(cfg_override: &ConfigOverride, program_str: Option) -> Result<()> { +fn deploy( + cfg_override: &ConfigOverride, + program_str: Option, + program_keypair: Option, +) -> Result<()> { with_workspace(cfg_override, |cfg| { let url = cluster_url(cfg, &cfg.test_validator); let keypair = cfg.provider.wallet.to_string(); @@ -2362,7 +2373,10 @@ fn deploy(cfg_override: &ConfigOverride, program_str: Option) -> Result< ); println!("Program path: {}...", binary_path); - let file = program.keypair_file()?; + let program_keypair_filepath = match &program_keypair { + Some(program_keypair) => program_keypair.clone(), + None => program.keypair_file()?.path().display().to_string(), + }; // Send deploy transactions. let exit = std::process::Command::new("solana") @@ -2373,7 +2387,7 @@ fn deploy(cfg_override: &ConfigOverride, program_str: Option) -> Result< .arg("--keypair") .arg(&keypair) .arg("--program-id") - .arg(file.path().display().to_string()) + .arg(program_keypair_filepath) .arg(&binary_path) .stdout(Stdio::inherit()) .stderr(Stdio::inherit())