summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authora-kenji <aks.kenji@protonmail.com>2021-05-06 21:38:10 +0200
committera-kenji <aks.kenji@protonmail.com>2021-05-12 19:51:29 +0200
commitffd8f17a94e60dc7fffea0a1ef5efccc693c5cd9 (patch)
tree62da299a597d95b7ba12272c3df4bc3ec7fc7ecd
parentd5433f8f8995c155f231c823d49813882b6212bf (diff)
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`
-rw-r--r--Cargo.toml3
-rw-r--r--src/common/setup.rs27
-rw-r--r--src/common/utils/consts.rs10
-rw-r--r--src/server/mod.rs10
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<PathBuf> {
vec![
Some(xdg_config_dir()),
@@ -68,9 +72,24 @@ pub fn find_default_config_dir() -> Option<PathBuf> {
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<PathBuf> {
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