From ffd8f17a94e60dc7fffea0a1ef5efccc693c5cd9 Mon Sep 17 00:00:00 2001 From: a-kenji Date: Thu, 6 May 2021 21:38:10 +0200 Subject: [PATCH] Add Complile Time System Directories closes #380 * --features disable_automatic_asset_installation disables automatic installation of the `data_dir` * a set PREFIX env will use `$PREFIX/zellij` as its `data_dir` --- Cargo.toml | 3 +++ src/common/setup.rs | 27 +++++++++++++++++++++++---- src/common/utils/consts.rs | 10 +++++++++- src/server/mod.rs | 10 +++++----- 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index f59b1e8b3..59a2865f9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -78,3 +78,6 @@ assets = [ ["assets/completions/zellij.fish", "usr/share/fish/vendor_completions.d/zellij.fish", "644"], ["assets/completions/_zellij", "usr/share/zsh/vendor-completions/_zellij", "644"], ] + +[features] +enable_automatic_asset_installation = [] diff --git a/src/common/setup.rs b/src/common/setup.rs index edfa858ad..bcda45896 100644 --- a/src/common/setup.rs +++ b/src/common/setup.rs @@ -1,6 +1,8 @@ -use crate::common::utils::consts::{SYSTEM_DEFAULT_CONFIG_DIR, VERSION}; +use crate::common::utils::consts::{ + SYSTEM_DEFAULT_CONFIG_DIR, SYSTEM_DEFAULT_DATA_DIR_PREFIX, VERSION, ZELLIJ_PROJ_DIR, +}; use crate::os_input_output::set_permissions; -use directories_next::{BaseDirs, ProjectDirs}; +use directories_next::BaseDirs; use std::io::Write; use std::{fs, path::Path, path::PathBuf}; @@ -51,6 +53,8 @@ pub mod install { } #[cfg(not(test))] +/// Goes through a predefined list and checks for an already +/// existing config directory, returns the first match pub fn find_default_config_dir() -> Option { vec![ Some(xdg_config_dir()), @@ -68,9 +72,24 @@ pub fn find_default_config_dir() -> Option { None } +/// Looks for an existing dir, uses that, else returns a +/// dir matching the config spec. +pub fn get_default_data_dir() -> PathBuf { + vec![ + xdg_data_dir(), + Path::new(SYSTEM_DEFAULT_DATA_DIR_PREFIX).join("share/zellij"), + ] + .into_iter() + .find(|p| p.exists()) + .unwrap_or_else(xdg_data_dir) +} + pub fn xdg_config_dir() -> PathBuf { - let project_dirs = ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap(); - project_dirs.config_dir().to_owned() + ZELLIJ_PROJ_DIR.config_dir().to_owned() +} + +pub fn xdg_data_dir() -> PathBuf { + ZELLIJ_PROJ_DIR.data_dir().to_owned() } pub fn home_config_dir() -> Option { diff --git a/src/common/utils/consts.rs b/src/common/utils/consts.rs index a46f8243c..29870d97d 100644 --- a/src/common/utils/consts.rs +++ b/src/common/utils/consts.rs @@ -11,8 +11,16 @@ pub const ZELLIJ_CONFIG_FILE_ENV: &str = "ZELLIJ_CONFIG_FILE"; pub const ZELLIJ_CONFIG_DIR_ENV: &str = "ZELLIJ_CONFIG_DIR"; pub const VERSION: &str = env!("CARGO_PKG_VERSION"); -// TODO: ${PREFIX} argument in makefile pub const SYSTEM_DEFAULT_CONFIG_DIR: &str = "/etc/zellij"; +pub const SYSTEM_DEFAULT_DATA_DIR_PREFIX: &str = system_default_data_dir(); + +const fn system_default_data_dir() -> &'static str { + if let Some(data_dir) = std::option_env!("PREFIX") { + data_dir + } else { + &"/usr" + } +} lazy_static! { static ref UID: Uid = Uid::current(); diff --git a/src/server/mod.rs b/src/server/mod.rs index 6eb2455b2..1f991c297 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -22,8 +22,8 @@ use crate::common::{ os_input_output::{set_permissions, ServerOsApi}, pty_bus::{PtyBus, PtyInstruction}, screen::{Screen, ScreenInstruction}, - setup::install::populate_data_dir, - utils::consts::{ZELLIJ_IPC_PIPE, ZELLIJ_PROJ_DIR}, + setup::{get_default_data_dir, install::populate_data_dir}, + utils::consts::ZELLIJ_IPC_PIPE, wasm_vm::{wasi_read_string, wasi_write_object, zellij_exports, PluginEnv, PluginInstruction}, ChannelWithContext, SenderType, SenderWithContext, }; @@ -209,9 +209,9 @@ fn init_session( let send_pty_instructions = SenderWithContext::new(SenderType::Sender(send_pty_instructions)); // Determine and initialize the data directory - let data_dir = opts - .data_dir - .unwrap_or_else(|| ZELLIJ_PROJ_DIR.data_dir().to_path_buf()); + let data_dir = opts.data_dir.unwrap_or_else(get_default_data_dir); + + #[cfg(enable_automatic_assets_installation)] populate_data_dir(&data_dir); // Don't use default layouts in tests, but do everywhere else