chj_rustbin/io/
excludes.rs

1/// General basis for filesystem path exclusion logic.
2use std::{
3    collections::HashSet,
4    ffi::{OsStr, OsString},
5    os::unix::prelude::OsStrExt,
6};
7
8#[derive(Debug)]
9pub struct Excludes {
10    pub exclude_dot_files: bool,
11    pub exclude_emacs_backups: bool,
12    pub files: HashSet<OsString>,
13    pub dirs: HashSet<OsString>,
14}
15
16impl Excludes {
17    pub fn filename_is_excluded(
18        &self,
19        file_name: &OsStr,
20        is_dir: bool,
21    ) -> bool {
22        (self.exclude_dot_files && filename_is_dot(&file_name))
23            || (self.exclude_emacs_backups
24                && filename_is_emacs_backup(&file_name))
25            || (if is_dir { &self.dirs } else { &self.files })
26                .contains(file_name)
27    }
28}
29
30pub fn hashset_from(strs: &[&str]) -> HashSet<OsString> {
31    let mut h: HashSet<OsString> = HashSet::new();
32    for s in strs {
33        h.insert(OsString::from(s));
34    }
35    h
36}
37
38/// If `all` is true, does not ignore exclude dot and emacs backup files.
39pub fn default_excludes(all: bool) -> Excludes {
40    Excludes {
41        exclude_dot_files: !all,
42        exclude_emacs_backups: !all,
43        files: hashset_from(&["HEUTE", "CALENDAR"]),
44        dirs: hashset_from(&[".git", ".METADATA-v2"]),
45    }
46}
47
48/// If `all` is true, does not ignore exclude dot and emacs backup files.
49pub fn empty_excludes(all: bool) -> Excludes {
50    Excludes {
51        exclude_dot_files: !all,
52        exclude_emacs_backups: !all,
53        files: HashSet::new(),
54        dirs: HashSet::new(),
55    }
56}
57
58pub fn filename_is_dot(filename: &OsStr) -> bool {
59    let bs = filename.as_bytes();
60    let len = bs.len();
61    len >= 1 && (bs[0] == b'.')
62}
63
64pub fn filename_is_emacs_backup(filename: &OsStr) -> bool {
65    let bs = filename.as_bytes();
66    let len = bs.len();
67    len >= 2 && (bs[len - 1] == b'~')
68}
69
70pub fn generic_ignore_filename(filename: &OsStr) -> bool {
71    filename_is_dot(filename) || filename_is_emacs_backup(filename)
72}