diff --git a/Cargo.lock b/Cargo.lock index e502d1eb..b2cd6105 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,6 +29,14 @@ name = "cfg-if" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "directories" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "failure" version = "0.1.1" @@ -53,11 +61,27 @@ name = "libc" version = "0.2.42" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "proc-macro2" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "quote" version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "quote" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "redox_syscall" version = "0.1.40" @@ -76,6 +100,21 @@ name = "rustc-demangle" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "serde" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "serde_derive" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "syn" version = "0.11.11" @@ -86,6 +125,16 @@ dependencies = [ "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "syn" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "synom" version = "0.11.3" @@ -113,13 +162,25 @@ dependencies = [ "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "toml" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "topgrade" version = "0.5.0" dependencies = [ + "directories 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "which 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -128,6 +189,11 @@ name = "unicode-xid" version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "which" version = "2.0.0" @@ -161,18 +227,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum backtrace-sys 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "bff67d0c06556c0b8e6b5f090f0eac52d950d9dfd1d35ba04e4ca3543eaf6a7e" "checksum cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "49ec142f5768efb5b7622aebc3fdbdbb8950a4b9ba996393cb76ef7466e8747d" "checksum cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "405216fd8fe65f718daa7102ea808a946b6ce40c742998fbfd3463645552de18" +"checksum directories 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc2561db021b6f1321d0f16b67ed28ce843ef4610dfaa432e3ffa2e8a3050ebf" "checksum failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934799b6c1de475a012a02dab0ace1ace43789ee4b99bcfbf1a2e3e8ced5de82" "checksum failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c7cdda555bb90c9bb67a3b670a0f42de8e73f5981524123ad8578aafec8ddb8b" "checksum libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b685088df2b950fccadf07a7187c8ef846a959c142338a48f9dc0b94517eb5f1" +"checksum proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "effdb53b25cdad54f8f48843d67398f7ef2e14f12c1b4cb4effc549a6462a4d6" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" +"checksum quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e44651a0dc4cdd99f71c83b561e221f714912d11af1a4dff0631f923d53af035" "checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "76d7ba1feafada44f2d38eed812bd2489a03c0f5abb975799251518b68848649" +"checksum serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)" = "e9a2d9a9ac5120e0f768801ca2b58ad6eec929dc9d1d616c162f208869c2ce95" +"checksum serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)" = "0a90213fa7e0f5eac3f7afe2d5ff6b088af515052cc7303bd68c7e3b91a3fb79" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" +"checksum syn 0.14.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c67da57e61ebc7b7b6fff56bb34440ca3a83db037320b0507af4c10368deda7d" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" "checksum synstructure 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a761d12e6d8dcb4dcf952a7a89b475e3a9d69e4a69307e01a470977642914bd" "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" +"checksum toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a0263c6c02c4db6c8f7681f9fd35e90de799ebd4cfdeab77a38f4ff6b3d8c0d9" "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" +"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum which 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49c4f580e93079b70ac522e7bdebbe1568c8afa7d8d05ee534ee737ca37d2f51" "checksum winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "773ef9dcc5f24b7d850d0ff101e542ff24c3b090a9768e03ff889fdef41f00fd" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" diff --git a/Cargo.toml b/Cargo.toml index 1109a358..338eb3f0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,11 @@ authors = ["Roey Darwish Dror "] exclude = ["doc/screenshot.gif"] [dependencies] -which = "2.0.0" -termion = "1.5.1" +directories = "0.10.0" failure = "0.1.1" failure_derive = "0.1.1" +serde = "1.0.66" +serde_derive = "1.0.66" +termion = "1.5.1" +toml = "0.4.6" +which = "2.0.0" diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 00000000..9a7f0a6a --- /dev/null +++ b/src/config.rs @@ -0,0 +1,31 @@ +use directories; +use failure; +use std::collections::BTreeMap; +use std::fs; +use toml; + +#[derive(Deserialize, Default)] +pub struct Config { + commands: Option>, + git_repos: Option>, +} + +impl Config { + pub fn read() -> Result { + let base_dirs = directories::BaseDirs::new(); + let config_path = base_dirs.config_dir().join("topgrade.toml"); + if !config_path.exists() { + return Ok(Default::default()); + } + + Ok(toml::from_str(&fs::read_to_string(config_path)?)?) + } + + pub fn commands(&self) -> &Option> { + &self.commands + } + + pub fn git_repos(&self) -> &Option> { + &self.git_repos + } +} diff --git a/src/git.rs b/src/git.rs index 044245d4..4064e068 100644 --- a/src/git.rs +++ b/src/git.rs @@ -1,5 +1,6 @@ use super::Check; use failure::Error; +use std::collections::HashSet; use std::path::{Path, PathBuf}; use std::process::Command; use which::which; @@ -55,4 +56,10 @@ impl Git { Ok(None) } + + pub fn insert_if_valid>(&self, git_repos: &mut HashSet, path: P) { + if let Some(repo) = self.get_repo_root(path) { + git_repos.insert(repo); + } + } } diff --git a/src/main.rs b/src/main.rs index 2816b77f..b35b4804 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,15 @@ +extern crate directories; extern crate failure; extern crate which; #[macro_use] extern crate failure_derive; extern crate termion; +extern crate toml; +#[macro_use] +extern crate serde_derive; +extern crate serde; +mod config; mod git; mod linux; mod npm; @@ -12,6 +18,7 @@ mod steps; mod terminal; mod vim; +use config::Config; use failure::Error; use git::Git; use report::{Report, Reporter}; @@ -76,20 +83,19 @@ fn main() -> Result<(), Error> { let mut git_repos: HashSet = HashSet::new(); let terminal = Terminal::new(); let mut reports = Report::new(); + let config = Config::read()?; - { - let mut collect_repo = |path| { - if let Some(repo) = git.get_repo_root(path) { - git_repos.insert(repo); - } - }; + git.insert_if_valid(&mut git_repos, home_path(".emacs.d")); - collect_repo(home_path(".emacs.d")); + if cfg!(unix) { + git.insert_if_valid(&mut git_repos, home_path(".zshrc")); + git.insert_if_valid(&mut git_repos, home_path(".oh-my-zsh")); + git.insert_if_valid(&mut git_repos, home_path(".tmux")); + } - if cfg!(unix) { - collect_repo(home_path(".zshrc")); - collect_repo(home_path(".oh-my-zsh")); - collect_repo(home_path(".tmux")); + if let Some(custom_git_repos) = config.git_repos() { + for git_repo in custom_git_repos { + git.insert_if_valid(&mut git_repos, git_repo); } } @@ -201,6 +207,13 @@ fn main() -> Result<(), Error> { upgrade_macos().report("System upgrade", &mut reports);; } + if let Some(commands) = config.commands() { + for (name, command) in commands { + terminal.print_separator(name); + run_custom_command(&command).report(name.as_ref(), &mut reports); + } + } + let mut reports: Vec<_> = reports.into_iter().collect(); reports.sort(); diff --git a/src/steps.rs b/src/steps.rs index e6096d04..96ac224e 100644 --- a/src/steps.rs +++ b/src/steps.rs @@ -220,3 +220,14 @@ pub fn upgrade_debian( Ok(()) } + +pub fn run_custom_command(command: &str) -> Result<(), failure::Error> { + Command::new("sh") + .arg("-c") + .arg(command) + .spawn()? + .wait()? + .check()?; + + Ok(()) +}