fn scan_go_vendor_repos()

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)
}