|
1 |
| -use crate::installer::error::MapErrWithMessage; |
2 | 1 | use std::ffi::OsString;
|
3 |
| -use std::fs::DirEntry; |
4 | 2 | use std::os::unix::prelude::PermissionsExt;
|
5 | 3 | use std::path::{Path, PathBuf};
|
6 | 4 |
|
| 5 | +use walkdir::WalkDir; |
| 6 | + |
| 7 | +use crate::installer::error::MapErrWithMessage; |
7 | 8 | use crate::installer::InstallerResult;
|
8 | 9 |
|
9 | 10 | pub struct ArchiveInstaller;
|
@@ -32,23 +33,24 @@ impl ArchiveInstaller {
|
32 | 33 | }
|
33 | 34 |
|
34 | 35 | fn find_executable(directory: &Path) -> Result<ExecutableFile, String> {
|
35 |
| - std::fs::read_dir(directory) |
36 |
| - .map_err_with(format!("Error reading files in {}", directory.display()))? |
| 36 | + let ignore_error = |result: walkdir::Result<walkdir::DirEntry>| result.ok(); |
| 37 | + |
| 38 | + WalkDir::new(directory) |
| 39 | + .max_depth(2) |
| 40 | + .into_iter() |
| 41 | + .filter_map(ignore_error) |
37 | 42 | .find(Self::is_executable)
|
38 |
| - .ok_or_else(|| String::from("No executable found"))? |
| 43 | + .ok_or_else(|| String::from("No executable found")) |
39 | 44 | .map(ExecutableFile::from_file)
|
40 |
| - .map_err_with("Cannot read file information".into()) |
41 | 45 | }
|
42 | 46 |
|
43 |
| - fn is_executable(entry: &std::io::Result<DirEntry>) -> bool { |
44 |
| - entry |
45 |
| - .as_ref() |
46 |
| - .map(|x| { |
47 |
| - let path = x.path(); |
48 |
| - path.metadata() |
49 |
| - .map(|metadata| path.is_file() && (metadata.permissions().mode() & 0o111) != 0) |
50 |
| - .unwrap_or(false) |
51 |
| - }) |
| 47 | + fn is_executable(x: &walkdir::DirEntry) -> bool { |
| 48 | + let path = x.path(); |
| 49 | + let is_executable = |
| 50 | + |metadata: std::fs::Metadata| (metadata.permissions().mode() & 0o111) != 0; |
| 51 | + |
| 52 | + path.metadata() |
| 53 | + .map(|metadata| path.is_file() && is_executable(metadata)) |
52 | 54 | .unwrap_or(false)
|
53 | 55 | }
|
54 | 56 |
|
@@ -78,10 +80,10 @@ struct ExecutableFile {
|
78 | 80 | }
|
79 | 81 |
|
80 | 82 | impl ExecutableFile {
|
81 |
| - fn from_file(x: DirEntry) -> Self { |
| 83 | + fn from_file(x: walkdir::DirEntry) -> Self { |
82 | 84 | Self {
|
83 |
| - path: x.path(), |
84 |
| - name: x.file_name(), |
| 85 | + name: x.file_name().to_os_string(), |
| 86 | + path: x.path().to_path_buf(), |
85 | 87 | }
|
86 | 88 | }
|
87 | 89 | }
|
0 commit comments