Listen to git commits for a specific repo and run a shell command
at master 2.4 kB view raw
1use std::process::Command; 2 3mod args; 4mod did; 5mod knot; 6 7fn main() -> Result<(), ()> { 8 // load configuration 9 let config = match args::load_config() { 10 Ok(res) => res, 11 Err(_) => return Err(()), 12 }; 13 14 // resolve handle to did 15 println!("Resolving {}", config.handle); 16 let did_doc = match did::get_did(&config.handle) { 17 Ok(res) => res, 18 Err(_) => return Err(()), 19 }; 20 println!( 21 " Found DID `{0}` hosted at `{1}`", 22 did_doc.did, did_doc.pds 23 ); 24 25 // resolve did+repoName to knotserver 26 println!("Resolving @{0}/{1}", config.handle, config.repo_name); 27 let knot_server = match knot::find_knot(&did_doc.did, &config.repo_name, &did_doc.pds) { 28 Ok(val) => val, 29 Err(_) => return Err(()), 30 }; 31 println!(" Found knot `{}`", knot_server); 32 33 // connect to /events on knotserver 34 println!( 35 "Connecting to `{}`", 36 format!("wss://{}/events", knot_server) 37 ); 38 39 match ws::connect(format!("ws://{}/events", knot_server), |_out| { 40 println!(" Connection successful"); 41 |msg: ws::Message| { 42 // parse json 43 let body = match json::parse(match msg.as_text() { 44 Ok(val) => val, 45 Err(_) => return Ok(()), 46 }) { 47 Ok(val) => val, 48 Err(_) => { 49 println!(" Invalid body. Skipping message"); 50 return Ok(()); 51 } 52 }; 53 54 // filter by did and reponame 55 if let Some(repo_did) = body["event"]["repoDid"].as_str() 56 && let Some(repo) = body["event"]["repoName"].as_str() 57 && repo_did != &did_doc.did 58 && repo != &config.repo_name 59 { 60 // repo doesnt match so skip 61 return Ok(()); 62 } 63 64 println!(" Executing `/bin/sh -c {}`", &config.shell); 65 66 // exec shell command in /bin/sh 67 match Command::new("/bin/sh") 68 .arg("-c") 69 .arg(&config.shell) 70 .output() 71 { 72 Ok(val) => val, 73 Err(_) => return Ok(()), 74 }; 75 76 Ok(()) 77 } 78 }) { 79 Ok(_) => {} 80 Err(err) => println!(" Connection failed: {}", err), 81 }; 82 83 return Ok(()); 84}