mirror of
https://github.com/rust-lang/mdBook.git
synced 2025-12-28 10:16:33 -05:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
56c225bd34 | ||
|
|
55c017cad1 | ||
|
|
7849d55b99 | ||
|
|
c903cc8827 | ||
|
|
4a797b9565 |
@@ -1,5 +1,12 @@
|
||||
# Changelog
|
||||
|
||||
## mdBook 0.4.34
|
||||
[v0.4.33...v0.4.34](https://github.com/rust-lang/mdBook/compare/v0.4.33...v0.4.34)
|
||||
|
||||
### Fixed
|
||||
- Fixed file change watcher failing on macOS with a large number of files.
|
||||
[#2157](https://github.com/rust-lang/mdBook/pull/2157)
|
||||
|
||||
## mdBook 0.4.33
|
||||
[v0.4.32...v0.4.33](https://github.com/rust-lang/mdBook/compare/v0.4.32...v0.4.33)
|
||||
|
||||
|
||||
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -955,7 +955,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "mdbook"
|
||||
version = "0.4.33"
|
||||
version = "0.4.34"
|
||||
dependencies = [
|
||||
"ammonia",
|
||||
"anyhow",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "mdbook"
|
||||
version = "0.4.33"
|
||||
version = "0.4.34"
|
||||
authors = [
|
||||
"Mathieu David <mathieudavid@mathieudavid.org>",
|
||||
"Michael-F-Bryan <michaelfbryan@gmail.com>",
|
||||
@@ -37,7 +37,7 @@ toml = "0.5.11" # Do not update, see https://github.com/rust-lang/mdBook/issues/
|
||||
topological-sort = "0.2.2"
|
||||
|
||||
# Watch feature
|
||||
notify = { version = "6.0.1", optional = true, features = ["macos_kqueue"] }
|
||||
notify = { version = "6.0.1", optional = true }
|
||||
notify-debouncer-mini = { version = "0.3.0", optional = true }
|
||||
ignore = { version = "0.4.20", optional = true }
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ A simple approach would be to use the popular `curl` CLI tool to download the ex
|
||||
|
||||
```sh
|
||||
mkdir bin
|
||||
curl -sSL https://github.com/rust-lang/mdBook/releases/download/v0.4.33/mdbook-v0.4.33-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=bin
|
||||
curl -sSL https://github.com/rust-lang/mdBook/releases/download/v0.4.34/mdbook-v0.4.34-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=bin
|
||||
bin/mdbook build
|
||||
```
|
||||
|
||||
|
||||
@@ -166,7 +166,7 @@ pub fn copy_files_except_ext(
|
||||
.expect("a file should have a file name...")
|
||||
)
|
||||
);
|
||||
fs::copy(
|
||||
copy(
|
||||
entry.path(),
|
||||
&to.join(
|
||||
entry
|
||||
@@ -180,6 +180,62 @@ pub fn copy_files_except_ext(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Copies a file.
|
||||
fn copy<P: AsRef<Path>, Q: AsRef<Path>>(from: P, to: Q) -> Result<()> {
|
||||
let from = from.as_ref();
|
||||
let to = to.as_ref();
|
||||
return copy_inner(from, to)
|
||||
.with_context(|| format!("failed to copy `{}` to `{}`", from.display(), to.display()));
|
||||
|
||||
// This is a workaround for an issue with the macOS file watcher.
|
||||
// Rust's `std::fs::copy` function uses `fclonefileat`, which creates
|
||||
// clones on APFS. Unfortunately fs events seem to trigger on both
|
||||
// sides of the clone, and there doesn't seem to be a way to differentiate
|
||||
// which side it is.
|
||||
// https://github.com/notify-rs/notify/issues/465#issuecomment-1657261035
|
||||
// contains more information.
|
||||
//
|
||||
// This is essentially a copy of the simple copy code path in Rust's
|
||||
// standard library.
|
||||
#[cfg(target_os = "macos")]
|
||||
fn copy_inner(from: &Path, to: &Path) -> Result<()> {
|
||||
use std::fs::OpenOptions;
|
||||
use std::os::unix::fs::{OpenOptionsExt, PermissionsExt};
|
||||
|
||||
let mut reader = File::open(from)?;
|
||||
let metadata = reader.metadata()?;
|
||||
if !metadata.is_file() {
|
||||
anyhow::bail!(
|
||||
"expected a file, `{}` appears to be {:?}",
|
||||
from.display(),
|
||||
metadata.file_type()
|
||||
);
|
||||
}
|
||||
let perm = metadata.permissions();
|
||||
let mut writer = OpenOptions::new()
|
||||
.mode(perm.mode())
|
||||
.write(true)
|
||||
.create(true)
|
||||
.truncate(true)
|
||||
.open(to)?;
|
||||
let writer_metadata = writer.metadata()?;
|
||||
if writer_metadata.is_file() {
|
||||
// Set the correct file permissions, in case the file already existed.
|
||||
// Don't set the permissions on already existing non-files like
|
||||
// pipes/FIFOs or device nodes.
|
||||
writer.set_permissions(perm)?;
|
||||
}
|
||||
std::io::copy(&mut reader, &mut writer)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "macos"))]
|
||||
fn copy_inner(from: &Path, to: &Path) -> Result<()> {
|
||||
fs::copy(from, to)?;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_404_output_file(input_404: &Option<String>) -> String {
|
||||
input_404
|
||||
.as_ref()
|
||||
|
||||
Reference in New Issue
Block a user