Skip to content

Commit 0cb91c6

Browse files
return error if ~ followed by not / or not user name or failed to determine home dir or user name
1 parent 63f96b3 commit 0cb91c6

File tree

2 files changed

+27
-15
lines changed

2 files changed

+27
-15
lines changed

src/lib.rs

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -215,23 +215,37 @@ pub fn glob_with(pattern: &str, options: MatchOptions) -> Result<Paths, PatternE
215215
// make sure that the pattern is valid first, else early return with error
216216
let _ = Pattern::new(pattern)?;
217217
let mut new_pattern = pattern.to_owned();
218-
if options.glob_tilde_expansion {
219-
let home_dir = get_home_dir();
220-
if pattern == "~" || pattern.starts_with("~/") {
221-
if let Some(home) = home_dir {
222-
new_pattern = pattern.replacen("~", &home, 1);
218+
if options.glob_tilde_expansion && pattern.starts_with("~") {
219+
let mut home_dir = match get_home_dir() {
220+
Some(v) => v,
221+
None => {
222+
return Err(PatternError {
223+
pos: 0,
224+
msg: "Failed to determine home directory.",
225+
})
223226
}
224-
} else if pattern.starts_with("~") {
227+
};
228+
if pattern == "~" || pattern.starts_with("~/") {
229+
new_pattern = pattern.replacen("~", &home_dir, 1);
230+
} else {
225231
if let Some(user) = get_user_name() {
226232
match pattern.strip_prefix("~").unwrap().strip_prefix(&user) {
227233
Some(v) if v.starts_with("/") || v.is_empty() => {
228-
if let Some(mut p) = home_dir {
229-
p.push_str(v);
230-
new_pattern = p;
231-
}
234+
home_dir.push_str(v);
235+
new_pattern = home_dir;
236+
}
237+
_ => {
238+
return Err(PatternError {
239+
pos: 1,
240+
msg: "'~' not followed by user name.",
241+
})
232242
}
233-
_ => {}
234243
};
244+
} else {
245+
return Err(PatternError {
246+
pos: 1,
247+
msg: "Failed to determine user name.",
248+
});
235249
}
236250
}
237251
}

src/utils.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ pub(crate) fn get_home_dir() -> Option<String> {
77
// This function is required when `glob_tilde_expansion` field of `glob::MatchOptions` is
88
// set `true` and pattern starts with `~` followed by any char expect `/`
99
pub(crate) fn get_user_name() -> Option<String> {
10-
#[cfg(not(target_os = "windows"))]
11-
return std::env::var("USER").ok();
12-
#[cfg(target_os = "windows")]
13-
std::env::var("USERNAME").ok()
10+
let varname = if cfg!(windows) { "USERNAME" } else { "USER" };
11+
std::env::var(varname).ok()
1412
}

0 commit comments

Comments
 (0)