Browse Source

cli: Option to specify program to launch/deploy in workspace (#288)

jon-chuang 4 years ago
parent
commit
30a58b99e1
1 changed files with 41 additions and 9 deletions
  1. 41 9
      cli/src/main.rs

+ 41 - 9
cli/src/main.rs

@@ -94,6 +94,8 @@ pub enum Command {
         url: Option<String>,
         url: Option<String>,
         #[clap(short, long)]
         #[clap(short, long)]
         keypair: Option<String>,
         keypair: Option<String>,
+        #[clap(short, long)]
+        program_name: Option<String>,
     },
     },
     /// Runs the deploy migration script.
     /// Runs the deploy migration script.
     Migrate {
     Migrate {
@@ -110,6 +112,8 @@ pub enum Command {
         /// this should almost always be set.
         /// this should almost always be set.
         #[clap(short, long)]
         #[clap(short, long)]
         verifiable: bool,
         verifiable: bool,
+        #[clap(short, long)]
+        program_name: Option<String>,
     },
     },
     /// Upgrades a single program. The configured wallet must be the upgrade
     /// Upgrades a single program. The configured wallet must be the upgrade
     /// authority.
     /// authority.
@@ -218,7 +222,11 @@ fn main() -> Result<()> {
         Command::New { name } => new(name),
         Command::New { name } => new(name),
         Command::Build { idl, verifiable } => build(idl, verifiable),
         Command::Build { idl, verifiable } => build(idl, verifiable),
         Command::Verify { program_id } => verify(program_id),
         Command::Verify { program_id } => verify(program_id),
-        Command::Deploy { url, keypair } => deploy(url, keypair),
+        Command::Deploy {
+            url,
+            keypair,
+            program_name,
+        } => deploy(url, keypair, program_name),
         Command::Upgrade {
         Command::Upgrade {
             program_id,
             program_id,
             program_filepath,
             program_filepath,
@@ -229,7 +237,8 @@ fn main() -> Result<()> {
             url,
             url,
             keypair,
             keypair,
             verifiable,
             verifiable,
-        } => launch(url, keypair, verifiable),
+            program_name,
+        } => launch(url, keypair, verifiable, program_name),
         Command::Test {
         Command::Test {
             skip_deploy,
             skip_deploy,
             skip_local_validator,
             skip_local_validator,
@@ -936,7 +945,7 @@ fn test(
             _ => {
             _ => {
                 if !skip_deploy {
                 if !skip_deploy {
                     build(None, false)?;
                     build(None, false)?;
-                    deploy(None, None)?;
+                    deploy(None, None, None)?;
                 }
                 }
                 None
                 None
             }
             }
@@ -1151,11 +1160,19 @@ fn start_test_validator(cfg: &Config, flags: Option<Vec<String>>) -> Result<Chil
 
 
 // TODO: Testing and deploys should use separate sections of metadata.
 // TODO: Testing and deploys should use separate sections of metadata.
 //       Similarly, each network should have separate metadata.
 //       Similarly, each network should have separate metadata.
-fn deploy(url: Option<String>, keypair: Option<String>) -> Result<()> {
-    _deploy(url, keypair).map(|_| ())
+fn deploy(
+    url: Option<String>,
+    keypair: Option<String>,
+    program_name: Option<String>,
+) -> Result<()> {
+    _deploy(url, keypair, program_name).map(|_| ())
 }
 }
 
 
-fn _deploy(url: Option<String>, keypair: Option<String>) -> Result<Vec<(Pubkey, Program)>> {
+fn _deploy(
+    url: Option<String>,
+    keypair: Option<String>,
+    program_str: Option<String>,
+) -> Result<Vec<(Pubkey, Program)>> {
     with_workspace(|cfg, _path, _cargo| {
     with_workspace(|cfg, _path, _cargo| {
         // Fallback to config vars if not provided via CLI.
         // Fallback to config vars if not provided via CLI.
         let url = url.unwrap_or_else(|| cfg.cluster.url().to_string());
         let url = url.unwrap_or_else(|| cfg.cluster.url().to_string());
@@ -1168,9 +1185,19 @@ fn _deploy(url: Option<String>, keypair: Option<String>) -> Result<Vec<(Pubkey,
         let mut programs = Vec::new();
         let mut programs = Vec::new();
 
 
         for mut program in read_all_programs()? {
         for mut program in read_all_programs()? {
+            if let Some(single_prog_str) = &program_str {
+                let program_name = program.path.file_name().unwrap().to_str().unwrap();
+                if single_prog_str.as_str() != program_name {
+                    continue;
+                }
+            }
             let binary_path = program.binary_path().display().to_string();
             let binary_path = program.binary_path().display().to_string();
 
 
-            println!("Deploying {}...", binary_path);
+            println!(
+                "Deploying program {:?}...",
+                program.path.file_name().unwrap().to_str().unwrap()
+            );
+            println!("Program path: {}...", binary_path);
 
 
             // Write the program's keypair filepath. This forces a new deploy
             // Write the program's keypair filepath. This forces a new deploy
             // address.
             // address.
@@ -1245,10 +1272,15 @@ fn upgrade(program_id: Pubkey, program_filepath: String) -> Result<()> {
     })
     })
 }
 }
 
 
-fn launch(url: Option<String>, keypair: Option<String>, verifiable: bool) -> Result<()> {
+fn launch(
+    url: Option<String>,
+    keypair: Option<String>,
+    verifiable: bool,
+    program_name: Option<String>,
+) -> Result<()> {
     // Build and deploy.
     // Build and deploy.
     build(None, verifiable)?;
     build(None, verifiable)?;
-    let programs = _deploy(url.clone(), keypair.clone())?;
+    let programs = _deploy(url.clone(), keypair.clone(), program_name.clone())?;
 
 
     with_workspace(|cfg, _path, _cargo| {
     with_workspace(|cfg, _path, _cargo| {
         let url = url.unwrap_or_else(|| cfg.cluster.url().to_string());
         let url = url.unwrap_or_else(|| cfg.cluster.url().to_string());