mirror of
https://github.com/facebook/sapling.git
synced 2024-10-09 16:31:02 +03:00
cli: add get_config to EdenFsInstance
Summary: You can use `instance.get_config()` to get access to global EdenFS configurations Reviewed By: chadaustin Differential Revision: D26407350 fbshipit-source-id: 022cc59fd86b2711c15cfd781872465c6ada9081
This commit is contained in:
parent
1ae53c794f
commit
18b79205c8
@ -14,6 +14,7 @@ use std::time::Duration;
|
||||
use anyhow::{anyhow, Context, Result};
|
||||
use tokio::net::UnixStream;
|
||||
|
||||
use edenfs_config::EdenFsConfig;
|
||||
use fb303_core::types::fb303_status;
|
||||
use fbthrift_socket::SocketTransport;
|
||||
use thrift_types::edenfs::{client::EdenService, types::DaemonInfo};
|
||||
@ -26,11 +27,11 @@ use crate::EdenFsClient;
|
||||
pub struct EdenFsInstance {
|
||||
config_dir: PathBuf,
|
||||
etc_eden_dir: PathBuf,
|
||||
home_dir: PathBuf,
|
||||
home_dir: Option<PathBuf>,
|
||||
}
|
||||
|
||||
impl EdenFsInstance {
|
||||
pub fn new(config_dir: PathBuf, etc_eden_dir: PathBuf, home_dir: PathBuf) -> Self {
|
||||
pub fn new(config_dir: PathBuf, etc_eden_dir: PathBuf, home_dir: Option<PathBuf>) -> Self {
|
||||
Self {
|
||||
config_dir,
|
||||
etc_eden_dir,
|
||||
@ -38,6 +39,13 @@ impl EdenFsInstance {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_config(&self) -> Result<EdenFsConfig> {
|
||||
edenfs_config::load_config(
|
||||
&self.etc_eden_dir,
|
||||
self.home_dir.as_ref().map(|x| x.as_ref()),
|
||||
)
|
||||
}
|
||||
|
||||
async fn _connect(&self, socket_path: &PathBuf) -> Result<EdenFsClient> {
|
||||
let stream = UnixStream::connect(&socket_path)
|
||||
.await
|
||||
|
@ -18,16 +18,18 @@ use util::path::expand_path;
|
||||
mod pid;
|
||||
mod status;
|
||||
|
||||
#[cfg(unix)]
|
||||
const DEFAULT_CONFIG_DIR: &str = "~/local/.eden";
|
||||
#[cfg(unix)]
|
||||
const DEFAULT_ETC_EDEN_DIR: &str = "/etc/eden";
|
||||
const DEFAULT_HOME_DIR: &str = "~";
|
||||
|
||||
#[cfg(windows)]
|
||||
const DEFAULT_CONFIG_DIR: &str = "~/.eden";
|
||||
#[cfg(windows)]
|
||||
const DEFAULT_ETC_EDEN_DIR: &str = "C:\\ProgramData\\facebook\\eden";
|
||||
|
||||
type ExitCode = i32;
|
||||
|
||||
fn expand_default(default: &'static str) -> impl Fn() -> PathBuf {
|
||||
move || expand_path(default)
|
||||
}
|
||||
|
||||
#[derive(StructOpt, Debug)]
|
||||
#[structopt(
|
||||
name = "edenfsctl",
|
||||
@ -65,17 +67,35 @@ pub enum SubCommand {
|
||||
}
|
||||
|
||||
impl Command {
|
||||
fn get_etc_eden_dir(&self) -> PathBuf {
|
||||
if let Some(etc_eden_dir) = &self.etc_eden_dir {
|
||||
etc_eden_dir.clone()
|
||||
} else {
|
||||
DEFAULT_ETC_EDEN_DIR.into()
|
||||
}
|
||||
}
|
||||
|
||||
fn get_config_dir(&self) -> PathBuf {
|
||||
if let Some(config_dir) = &self.config_dir {
|
||||
config_dir.clone()
|
||||
} else {
|
||||
expand_path(DEFAULT_CONFIG_DIR)
|
||||
}
|
||||
}
|
||||
|
||||
fn get_home_dir(&self) -> Option<PathBuf> {
|
||||
if let Some(home_dir) = &self.home_dir {
|
||||
Some(home_dir.clone())
|
||||
} else {
|
||||
dirs::home_dir()
|
||||
}
|
||||
}
|
||||
|
||||
fn get_instance(&self) -> EdenFsInstance {
|
||||
EdenFsInstance::new(
|
||||
self.config_dir
|
||||
.clone()
|
||||
.unwrap_or_else(expand_default(DEFAULT_CONFIG_DIR)),
|
||||
self.etc_eden_dir
|
||||
.clone()
|
||||
.unwrap_or_else(expand_default(DEFAULT_ETC_EDEN_DIR)),
|
||||
self.home_dir
|
||||
.clone()
|
||||
.unwrap_or_else(expand_default(DEFAULT_HOME_DIR)),
|
||||
self.get_config_dir(),
|
||||
self.get_etc_eden_dir(),
|
||||
self.get_home_dir(),
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -20,14 +20,10 @@ pub struct Core {
|
||||
|
||||
#[derive(Deserialize, StackConfig, Debug)]
|
||||
pub struct EdenFsConfig {
|
||||
#[stack(nested)]
|
||||
core: Core,
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
const ETC_EDENFS_DIR: &str = "C:\\ProgramData\\facebook\\eden";
|
||||
#[cfg(unix)]
|
||||
const ETC_EDENFS_DIR: &str = "/etc/eden";
|
||||
|
||||
fn load_path(loader: &mut EdenFsConfigLoader, path: &Path) -> Result<()> {
|
||||
let content = String::from_utf8(std::fs::read(&path)?)?;
|
||||
loader.load(toml::from_str(&content)?);
|
||||
@ -84,21 +80,29 @@ fn load_user(loader: &mut EdenFsConfigLoader, home_dir: &Path) -> Result<()> {
|
||||
load_path(loader, &home_rc)
|
||||
}
|
||||
|
||||
pub fn load_config(etc_eden_dir: Option<&Path>, home_dir: Option<&Path>) -> Result<EdenFsConfig> {
|
||||
pub fn load_config(etc_eden_dir: &Path, home_dir: Option<&Path>) -> Result<EdenFsConfig> {
|
||||
let mut loader = EdenFsConfig::loader();
|
||||
let etc_eden_dir = if let Some(dir) = etc_eden_dir.as_ref() {
|
||||
dir.as_ref()
|
||||
} else {
|
||||
ETC_EDENFS_DIR.as_ref()
|
||||
};
|
||||
|
||||
load_system(&mut loader, &etc_eden_dir)?;
|
||||
load_system_rcs(&mut loader, &etc_eden_dir)?;
|
||||
if let Err(e) = load_system(&mut loader, &etc_eden_dir) {
|
||||
event!(
|
||||
Level::INFO,
|
||||
etc_eden_dir = ?etc_eden_dir,
|
||||
"Unable to load system configuration, skipped: {:?}",
|
||||
e
|
||||
);
|
||||
}
|
||||
|
||||
if let Some(dir) = home_dir.as_ref() {
|
||||
load_user(&mut loader, &dir)?;
|
||||
} else if let Some(dir) = dirs::home_dir() {
|
||||
load_user(&mut loader, &dir)?;
|
||||
if let Err(e) = load_system_rcs(&mut loader, &etc_eden_dir) {
|
||||
event!(
|
||||
Level::INFO,
|
||||
etc_eden_dir = ?etc_eden_dir,
|
||||
"Unable to load system RC configurations, skipped: {:?}",
|
||||
e
|
||||
);
|
||||
}
|
||||
|
||||
if let Some(home) = home_dir {
|
||||
load_user(&mut loader, &home)?;
|
||||
} else {
|
||||
event!(
|
||||
Level::INFO,
|
||||
|
Loading…
Reference in New Issue
Block a user