From a47ee3c81475ff5c9aeafe84aaddb09388b743fb Mon Sep 17 00:00:00 2001 From: Thomas Forgione Date: Tue, 25 Sep 2018 14:51:32 +0200 Subject: [PATCH] Added notifications --- Cargo.toml | 2 + assets/failure.png | Bin 0 -> 3497 bytes assets/success.png | Bin 0 -> 5968 bytes src/lib.rs | 171 +++++++++++++++++++++++++++++++++++---------- 4 files changed, 136 insertions(+), 37 deletions(-) create mode 100644 assets/failure.png create mode 100644 assets/success.png diff --git a/Cargo.toml b/Cargo.toml index 73e43f6..fab5225 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,8 @@ version = "0.1.0" authors = ["Thomas Forgione "] [dependencies] +dirs = "1.0.4" +notify-rust = "3.4.2" colored = "1.6.1" hyper = "0.12.10" diff --git a/assets/failure.png b/assets/failure.png new file mode 100644 index 0000000000000000000000000000000000000000..c581444dace52ebd5d63f7ec3ca8e0d672c763c2 GIT binary patch literal 3497 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 XQ9aBF%S3i900000NkvXXu0mjf9C40l literal 0 HcmV?d00001 diff --git a/assets/success.png b/assets/success.png new file mode 100644 index 0000000000000000000000000000000000000000..f7d4a49af4d8bacecfe6658e42b5a42a38598928 GIT binary patch literal 5968 zcmV-W7q94vP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000boNklHn&|XU!Mz9X&0p06YL-$@KTFc>?}g z0DFmOV`ppc%_uuB#ED(U-O9ExjD;^_puM~0ddo6gdqc~Wcfxp`9w zcJwrFuxx(pvgTN7EHqMT=5RqnUA6EAeD!Yx=3T`<`{0 zvYJzHU2W;N1An7s;gQSVe_?7ocNqEX1v#T>+q_r|b@VjfWLbFR10T3Jl`p4pYNRR8 zhPHOKr3>dh0UbTfn=A_tfAII-mCBV5BA<=9T8V${Y)wCX-Y%McWg;vsTkH`2Y57$jOJ(vuf$QY}0;;Zsd^VcZTKvhc)c!dR{xg=1udn>r zvgE0$pTMb3fCyj%oE%z^H(G4zYD<^SO9Dvnt(HxHf6daB$xPv=C^;E`{Lg&p)3>|Y z($D_NB%h<;KO3^??^a)ZZSqv%c@&)!K6nCL$3`I=ozPm`c1BcoPJ$27{nsvAog6E^ zh(h@oz&?I9gp)%}d9B5#y4uo}^Ns)^cv~n$_pe#LHkmE$L$=rt3L*~x*|B)VXxh`& zmj3Y>>+>7}|Hq*a?YwTqx@5MrA7h1s000i~JC(Zh|LlzRdm8rw)&jV2mcf5M6sDcm zt=N#vm3wh2x33m--}ONl9cs!eEjFJi>7Nz>9gj6{vMhX8N`4kVe3rm}Arz*+S-axK zM8WCD=;U*C!=r$O@so*)QPh23Tl%>(-M{r#;B5=L@A-ptyywLY&3#AupVpdIbhV|c zr`!13-ANLHZwrM*=em_QB?`_F3{N~$|E%`df?Kgs$cD$YrrT#F0B;3;&GPlhR|@U; z;G!$VdlxSJsFdcr?cFVB#5aWG+rkmix&E4siIO*n!Lg_Pr~_ao01`wJql2lu(qhwn zTl<`|LO{DO``v4ne>~~o6!sr~0Ga&Dxbj1*tcx$YXswjy!7~8+GkVdAx1=p61beZ|>Xvc8zmm2AeMXKaYgvj&-XxC#q@;heyBX zUqim^4MGr*a4H7*iO87N;?7w$U;y~7cV8-W^}<_i3*TIJ)sp1!d~o=voU&vXY~oNV2t3VH1QF0TvIoMN!m6d~l9o;1|BFYP-}h#>H`}98 zdG`&g+TtV(4i4{v=IRV*R8h>{(O zLhCq`qBrGq?M3g2Zy_3IEWcv)0%_5Y?tY~Co%QLo=d!ntos$ISF|CLs8Qg_rPUi3K6)xdnv6Wk@S1SIHk71qBR|#ERc}5DO!p1OSYA&*ItR zpF`0-8FUmBMg&x=1f>?hl3{pm8Ato%5#`Y$B6u}4V|M;zn!0tHwbb zf@LuV`bA!Ow2_%TqkYpe46v!4oaGdlzJ2wNj*e@ErLXs?F;&&DWD{H`Ab}cVt0`5p z!Vd?w;it#%LctlFc};NcRBSM!up>4GUoVxl!ao?z``HA9YM(78z%YZ2nL7di;A`6k zhCGi}^dG2BY6gT%!6`?e6obKFZtP%&)-DQ_<1^l`?XC+LPQj8kN>fE-$E}fSmF_Wy zp$$Xp;Angz40EtDoI?VFO0l43%``&hoB*vDMw=I1hc_L3IbX8u5QJz#xfFrYKLhyB zAf!?W0~|#p62ZXXyrUI=jTi@NAejNJ4cKt-ogn}DTp++0C|{EQS*`N6*Ivq2!jUKl zDU^$0Xzfc}voBkNntc7eQX#NTLfSS8g*;DA(1~i5{z@74=lkG#V;Z~G2ozw>i4*`4 zpfscEqQ`Zx{ouZFCzeP-pb6z-1X@pvx@kn;Qv~Iv0J30*Ec73!mfZ?&FvcjY{DMbm z-}OzPgu17oM$nuS04U{4(lDdyny-|K{PoxNovg-_O(0I8QVheGAn&K;zFUq02qT_| z00BavK45@BM5a>V^hzVu#iZmaOl-hr8NJoVNPr9 z|HfBqheS>C48VYyAtXTxnwAE0P5^;G({hvRt2Hotjw7xf8Ym59G9`}1k|0h297Q-1 z#n|{HauYo0mT@oDr$-Ky708|%w@-;MBPC|n0Zx+uB7d+#P_XbJ2thFQ4CPX_DwZ5g z=TGJH9wL!A1PR#TF#7kGT&GOygcRBYizlk9%74Lzf|hC|_{s=WHunSwL6DOC$WcR@ zf~XFLnX_J1e7JXiHt$v?-f`h?;J~Xxh8g#fq`ulzT1zP*2qHL_k|2dY6cQ8=?57-w z*{uVt(^UWiup|ZYr@#jY3<_ojh9EkjsW~zwL(t> ztT6jTvjIo|1OXyI3OW}EAXuW|&QjKX!J)v&1bmPT5c+kMmW>=!KTt}nl@bQ!04 z`0X)*2nUMt2=ZQ%@W}|iBjoH-K>z>Wg0000 { - match $e { - Err(_) => { - let err: Result<(), ()> = Err(()); - return err; - }, - _ => (), - } +use notify_rust::Notification; + +/// The different types of error that can occur. +#[derive(Debug)] +pub enum Error { + /// No builder can build this project. + NoBuilderFound, + + /// An io::Error happened while running a build command. + IoError(io::Error), + + /// A command exited with non-zero exit code. + CommandError(String, Vec, ExitStatus), +} + +impl From for Error { + fn from(e: io::Error) -> Error { + Error::IoError(e) } } @@ -26,32 +36,31 @@ pub fn contains_file(path: &str, file: &str) -> bool { } /// Tries to build a certain directory using the specified builders. -pub fn run_command(command: &str, path: &str) -> Result { - let mut child = match Command::new(command) - .current_dir(path) - .spawn() { - Err(x) => return Err(x), - Ok(child) => child, - }; - - child.wait() +pub fn run_command(command: &str, path: &str) -> Result<(), Error> { + run_command_with_args(command, path, vec![]) } /// Run a build commands, and wait untils its finished, returning its result. -pub fn run_command_with_args(command: &str, path: &str, args: I) -> Result where - I: IntoIterator, - S: AsRef { +pub fn run_command_with_args(command: &str, path: &str, args: Vec<&str>) -> Result<(), Error> { + + let new_args: Vec = args.iter().map(|x| String::from(*x)).collect(); let mut child = Command::new(command) .current_dir(path) .args(args) .spawn()?; - child.wait() + let exit = child.wait()?; + + if exit.success() { + Ok(()) + } else { + Err(Error::CommandError(command.to_owned(), new_args, exit)) + } } /// Tries to build a certain directory using the specified builders. -pub fn build(path: &PathBuf, builders: &Vec>) -> Result<(), ()> { +pub fn build(path: &PathBuf, builders: &Vec>) -> Result<(), Error> { let mut path = path.clone(); @@ -59,7 +68,7 @@ pub fn build(path: &PathBuf, builders: &Vec>) -> Result<(), ()> { if path.to_str().unwrap() == "/" { // Couldn't find a buildable directory - return Err(()); + return Err(Error::NoBuilderFound); } for builder in builders { @@ -86,6 +95,12 @@ pub fn destroy(result: Result) -> Result<(), ()> { /// A general builders that contains many builders and can build any type of code. pub struct GeneralBuilder { + /// The path to the success icon. + success: PathBuf, + + /// The path to the failure icon. + failure: PathBuf, + /// The builders contained. builders: Vec>, } @@ -93,7 +108,41 @@ pub struct GeneralBuilder { impl GeneralBuilder { /// Creates a new general builder with the defaults builders. pub fn new() -> GeneralBuilder { + + let mut config = PathBuf::from(dirs::config_dir().unwrap()); + config.push("mars"); + + let mut success = config.clone(); + success.push("success.png"); + + let mut failure = config.clone(); + failure.push("failure.png"); + + if ! success.exists() || ! failure.exists() { + + create_dir_all(&config).unwrap(); + + const SUCCESS_BYTES: &[u8] = include_bytes!("../assets/success.png"); + const FAILURE_BYTES: &[u8] = include_bytes!("../assets/failure.png"); + + use std::io::Write; + + let mut path = config.clone(); + path.push("success.png"); + + let mut success_file = File::create(&success).unwrap(); + success_file.write_all(SUCCESS_BYTES).unwrap(); + + let mut path = config.clone(); + path.push("success.png"); + + let mut failure_file = File::create(&failure).unwrap(); + failure_file.write_all(FAILURE_BYTES).unwrap(); + } + GeneralBuilder { + success: success, + failure: failure, builders: vec![ Box::new(MakeBuilder::new()), Box::new(CMakeBuilder::new()), @@ -103,9 +152,57 @@ impl GeneralBuilder { } /// Triggers a build. - pub fn build(&self, path: &str) -> Result<(), ()> { - build(&PathBuf::from(path), &self.builders) + pub fn build(&self, path: &str) -> Result<(), Error> { + let result = build(&PathBuf::from(path), &self.builders); + + match result { + Ok(_) => self.notify_success(), + Err(ref e) => self.notify_error(&e), + } + + result } + + /// Sends a notification of a successful build. + pub fn notify_success(&self) { + + println!("{}", self.success.to_str().unwrap()); + + let _ = Notification::new() + .appname("Mars") + .summary("Success") + .body("Mars finished successfully") + .icon(self.success.to_str().unwrap()) + .show(); + + } + + /// Sends a notification of an error. + pub fn notify_error(&self, e: &Error) { + + let body = match e { + Error::NoBuilderFound => "No builder was found for this directory".to_string(), + Error::IoError(ref e) => format!("Error while running command: {:?}", e).to_string(), + Error::CommandError(ref command, ref args, ref status) => { + let status = match status.code() { + None => "None".to_owned(), + Some(e) => e.to_string(), + }; + + format!("Command \"{} {}\" failed: {}", + command, args.join(" "), status).to_string() + }, + }; + + let _ = Notification::new() + .appname("Mars") + .summary("Failure") + .body(&body) + .icon(self.failure.to_str().unwrap()) + .show(); + + } + } /// A generic builder. It can build some projects. @@ -115,7 +212,7 @@ pub trait Builder { fn is_buildable(&self, path: &str) -> bool; /// Trigger all the commands to build the project. - fn build(&self, path: &str) -> Result<(), ()>; + fn build(&self, path: &str) -> Result<(), Error>; } /// The builder that looks for makefiles. @@ -133,8 +230,8 @@ impl Builder for MakeBuilder { contains_file(path, "Makefile") } - fn build(&self, path: &str) -> Result<(), ()> { - destroy!(run_command("make", path)); + fn build(&self, path: &str) -> Result<(), Error> { + run_command("make", path)?; Ok(()) } } @@ -154,7 +251,7 @@ impl Builder for CMakeBuilder { contains_file(path, "CMakeLists.txt") } - fn build(&self, path: &str) -> Result<(), ()> { + fn build(&self, path: &str) -> Result<(), Error> { let mut build = PathBuf::from(path); build.push("build"); @@ -163,14 +260,14 @@ impl Builder for CMakeBuilder { if ! contains_file(path, "build/Makefile") { // Create build directory - destroy!(create_dir_all(&build)); + create_dir_all(&build)?; // Run cmake .. in build directory - destroy!(run_command_with_args("cmake", build.to_str().unwrap(), [".."].iter())); + run_command_with_args("cmake", build.to_str().unwrap(), vec![".."])?; } // Run make in build directory - destroy!(run_command("make", build.to_str().unwrap())); + run_command("make", build.to_str().unwrap())?; Ok(()) } @@ -191,7 +288,7 @@ impl Builder for CargoBuilder { contains_file(path, "Cargo.toml") } - fn build(&self, path: &str) -> Result<(), ()> { - destroy(run_command_with_args("cargo", path, ["build"].iter())) + fn build(&self, path: &str) -> Result<(), Error> { + run_command_with_args("cargo", path, vec!["build"]) } }