summaryrefslogtreecommitdiffstats
path: root/src/path.rs
diff options
context:
space:
mode:
authorRory Dudley2024-03-28 23:26:02 -0600
committerRory Dudley2024-03-28 23:26:02 -0600
commit491d3fbff384d4b04483b54e5bb78d23bb1181c5 (patch)
tree470b0fc2ab0a476d682e104bdb03275ffd6b8671 /src/path.rs
parent14a74aea0f02da53e0f61c572da2c5244ed80551 (diff)
downloaddwarvish-491d3fbff384d4b04483b54e5bb78d23bb1181c5.tar.gz
Remove hard-coded PATH
Use $PATH, instead of a hard-coded PATH from main(). This means that there is no longer a need to pass around PATH to repl()/recite()/path::refresh(), since path::refresh() can call env::var directly. Since the hard-coded paths were removed, there needs to be some way to define $PATH. When running the debug build, dwvsh will look in 'dist/etc/dwvshrc' for the initial environment setup. For the release target, dwvsh will look in '/etc/dwvshrc'. After the global rc file is sourced, dwvsh will try to source ~/.dwvshrc if it exists, so users can extend their environment without root access (assuming a release install).
Notes
Notes: Throughout a lot of this program, we're calling `env!("HOME")`, in order to get the user's home directory. Technically, this is not correct. The env!() macro resolves environment variables during compile time, while env::var() gets environment variables for the running process (i.e. the shell). See https://users.rust-lang.org/t/env-vs-env-var/88119 for more info. In the near future, this will need to be addressed. Might be worth looking into what other shells do, though one idea I had was to invoke '/usr/bin/id', grab the user's ID, and use it to grab the rest of the info from /etc/passwd. This would be handled in an /etc/dwvlogin or /etc/dwvprofile most likely.
Diffstat (limited to 'src/path.rs')
-rw-r--r--src/path.rs30
1 files changed, 18 insertions, 12 deletions
diff --git a/src/path.rs b/src/path.rs
index 2953982..f201f53 100644
--- a/src/path.rs
+++ b/src/path.rs
@@ -1,37 +1,43 @@
+use std::env;
use std::fs;
-use std::path::Path;
/// Refresh the shell's $PATH
///
/// This function caches all valid paths within within the directories
/// specified.
///
-/// # Arguments
-/// * `path` - A reference to a vector that holds a list to the shell $PATHs
-///
/// # Returns
/// * `bins: Vec<String>` - A new cache of all valid file paths in $PATH
///
/// # Examples
/// ```
-/// let path = vec!["/bin"];
-/// let path = path.into_iter().map(Path::new).collect();
-/// let mut bins = path::refresh(&path);
+/// let mut bins = path::refresh();
/// ...
/// // A situation occurs where the $PATH needs to be refreshed
-/// bins = path::refresh(&path)
+/// bins = path::refresh()
/// ```
-pub fn refresh(path: &Vec<&Path>) -> Vec<String> {
- let mut bins: Vec<String> = Vec::new();
+pub fn refresh() -> Vec<String> {
+ let mut bins = Vec::new();
+ let path = env::var("PATH").unwrap_or(String::new());
+ let mut path = path.split(':');
+
+ loop {
+ let p = match path.next() {
+ Some(p) => p,
+ None => break,
+ };
- for p in path {
let files = match fs::read_dir(p) {
Ok(files) => files,
Err(_) => continue,
};
for file in files {
- bins.push(file.unwrap().path().display().to_string());
+ let f = match file {
+ Ok(f) => f,
+ Err(_) => continue,
+ };
+ bins.push(f.path().display().to_string());
}
}