Files
topgrade/src/steps/vim.rs

104 lines
2.8 KiB
Rust
Raw Normal View History

use crate::error::{SkipStep, TopgradeError};
use anyhow::Result;
use crate::executor::{CommandExt, ExecutorOutput, RunType};
2018-12-15 21:52:21 +02:00
use crate::terminal::print_separator;
2020-06-28 08:33:40 +03:00
use crate::{
execution_context::ExecutionContext,
2020-08-21 23:04:36 +03:00
utils::{require, PathExt},
2020-06-28 08:33:40 +03:00
};
2018-07-07 02:18:19 +03:00
use directories::BaseDirs;
2020-06-28 08:33:40 +03:00
use log::debug;
2021-04-06 09:52:34 +03:00
use std::path::{Path, PathBuf};
use std::{
io::{self, Write},
process::Command,
};
2018-06-07 08:51:16 +03:00
2020-06-28 08:33:40 +03:00
const UPGRADE_VIM: &str = include_str!("upgrade.vim");
2020-08-21 23:04:36 +03:00
pub fn vimrc(base_dirs: &BaseDirs) -> Result<PathBuf> {
2018-07-07 09:18:53 +03:00
base_dirs
.home_dir()
.join(".vimrc")
2020-08-21 23:04:36 +03:00
.require()
.or_else(|_| base_dirs.home_dir().join(".vim/vimrc").require())
}
2020-08-21 23:04:36 +03:00
fn nvimrc(base_dirs: &BaseDirs) -> Result<PathBuf> {
2018-07-07 09:18:53 +03:00
#[cfg(unix)]
2020-09-06 18:44:03 +02:00
let base_dir =
// Bypass directories crate as nvim doesn't use the macOS-specific directories.
std::env::var_os("XDG_CONFIG_HOME").map_or_else(|| base_dirs.home_dir().join(".config"), PathBuf::from);
2018-07-07 09:18:53 +03:00
#[cfg(windows)]
2020-09-06 18:44:03 +02:00
let base_dir = base_dirs.cache_dir();
base_dir
.join("nvim/init.vim")
.require()
.or_else(|_| base_dir.join("nvim/init.lua").require())
}
2018-07-14 22:19:03 +03:00
2021-04-06 09:52:34 +03:00
fn upgrade(vim: &Path, vimrc: &Path, ctx: &ExecutionContext) -> Result<()> {
2020-06-28 08:33:40 +03:00
let mut tempfile = tempfile::NamedTempFile::new()?;
tempfile.write_all(UPGRADE_VIM.replace('\r', "").as_bytes())?;
2020-06-28 08:33:40 +03:00
debug!("Wrote vim script to {:?}", tempfile.path());
let output = ctx
.run_type()
2018-12-31 13:34:56 +02:00
.execute(&vim)
2021-09-04 20:01:19 +02:00
.arg("-u")
.arg(vimrc)
2021-09-04 20:01:19 +02:00
.args(["-U", "NONE", "-V1", "-nNesS"])
2020-06-28 08:33:40 +03:00
.arg(tempfile.path())
.output()?;
2018-07-14 22:19:03 +03:00
if let ExecutorOutput::Wet(output) = output {
let status = output.status;
2020-06-28 08:33:40 +03:00
if !status.success() || ctx.config().verbose() {
io::stdout().write(&output.stdout).ok();
io::stderr().write(&output.stderr).ok();
2020-06-28 08:33:40 +03:00
}
if !status.success() {
return Err(TopgradeError::ProcessFailed(status).into());
} else {
println!("Plugins upgraded")
}
}
2018-07-14 22:19:03 +03:00
Ok(())
}
2018-08-19 14:45:23 +03:00
2020-06-28 08:33:40 +03:00
pub fn upgrade_vim(base_dirs: &BaseDirs, ctx: &ExecutionContext) -> Result<()> {
2019-03-10 21:48:49 +02:00
let vim = require("vim")?;
let output = Command::new(&vim).arg("--version").check_output()?;
if !output.starts_with("VIM") {
2020-08-21 23:04:36 +03:00
return Err(SkipStep(String::from("vim binary might by actually nvim")).into());
}
2021-09-02 07:27:09 +03:00
let vimrc = vimrc(base_dirs)?;
2018-08-19 14:45:23 +03:00
2020-06-28 08:33:40 +03:00
print_separator("Vim");
upgrade(&vim, &vimrc, ctx)
2018-08-19 14:45:23 +03:00
}
2020-06-28 08:33:40 +03:00
pub fn upgrade_neovim(base_dirs: &BaseDirs, ctx: &ExecutionContext) -> Result<()> {
2019-03-10 21:48:49 +02:00
let nvim = require("nvim")?;
2021-09-02 07:27:09 +03:00
let nvimrc = nvimrc(base_dirs)?;
2018-08-19 14:45:23 +03:00
2020-06-28 08:33:40 +03:00
print_separator("Neovim");
upgrade(&nvim, &nvimrc, ctx)
2018-08-19 14:45:23 +03:00
}
pub fn run_voom(_base_dirs: &BaseDirs, run_type: RunType) -> Result<()> {
let voom = require("voom")?;
print_separator("voom");
run_type.execute(voom).arg("update").check_run()
}