2017-10-21 10:16:03 +02:00
|
|
|
// Copyright (c) 2017 fd developers
|
|
|
|
// Licensed under the Apache License, Version 2.0
|
|
|
|
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0>
|
|
|
|
// or the MIT license <LICENSE-MIT or http://opensource.org/licenses/MIT>,
|
|
|
|
// at your option. All files in the project carrying such
|
|
|
|
// notice may not be copied, modified, or distributed except
|
|
|
|
// according to those terms.
|
|
|
|
|
2017-10-18 20:04:34 +02:00
|
|
|
use std::env::current_dir;
|
2018-03-25 19:48:09 +02:00
|
|
|
use std::fs;
|
2018-04-13 22:46:17 +02:00
|
|
|
use std::io;
|
2018-03-25 19:48:09 +02:00
|
|
|
#[cfg(any(unix, target_os = "redox"))]
|
|
|
|
use std::os::unix::fs::PermissionsExt;
|
2018-04-13 22:46:17 +02:00
|
|
|
use std::path::{Path, PathBuf};
|
2017-06-05 16:25:13 +02:00
|
|
|
|
2018-08-19 17:05:04 +02:00
|
|
|
use ignore::DirEntry;
|
|
|
|
|
2017-10-18 20:04:34 +02:00
|
|
|
pub fn path_absolute_form(path: &Path) -> io::Result<PathBuf> {
|
|
|
|
if path.is_absolute() {
|
|
|
|
Ok(path.to_path_buf())
|
2017-06-05 16:25:13 +02:00
|
|
|
} else {
|
2017-10-18 20:04:34 +02:00
|
|
|
let path = path.strip_prefix(".").unwrap_or(path);
|
|
|
|
current_dir().map(|path_buf| path_buf.join(path))
|
2017-06-05 16:25:13 +02:00
|
|
|
}
|
|
|
|
}
|
2017-10-07 09:40:44 +02:00
|
|
|
|
|
|
|
pub fn absolute_path(path: &Path) -> io::Result<PathBuf> {
|
2017-10-18 20:04:34 +02:00
|
|
|
let path_buf = path_absolute_form(path)?;
|
2017-10-07 09:40:44 +02:00
|
|
|
|
|
|
|
#[cfg(windows)]
|
2018-01-01 12:16:43 +01:00
|
|
|
let path_buf = Path::new(
|
|
|
|
path_buf
|
|
|
|
.as_path()
|
|
|
|
.to_string_lossy()
|
|
|
|
.trim_left_matches(r"\\?\"),
|
2018-09-27 23:01:38 +02:00
|
|
|
)
|
|
|
|
.to_path_buf();
|
2017-10-07 09:40:44 +02:00
|
|
|
|
|
|
|
Ok(path_buf)
|
|
|
|
}
|
2017-10-18 20:04:34 +02:00
|
|
|
|
2018-08-19 17:05:04 +02:00
|
|
|
// Path::is_dir() is not guaranteed to be intuitively correct for "." and ".."
|
2017-10-18 20:04:34 +02:00
|
|
|
// See: https://github.com/rust-lang/rust/issues/45302
|
|
|
|
pub fn is_dir(path: &Path) -> bool {
|
|
|
|
if path.file_name().is_some() {
|
|
|
|
path.is_dir()
|
|
|
|
} else {
|
|
|
|
path.is_dir() && path.canonicalize().is_ok()
|
|
|
|
}
|
|
|
|
}
|
2018-03-25 19:48:09 +02:00
|
|
|
|
|
|
|
#[cfg(any(unix, target_os = "redox"))]
|
|
|
|
pub fn is_executable(md: &fs::Metadata) -> bool {
|
|
|
|
md.permissions().mode() & 0o111 != 0
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(windows)]
|
|
|
|
pub fn is_executable(_: &fs::Metadata) -> bool {
|
|
|
|
false
|
|
|
|
}
|
2018-08-19 17:05:04 +02:00
|
|
|
|
|
|
|
pub fn is_empty(entry: &DirEntry) -> bool {
|
|
|
|
if let Some(file_type) = entry.file_type() {
|
|
|
|
if file_type.is_dir() {
|
|
|
|
if let Ok(mut entries) = fs::read_dir(entry.path()) {
|
|
|
|
entries.next().is_none()
|
|
|
|
} else {
|
|
|
|
false
|
|
|
|
}
|
|
|
|
} else if file_type.is_file() {
|
|
|
|
entry.metadata().map(|m| m.len() == 0).unwrap_or(false)
|
|
|
|
} else {
|
|
|
|
false
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
false
|
|
|
|
}
|
|
|
|
}
|