Files
topgrade/src/steps/vim.rs

120 lines
3.4 KiB
Rust
Raw Normal View History

use crate::error::{Error, ErrorKind};
use crate::executor::{CommandExt, ExecutorOutput, RunType};
2018-12-15 21:52:21 +02:00
use crate::terminal::print_separator;
2019-03-10 21:48:49 +02:00
use crate::utils::{require, require_option, PathExt};
2018-07-07 02:18:19 +03:00
use directories::BaseDirs;
2018-06-07 08:51:16 +03:00
use std::path::PathBuf;
use std::{
fs,
io::{self, Write},
process::Command,
};
2018-06-07 08:51:16 +03:00
#[derive(Debug, Clone, Copy)]
pub enum PluginFramework {
Plug,
Vundle,
NeoBundle,
Dein,
2018-06-07 08:51:16 +03:00
}
impl PluginFramework {
pub fn detect(vimrc: &PathBuf) -> Option<PluginFramework> {
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 if content.contains("dein#begin") {
Some(PluginFramework::Dein)
2018-06-07 08:51:16 +03:00
} else {
None
}
}
pub fn upgrade_command(self) -> &'static str {
match self {
PluginFramework::NeoBundle => "NeoBundleUpdate",
PluginFramework::Vundle => "PluginUpdate",
2018-07-14 17:20:55 +03:00
PluginFramework::Plug => "PlugUpgrade | PlugUpdate",
PluginFramework::Dein => "call dein#install() | call dein#update()",
2018-06-07 08:51:16 +03:00
}
}
}
2018-07-07 02:18:19 +03:00
pub fn vimrc(base_dirs: &BaseDirs) -> Option<PathBuf> {
2018-07-07 09:18:53 +03:00
base_dirs
.home_dir()
.join(".vimrc")
.if_exists()
.or_else(|| base_dirs.home_dir().join(".vim/vimrc").if_exists())
}
2018-08-19 14:45:23 +03:00
fn nvimrc(base_dirs: &BaseDirs) -> Option<PathBuf> {
2018-07-07 09:18:53 +03:00
#[cfg(unix)]
return base_dirs.config_dir().join("nvim/init.vim").if_exists();
2018-07-07 09:18:53 +03:00
#[cfg(windows)]
return base_dirs.cache_dir().join("nvim/init.vim").if_exists();
}
2018-07-14 22:19:03 +03:00
2018-08-19 14:45:23 +03:00
#[must_use]
fn upgrade(vim: &PathBuf, vimrc: &PathBuf, plugin_framework: PluginFramework, run_type: RunType) -> Result<(), Error> {
let output = run_type
2018-12-31 13:34:56 +02:00
.execute(&vim)
.args(&["-N", "-u"])
.arg(vimrc)
2018-07-14 22:19:03 +03:00
.args(&[
"-c",
plugin_framework.upgrade_command(),
"-c",
"quitall",
"-e",
"-s",
"-V1",
2018-12-11 16:00:19 +02:00
])
.output()?;
2018-07-14 22:19:03 +03:00
if let ExecutorOutput::Wet(output) = output {
let status = output.status;
if !status.success() {
io::stdout().write(&output.stdout).ok();
io::stderr().write(&output.stderr).ok();
2019-09-28 15:13:01 +03:00
return Err(ErrorKind::ProcessFailed(status).into());
} else {
println!("Plugins upgraded")
}
}
2018-07-14 22:19:03 +03:00
Ok(())
}
2018-08-19 14:45:23 +03:00
#[must_use]
2019-03-10 21:48:49 +02:00
pub fn upgrade_vim(base_dirs: &BaseDirs, run_type: RunType) -> Result<(), Error> {
let vim = require("vim")?;
let output = Command::new(&vim).arg("--version").check_output()?;
if !output.starts_with("VIM") {
2019-09-28 15:13:01 +03:00
return Err(ErrorKind::SkipStep.into());
}
2019-03-10 21:48:49 +02:00
let vimrc = require_option(vimrc(&base_dirs))?;
let plugin_framework = require_option(PluginFramework::detect(&vimrc))?;
2018-08-19 14:45:23 +03:00
2019-03-10 21:48:49 +02:00
print_separator(&format!("Vim ({:?})", plugin_framework));
upgrade(&vim, &vimrc, plugin_framework, run_type)
2018-08-19 14:45:23 +03:00
}
#[must_use]
2019-03-10 21:48:49 +02:00
pub fn upgrade_neovim(base_dirs: &BaseDirs, run_type: RunType) -> Result<(), Error> {
let nvim = require("nvim")?;
let nvimrc = require_option(nvimrc(&base_dirs))?;
let plugin_framework = require_option(PluginFramework::detect(&nvimrc))?;
2018-08-19 14:45:23 +03:00
2019-03-10 21:48:49 +02:00
print_separator(&format!("Neovim ({:?})", plugin_framework));
upgrade(&nvim, &nvimrc, plugin_framework, run_type)
2018-08-19 14:45:23 +03:00
}