in license-scan/src/main.rs [442:478]
fn scan_go_vendor_repos(vendor_dir: &Path) -> Result<Vec<PathBuf>> {
let mut repositories: Vec<PathBuf> = Vec::new();
// Create a WalkDir iterator that is breadth-first and returns files before directories. This
// allows us to skip a directory once we reach a file.
let mut iter = WalkDir::new(vendor_dir)
// ignore any files at the top of the vendor directory, such as `modules.txt`
.min_depth(2)
.contents_first(true)
.sort_by(
|a, b| match (a.file_type().is_file(), b.file_type().is_file()) {
(true, false) => Ordering::Less,
(false, true) => Ordering::Greater,
_ => a.file_name().cmp(b.file_name()),
},
)
.into_iter();
while let Some(entry) = iter.next() {
let entry = entry?;
if entry.file_type().is_file() {
repositories.push(
entry
.path()
.parent()
.with_context(|| {
format!(
"a file must have a parent, received '{}'",
entry.path().display()
)
})?
.strip_prefix(vendor_dir)?
.into(),
);
iter.skip_current_dir();
}
}
Ok(repositories)
}