melib: add ShellExpandTrait
Add trait to expand "~" and environment variables in paths.embed
parent
0ece51612f
commit
9d69a06807
|
@ -27,6 +27,7 @@ use crate::backends::*;
|
||||||
use crate::email::parser;
|
use crate::email::parser;
|
||||||
use crate::email::{Envelope, Flag};
|
use crate::email::{Envelope, Flag};
|
||||||
use crate::error::{MeliError, Result};
|
use crate::error::{MeliError, Result};
|
||||||
|
use crate::shellexpand::ShellExpandTrait;
|
||||||
|
|
||||||
use memmap::{Mmap, Protection};
|
use memmap::{Mmap, Protection};
|
||||||
use std::collections::hash_map::DefaultHasher;
|
use std::collections::hash_map::DefaultHasher;
|
||||||
|
@ -208,6 +209,7 @@ impl MaildirFolder {
|
||||||
* mailboxes in user configuration */
|
* mailboxes in user configuration */
|
||||||
let fname = if let Ok(fname) = pathbuf.strip_prefix(
|
let fname = if let Ok(fname) = pathbuf.strip_prefix(
|
||||||
PathBuf::from(&settings.root_folder)
|
PathBuf::from(&settings.root_folder)
|
||||||
|
.expand()
|
||||||
.parent()
|
.parent()
|
||||||
.unwrap_or_else(|| &Path::new("/")),
|
.unwrap_or_else(|| &Path::new("/")),
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -28,6 +28,7 @@ use crate::async_workers::*;
|
||||||
use crate::conf::AccountSettings;
|
use crate::conf::AccountSettings;
|
||||||
use crate::email::{Envelope, EnvelopeHash, Flag};
|
use crate::email::{Envelope, EnvelopeHash, Flag};
|
||||||
use crate::error::{MeliError, Result};
|
use crate::error::{MeliError, Result};
|
||||||
|
use crate::shellexpand::ShellExpandTrait;
|
||||||
|
|
||||||
extern crate notify;
|
extern crate notify;
|
||||||
use self::notify::{watcher, DebouncedEvent, RecursiveMode, Watcher};
|
use self::notify::{watcher, DebouncedEvent, RecursiveMode, Watcher};
|
||||||
|
@ -583,7 +584,7 @@ impl MaildirType {
|
||||||
}
|
}
|
||||||
children
|
children
|
||||||
};
|
};
|
||||||
let root_path = PathBuf::from(settings.root_folder());
|
let root_path = PathBuf::from(settings.root_folder()).expand();
|
||||||
if !root_path.exists() {
|
if !root_path.exists() {
|
||||||
eprintln!(
|
eprintln!(
|
||||||
"Configuration error ({}): root_path `{}` is not a valid directory.",
|
"Configuration error ({}): root_path `{}` is not a valid directory.",
|
||||||
|
@ -651,7 +652,7 @@ impl MaildirType {
|
||||||
name: settings.name().to_string(),
|
name: settings.name().to_string(),
|
||||||
folders,
|
folders,
|
||||||
hash_indexes,
|
hash_indexes,
|
||||||
path: PathBuf::from(settings.root_folder()),
|
path: root_path,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn owned_folder_idx(&self, folder: &Folder) -> FolderHash {
|
fn owned_folder_idx(&self, folder: &Folder) -> FolderHash {
|
||||||
|
|
|
@ -33,6 +33,7 @@ use crate::conf::AccountSettings;
|
||||||
use crate::email::parser::BytesExt;
|
use crate::email::parser::BytesExt;
|
||||||
use crate::email::*;
|
use crate::email::*;
|
||||||
use crate::error::{MeliError, Result};
|
use crate::error::{MeliError, Result};
|
||||||
|
use crate::shellexpand::ShellExpandTrait;
|
||||||
use fnv::FnvHashMap;
|
use fnv::FnvHashMap;
|
||||||
use libc;
|
use libc;
|
||||||
use memmap::{Mmap, Protection};
|
use memmap::{Mmap, Protection};
|
||||||
|
@ -548,7 +549,7 @@ impl MailBackend for MboxType {
|
||||||
|
|
||||||
impl MboxType {
|
impl MboxType {
|
||||||
pub fn new(s: &AccountSettings, _is_subscribed: Box<dyn Fn(&str) -> bool>) -> Self {
|
pub fn new(s: &AccountSettings, _is_subscribed: Box<dyn Fn(&str) -> bool>) -> Self {
|
||||||
let path = Path::new(s.root_folder.as_str());
|
let path = Path::new(s.root_folder.as_str()).expand();
|
||||||
if !path.exists() {
|
if !path.exists() {
|
||||||
panic!(
|
panic!(
|
||||||
"\"root_folder\" {} for account {} is not a valid path.",
|
"\"root_folder\" {} for account {} is not a valid path.",
|
||||||
|
@ -557,7 +558,7 @@ impl MboxType {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
let ret = MboxType {
|
let ret = MboxType {
|
||||||
path: PathBuf::from(path),
|
path,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
let name: String = ret
|
let name: String = ret
|
||||||
|
@ -565,12 +566,12 @@ impl MboxType {
|
||||||
.file_name()
|
.file_name()
|
||||||
.map(|f| f.to_string_lossy().into())
|
.map(|f| f.to_string_lossy().into())
|
||||||
.unwrap_or(String::new());
|
.unwrap_or(String::new());
|
||||||
let hash = get_path_hash!(path);
|
let hash = get_path_hash!(&ret.path);
|
||||||
ret.folders.lock().unwrap().insert(
|
ret.folders.lock().unwrap().insert(
|
||||||
hash,
|
hash,
|
||||||
MboxFolder {
|
MboxFolder {
|
||||||
hash,
|
hash,
|
||||||
path: PathBuf::from(path),
|
path: ret.path.clone(),
|
||||||
name,
|
name,
|
||||||
content: Vec::new(),
|
content: Vec::new(),
|
||||||
children: Vec::new(),
|
children: Vec::new(),
|
||||||
|
|
|
@ -128,3 +128,47 @@ pub use crate::email::{Envelope, Flag};
|
||||||
pub use crate::error::{MeliError, Result};
|
pub use crate::error::{MeliError, Result};
|
||||||
|
|
||||||
pub use crate::addressbook::*;
|
pub use crate::addressbook::*;
|
||||||
|
|
||||||
|
pub use shellexpand::ShellExpandTrait;
|
||||||
|
pub mod shellexpand {
|
||||||
|
|
||||||
|
use std::path::*;
|
||||||
|
|
||||||
|
pub trait ShellExpandTrait {
|
||||||
|
fn expand(&self) -> PathBuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ShellExpandTrait for Path {
|
||||||
|
fn expand(&self) -> PathBuf {
|
||||||
|
let mut ret = PathBuf::new();
|
||||||
|
for c in self.components() {
|
||||||
|
let c_to_str = c.as_os_str().to_str();
|
||||||
|
match c_to_str {
|
||||||
|
Some("~") => {
|
||||||
|
if let Some(home_dir) = std::env::var("HOME").ok() {
|
||||||
|
ret.push(home_dir)
|
||||||
|
} else {
|
||||||
|
return PathBuf::new();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Some(var) if var.starts_with("$") => {
|
||||||
|
let env_name = var.split_at(1).1;
|
||||||
|
if env_name.chars().all(char::is_uppercase) {
|
||||||
|
ret.push(std::env::var(env_name).unwrap_or(String::new()));
|
||||||
|
} else {
|
||||||
|
ret.push(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Some(_) => {
|
||||||
|
ret.push(c);
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
/* path is invalid */
|
||||||
|
return PathBuf::new();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue