chj_rustbin/io/
excludes.rs1use 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
38pub 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
48pub 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}