Files
topgrade/src/steps/emacs.rs

104 lines
2.8 KiB
Rust
Raw Normal View History

#[cfg(any(windows))]
use std::env;
2019-12-26 22:30:09 +02:00
use std::path::{Path, PathBuf};
2022-11-11 09:39:29 -05:00
use color_eyre::eyre::Result;
use etcetera::base_strategy::BaseStrategy;
use crate::command::CommandExt;
use crate::execution_context::ExecutionContext;
use crate::terminal::print_separator;
use crate::utils::{require, require_option, PathExt};
use crate::Step;
const EMACS_UPGRADE: &str = include_str!("emacs.el");
2019-12-26 22:30:09 +02:00
#[cfg(windows)]
2020-03-23 06:09:16 +02:00
const DOOM_PATH: &str = "bin/doom.cmd";
2019-12-26 22:30:09 +02:00
#[cfg(unix)]
2020-03-23 06:09:16 +02:00
const DOOM_PATH: &str = "bin/doom";
pub struct Emacs {
directory: Option<PathBuf>,
2020-01-29 21:31:14 +02:00
doom: Option<PathBuf>,
}
impl Emacs {
fn directory_path() -> Option<PathBuf> {
#[cfg(unix)]
return {
let emacs_xdg_dir = crate::XDG_DIRS.config_dir().join("emacs").if_exists();
crate::HOME_DIR.join(".emacs.d").if_exists().or(emacs_xdg_dir)
};
#[cfg(windows)]
return env::var("HOME")
.ok()
.and_then(|home| {
PathBuf::from(&home)
.join(".emacs.d")
.if_exists()
.or_else(|| PathBuf::from(&home).join(".config\\emacs").if_exists())
})
.or_else(|| crate::WINDOWS_DIRS.data_dir().join(".emacs.d").if_exists());
}
pub fn new() -> Self {
let directory = Emacs::directory_path();
2020-03-23 06:09:16 +02:00
let doom = directory.as_ref().and_then(|d| d.join(DOOM_PATH).if_exists());
2020-01-29 21:31:14 +02:00
Self { directory, doom }
}
pub fn is_doom(&self) -> bool {
self.doom.is_some()
}
pub fn directory(&self) -> Option<&PathBuf> {
self.directory.as_ref()
}
fn update_doom(doom: &Path, ctx: &ExecutionContext) -> Result<()> {
2019-12-26 22:30:09 +02:00
print_separator("Doom Emacs");
let mut command = ctx.run_type().execute(doom);
if ctx.config().yes(Step::Emacs) {
command.arg("--force");
}
command.args(["upgrade"]);
command.status_checked()
2019-12-26 22:30:09 +02:00
}
pub fn upgrade(&self, ctx: &ExecutionContext) -> Result<()> {
let emacs = require("emacs")?;
if let Some(doom) = &self.doom {
Emacs::update_doom(doom, ctx)?;
}
2020-08-21 23:04:36 +03:00
let init_file = require_option(self.directory.as_ref(), String::from("Emacs directory does not exist"))?
.join("init.el")
.require()?;
2019-12-26 22:30:09 +02:00
print_separator("Emacs");
let mut command = ctx.run_type().execute(emacs);
2019-11-18 21:56:57 +02:00
command
.args(["--batch", "--debug-init", "-l"])
.arg(init_file)
2019-11-18 21:56:57 +02:00
.arg("--eval");
#[cfg(unix)]
command.arg(
EMACS_UPGRADE
.chars()
.map(|c| if c.is_whitespace() { '\u{00a0}' } else { c })
2019-11-18 22:25:29 +02:00
.collect::<String>(),
2019-11-18 21:56:57 +02:00
);
#[cfg(not(unix))]
command.arg(EMACS_UPGRADE);
command.status_checked()
}
}