Avoid a possible recursive copy when destination (build_dir) is underneath source directory. Update docs to match.

This commit is contained in:
Andrew Mackenzie 2019-09-14 21:14:13 +01:00 committed by Eric Huss
parent 6eb597a556
commit bd14d0910a
3 changed files with 19 additions and 8 deletions

View File

@ -35,5 +35,6 @@ not specified it will default to the value of the `build.build-dir` key in
------------------- -------------------
***Note:*** *Make sure to run the build command in the root directory and not in ***Note:*** *The build command copies all files (excluding files with `.md` extension) from the source directory
the source directory* into the build directory. If the build directory is under the source directory it is not copied as this would
result in a recursive copy until your disk is full.*

View File

@ -291,6 +291,7 @@ impl Renderer for HtmlHandlebars {
let src_dir = ctx.root.join(&ctx.config.book.src); let src_dir = ctx.root.join(&ctx.config.book.src);
let destination = &ctx.destination; let destination = &ctx.destination;
let book = &ctx.book; let book = &ctx.book;
let build_dir = ctx.root.join(&ctx.config.build.build_dir);
if destination.exists() { if destination.exists() {
utils::fs::remove_dir_content(destination) utils::fs::remove_dir_content(destination)
@ -377,8 +378,8 @@ impl Renderer for HtmlHandlebars {
} }
} }
// Copy all remaining files // Copy all remaining files, avoid a recursive copy from/to the book build dir
utils::fs::copy_files_except_ext(&src_dir, &destination, true, &["md"])?; utils::fs::copy_files_except_ext(&src_dir, &destination, true, Some(&build_dir), &["md"])?;
Ok(()) Ok(())
} }

View File

@ -95,13 +95,15 @@ pub fn copy_files_except_ext(
from: &Path, from: &Path,
to: &Path, to: &Path,
recursive: bool, recursive: bool,
avoid_dir: Option<&PathBuf>,
ext_blacklist: &[&str], ext_blacklist: &[&str],
) -> Result<()> { ) -> Result<()> {
debug!( debug!(
"Copying all files from {} to {} (blacklist: {:?})", "Copying all files from {} to {} (blacklist: {:?}), avoiding {:?}",
from.display(), from.display(),
to.display(), to.display(),
ext_blacklist ext_blacklist,
avoid_dir
); );
// Check that from and to are different // Check that from and to are different
@ -113,12 +115,18 @@ pub fn copy_files_except_ext(
let entry = entry?; let entry = entry?;
let metadata = entry.metadata()?; let metadata = entry.metadata()?;
// If the entry is a dir and the recursive option is enabled, call itself // If the entry is a dir and the recursive option is enabled , call itself
if metadata.is_dir() && recursive { if metadata.is_dir() && recursive {
if entry.path() == to.to_path_buf() { if entry.path() == to.to_path_buf() {
continue; continue;
} }
if let Some(avoid) = avoid_dir {
if entry.path() == *avoid {
continue;
}
}
// check if output dir already exists // check if output dir already exists
if !to.join(entry.file_name()).exists() { if !to.join(entry.file_name()).exists() {
fs::create_dir(&to.join(entry.file_name()))?; fs::create_dir(&to.join(entry.file_name()))?;
@ -128,6 +136,7 @@ pub fn copy_files_except_ext(
&from.join(entry.file_name()), &from.join(entry.file_name()),
&to.join(entry.file_name()), &to.join(entry.file_name()),
true, true,
avoid_dir,
ext_blacklist, ext_blacklist,
)?; )?;
} else if metadata.is_file() { } else if metadata.is_file() {
@ -215,7 +224,7 @@ mod tests {
} }
if let Err(e) = if let Err(e) =
copy_files_except_ext(&tmp.path(), &tmp.path().join("output"), true, &["md"]) copy_files_except_ext(&tmp.path(), &tmp.path().join("output"), true, None, &["md"])
{ {
panic!("Error while executing the function:\n{:?}", e); panic!("Error while executing the function:\n{:?}", e);
} }