nicegit/
tree.rs

1use {GitDirectory, DirectoryEntry, TreeEntryExt};
2use std::cmp::Ordering;
3use git2::Tree;
4
5/// A set of extension methods for the `Tree` type in `git2`.
6pub trait TreeExt {
7    /// Get a list of all the named entries at this level in the tree.
8    fn entry_names(&self) -> Vec<String>;
9
10    /// Get a higher level, pre-sorted view of this level in the tree analogous to
11    /// a traditional filesystem, separated into directories and files.
12    fn dir_listing(&self) -> GitDirectory;
13}
14
15impl<'repo> TreeExt for Tree<'repo> {
16    fn entry_names(&self) -> Vec<String> {
17        self.iter()
18            .filter_map(|n|
19                if let Some(s) = n.name() {
20                    Some(s.to_owned())
21                } else {
22                    None
23                })
24            .collect()
25    }
26
27    fn dir_listing(&self) -> GitDirectory {
28        let mut dirs: Vec<DirectoryEntry> = vec![];
29        let mut files: Vec<DirectoryEntry> = vec![];
30
31        let names = self.entry_names();
32
33        names.into_iter().for_each(|name| {
34            if let Some(node) = self.get_name(&name) {
35                let entry = DirectoryEntry {
36                    name,
37                    node,
38                };
39
40                if entry.node.is_dir() {
41                    dirs.push(entry);
42                } else {
43                    files.push(entry);
44                }
45            }
46        });
47
48        let sort_alpha: fn(&DirectoryEntry, &DirectoryEntry) -> Ordering =
49            |a, b| a.name.cmp(&b.name);
50
51        dirs.sort_by(sort_alpha);
52        files.sort_by(sort_alpha);
53
54        GitDirectory {
55            dirs,
56            files,
57        }
58    }
59}