|
1 | | -use directory_mapper::is_directory_mapper_source; |
2 | 1 | use glob_match::glob_match; |
3 | 2 | use std::{ |
4 | 3 | collections::HashMap, |
5 | 4 | path::{Path, PathBuf}, |
6 | 5 | }; |
7 | 6 |
|
8 | | -mod directory_mapper; |
| 7 | +pub(crate) mod directory_mapper; |
9 | 8 | mod package_mapper; |
10 | 9 | mod team_file_mapper; |
11 | 10 | mod team_gem_mapper; |
@@ -51,99 +50,10 @@ impl OwnerMatcher { |
51 | 50 | } |
52 | 51 | } |
53 | 52 |
|
54 | | -#[derive(Debug)] |
55 | | -pub struct Owner { |
56 | | - pub sources: Vec<Source>, |
57 | | - pub team_name: TeamName, |
58 | | -} |
59 | | - |
60 | | -pub struct FileOwnerFinder<'a> { |
61 | | - pub owner_matchers: &'a [OwnerMatcher], |
62 | | -} |
63 | | - |
64 | | -impl<'a> FileOwnerFinder<'a> { |
65 | | - pub fn find(&self, relative_path: &Path) -> Vec<Owner> { |
66 | | - let mut team_sources_map: HashMap<&TeamName, Vec<Source>> = HashMap::new(); |
67 | | - let mut directory_overrider = DirectoryOverrider::default(); |
68 | | - |
69 | | - for owner_matcher in self.owner_matchers { |
70 | | - let (owner, source) = owner_matcher.owner_for(relative_path); |
71 | | - |
72 | | - if let Some(team_name) = owner { |
73 | | - if is_directory_mapper_source(source) { |
74 | | - directory_overrider.process(team_name, source); |
75 | | - } else { |
76 | | - team_sources_map.entry(team_name).or_default().push(source.clone()); |
77 | | - } |
78 | | - } |
79 | | - } |
80 | | - |
81 | | - // Add most specific directory owner if it exists |
82 | | - if let Some((team_name, source)) = directory_overrider.specific_directory_owner() { |
83 | | - team_sources_map.entry(team_name).or_default().push(source.clone()); |
84 | | - } |
85 | | - |
86 | | - team_sources_map |
87 | | - .into_iter() |
88 | | - .map(|(team_name, sources)| Owner { |
89 | | - sources, |
90 | | - team_name: team_name.clone(), |
91 | | - }) |
92 | | - .collect() |
93 | | - } |
94 | | -} |
95 | | - |
96 | | -/// DirectoryOverrider is used to override the owner of a directory if a more specific directory owner is found. |
97 | | -#[derive(Debug, Default)] |
98 | | -struct DirectoryOverrider<'a> { |
99 | | - specific_directory_owner: Option<(&'a TeamName, &'a Source)>, |
100 | | -} |
101 | | - |
102 | | -impl<'a> DirectoryOverrider<'a> { |
103 | | - fn process(&mut self, team_name: &'a TeamName, source: &'a Source) { |
104 | | - if self |
105 | | - .specific_directory_owner |
106 | | - .map_or(true, |(_, current_source)| current_source.len() < source.len()) |
107 | | - { |
108 | | - self.specific_directory_owner = Some((team_name, source)); |
109 | | - } |
110 | | - } |
111 | | - |
112 | | - fn specific_directory_owner(&self) -> Option<(&TeamName, &Source)> { |
113 | | - self.specific_directory_owner |
114 | | - } |
115 | | -} |
116 | | - |
117 | 53 | #[cfg(test)] |
118 | 54 | mod tests { |
119 | 55 | use super::*; |
120 | 56 |
|
121 | | - #[test] |
122 | | - fn test_directory_overrider() { |
123 | | - let mut directory_overrider = DirectoryOverrider::default(); |
124 | | - assert_eq!(directory_overrider.specific_directory_owner(), None); |
125 | | - let team_name_1 = "team1".to_string(); |
126 | | - let source_1 = "src/**".to_string(); |
127 | | - directory_overrider.process(&team_name_1, &source_1); |
128 | | - assert_eq!(directory_overrider.specific_directory_owner(), Some((&team_name_1, &source_1))); |
129 | | - |
130 | | - let team_name_longest = "team2".to_string(); |
131 | | - let source_longest = "source/subdir/**".to_string(); |
132 | | - directory_overrider.process(&team_name_longest, &source_longest); |
133 | | - assert_eq!( |
134 | | - directory_overrider.specific_directory_owner(), |
135 | | - Some((&team_name_longest, &source_longest)) |
136 | | - ); |
137 | | - |
138 | | - let team_name_3 = "team3".to_string(); |
139 | | - let source_3 = "source/**".to_string(); |
140 | | - directory_overrider.process(&team_name_3, &source_3); |
141 | | - assert_eq!( |
142 | | - directory_overrider.specific_directory_owner(), |
143 | | - Some((&team_name_longest, &source_longest)) |
144 | | - ); |
145 | | - } |
146 | | - |
147 | 57 | fn assert_owner_for(glob: &str, relative_path: &str, expect_match: bool) { |
148 | 58 | let source = "directory_mapper (\"packs/bam\")".to_string(); |
149 | 59 | let team_name = "team1".to_string(); |
|
0 commit comments