use super::utils::{Check, PathExt}; use directories::BaseDirs; use failure; use std::fs; use std::path::PathBuf; use std::process::Command; #[derive(Debug, Clone, Copy)] pub enum PluginFramework { Plug, Vundle, NeoBundle, } impl PluginFramework { pub fn detect(vimrc: &PathBuf) -> Option { let content = fs::read_to_string(vimrc).ok()?; if content.contains("NeoBundle") { Some(PluginFramework::NeoBundle) } else if content.contains("Vundle") { Some(PluginFramework::Vundle) } else if content.contains("plug#begin") { Some(PluginFramework::Plug) } else { None } } pub fn upgrade_command(self) -> &'static str { match self { PluginFramework::NeoBundle => "NeoBundleUpdate", PluginFramework::Vundle => "PluginUpdate", PluginFramework::Plug => "PlugUpgrade | PlugUpdate", } } } pub fn vimrc(base_dirs: &BaseDirs) -> Option { base_dirs .home_dir() .join(".vimrc") .if_exists() .or_else(|| base_dirs.home_dir().join(".vim/vimrc").if_exists()) } pub fn nvimrc(base_dirs: &BaseDirs) -> Option { #[cfg(unix)] return base_dirs.config_dir().join("nvim/init.vim").if_exists(); #[cfg(windows)] return base_dirs.cache_dir().join("nvim/init.vim").if_exists(); } pub fn upgrade(vim: &PathBuf, vimrc: &PathBuf, plugin_framework: &PluginFramework) -> Result<(), failure::Error> { Command::new(&vim) .args(&[ "-N", "-u", vimrc.to_str().unwrap(), "-c", plugin_framework.upgrade_command(), "-c", "quitall", "-e", "-s", "-V1", ]) .spawn()? .wait()? .check()?; println!(); Ok(()) }