### Hide Paths
-Dufs supports hiding paths from directory listings via option `--hidden`.
+Dufs supports hiding paths from directory listings via option `--hidden <glob>,...`.
```
dufs --hidden .git,.DS_Store,tmp
```
-`--hidden` also supports a variant glob:
-
-- `?` matches any single character
-- `*` matches any (possibly empty) sequence of characters
-- `**`, `[..]`, `[!..]` is not supported
+> The glob used in --hidden only matches file and directory names, not paths. So `--hidden dir1/file` is invalid.
```sh
-dufs --hidden '.*'
-dufs --hidden '*.log,*.lock'
+dufs --hidden '.*' # hidden dotfiles
+dufs --hidden '*/' # hidden all folders
+dufs --hidden '*.log,*.lock' # hidden by exts
```
### Log Format
.ok_or_else(|| anyhow!("Failed to get file name of `{}`", path.display()))
}
-pub fn glob(source: &str, target: &str) -> bool {
- let ss: Vec<char> = source.chars().collect();
- let mut iter = target.chars();
- let mut i = 0;
- 'outer: while i < ss.len() {
- let s = ss[i];
- match s {
- '*' => match ss.get(i + 1) {
- Some(s_next) => {
- for t in iter.by_ref() {
- if t == *s_next {
- i += 2;
- continue 'outer;
- }
- }
- return false;
- }
- None => return true,
- },
- '?' => match iter.next() {
- Some(_) => {
- i += 1;
- continue;
- }
- None => return false,
- },
- _ => match iter.next() {
- Some(t) => {
- if s == t {
- i += 1;
- continue;
- }
- return false;
- }
- None => return false,
- },
- }
- }
- iter.next().is_none()
+pub fn glob(pattern: &str, target: &str) -> bool {
+ let pat = match ::glob::Pattern::new(pattern) {
+ Ok(pat) => pat,
+ Err(_) => return false,
+ };
+ pat.matches(target)
}
#[test]
assert!(!glob("abc", "abcd"));
assert!(!glob("a?c", "abbc"));
assert!(!glob("*.log", "log"));
+ assert!(glob("*.abc-cba", "xyz.abc-cba"));
+ assert!(glob("*.abc-cba", "123.xyz.abc-cba"));
assert!(glob("*.log", ".log"));
assert!(glob("*.log", "a.log"));
+ assert!(glob("*/", "abc/"));
+ assert!(!glob("*/", "abc"));
}