implement tilde expansion for ~user and ~uid using nix User lookups
This commit is contained in:
@@ -4,6 +4,7 @@ use std::str::{Chars, FromStr};
|
|||||||
|
|
||||||
use ariadne::Fmt;
|
use ariadne::Fmt;
|
||||||
use glob::Pattern;
|
use glob::Pattern;
|
||||||
|
use nix::unistd::{Uid, User};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
|
|
||||||
use crate::libsh::error::{ShErr, ShErrKind, ShResult, ShResultExt, next_color};
|
use crate::libsh::error::{ShErr, ShErrKind, ShResult, ShResultExt, next_color};
|
||||||
@@ -473,7 +474,26 @@ pub fn expand_raw(chars: &mut Peekable<Chars<'_>>) -> ShResult<String> {
|
|||||||
while let Some(ch) = chars.next() {
|
while let Some(ch) = chars.next() {
|
||||||
match ch {
|
match ch {
|
||||||
markers::TILDE_SUB => {
|
markers::TILDE_SUB => {
|
||||||
let home = env::var("HOME").unwrap_or_default();
|
let mut username = String::new();
|
||||||
|
while chars.peek().is_some_and(|ch| *ch != '/') {
|
||||||
|
let ch = chars.next().unwrap();
|
||||||
|
username.push(ch);
|
||||||
|
}
|
||||||
|
let home = if username.is_empty() {
|
||||||
|
env::var("HOME").unwrap_or_default()
|
||||||
|
}
|
||||||
|
else if let Ok(result) = User::from_name(&username)
|
||||||
|
&& let Some(user) = result {
|
||||||
|
user.dir.to_string_lossy().to_string()
|
||||||
|
}
|
||||||
|
else if let Ok(id) = username.parse::<u32>()
|
||||||
|
&& let Ok(result) = User::from_uid(Uid::from_raw(id))
|
||||||
|
&& let Some(user) = result {
|
||||||
|
user.dir.to_string_lossy().to_string()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
format!("~{username}")
|
||||||
|
};
|
||||||
result.push_str(&home);
|
result.push_str(&home);
|
||||||
}
|
}
|
||||||
markers::PROC_SUB_OUT => {
|
markers::PROC_SUB_OUT => {
|
||||||
|
|||||||
Reference in New Issue
Block a user