summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorifeanyi <ify1992@yahoo.com>2020-09-09 17:42:14 +0200
committerifeanyi <ify1992@yahoo.com>2020-09-09 17:42:14 +0200
commite225586953ae244736b3dbd0e12b2a9ffa927abb (patch)
treee390d69809680e680b3c11d70b43876dee7ffbe7 /src
parentcf7663f80052662a73fbded54711063764d50a84 (diff)
Resolve full file paths when copying files
Currently, the `copy_files` function doesn't support symlink files due to its use of `DirEntry::metadata` - To avoid this issue, this patch resolves the file path first before checking for metadata. Fixes #1157
Diffstat (limited to 'src')
-rw-r--r--src/utils/fs.rs23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/utils/fs.rs b/src/utils/fs.rs
index 7a7aa63a..16247435 100644
--- a/src/utils/fs.rs
+++ b/src/utils/fs.rs
@@ -110,7 +110,7 @@ pub fn copy_files_except_ext(
for entry in fs::read_dir(from)? {
let entry = entry?;
- let metadata = entry.metadata()?;
+ let metadata = entry.path().metadata()?;
// If the entry is a dir and the recursive option is enabled, call itself
if metadata.is_dir() && recursive {
@@ -187,7 +187,17 @@ pub fn get_404_output_file(input_404: &Option<String>) -> String {
#[cfg(test)]
mod tests {
use super::copy_files_except_ext;
- use std::fs;
+ use std::{fs, io::Result, path::Path};
+
+ #[cfg(target_os = "windows")]
+ fn symlink<P: AsRef<Path>, Q: AsRef<Path>>(src: P, dst: Q) -> Result<()> {
+ std::os::window::fs::symlink_file(src, dst)
+ }
+
+ #[cfg(not(target_os = "windows"))]
+ fn symlink<P: AsRef<Path>, Q: AsRef<Path>>(src: P, dst: Q) -> Result<()> {
+ std::os::unix::fs::symlink(src, dst)
+ }
#[test]
fn copy_files_except_ext_test() {
@@ -218,6 +228,12 @@ mod tests {
if let Err(err) = fs::File::create(&tmp.path().join("sub_dir_exists/file.txt")) {
panic!("Could not create sub_dir_exists/file.txt: {}", err);
}
+ if let Err(err) = symlink(
+ &tmp.path().join("file.png"),
+ &tmp.path().join("symlink.png"),
+ ) {
+ panic!("Could not symlink file.png: {}", err);
+ }
// Create output dir
if let Err(err) = fs::create_dir(&tmp.path().join("output")) {
@@ -249,5 +265,8 @@ mod tests {
if !(&tmp.path().join("output/sub_dir_exists/file.txt")).exists() {
panic!("output/sub_dir/file.png should exist")
}
+ if !(&tmp.path().join("output/symlink.png")).exists() {
+ panic!("output/symlink.png should exist")
+ }
}
}