Merge pull request #2550 from ehuss/fix-expected-source-path

Fix issue with None source_path
This commit is contained in:
Eric Huss 2025-02-17 17:52:50 +00:00 committed by GitHub
commit 35cf96a064
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 33 additions and 11 deletions

View file

@ -173,7 +173,8 @@ pub struct Chapter {
/// `index.md` via the [`Chapter::path`] field. The `source_path` field /// `index.md` via the [`Chapter::path`] field. The `source_path` field
/// exists if you need access to the true file path. /// exists if you need access to the true file path.
/// ///
/// This is `None` for a draft chapter. /// This is `None` for a draft chapter, or a synthetically generated
/// chapter that has no file on disk.
pub source_path: Option<PathBuf>, pub source_path: Option<PathBuf>,
/// An ordered list of the names of each chapter above this one in the hierarchy. /// An ordered list of the names of each chapter above this one in the hierarchy.
pub parent_names: Vec<String>, pub parent_names: Vec<String>,

View file

@ -43,10 +43,11 @@ pub fn create_files(search_config: &Search, destination: &Path, book: &Book) ->
BookItem::Chapter(ch) if !ch.is_draft_chapter() => ch, BookItem::Chapter(ch) if !ch.is_draft_chapter() => ch,
_ => continue, _ => continue,
}; };
let chapter_settings = if let Some(path) = settings_path(chapter) {
get_chapter_settings(&chapter_configs, chapter.source_path.as_ref().unwrap()); let chapter_settings = get_chapter_settings(&chapter_configs, path);
if !chapter_settings.enable.unwrap_or(true) { if !chapter_settings.enable.unwrap_or(true) {
continue; continue;
}
} }
render_item(&mut index, search_config, &mut doc_urls, chapter)?; render_item(&mut index, search_config, &mut doc_urls, chapter)?;
} }
@ -321,6 +322,10 @@ fn clean_html(html: &str) -> String {
AMMONIA.clean(html).to_string() AMMONIA.clean(html).to_string()
} }
fn settings_path(ch: &Chapter) -> Option<&Path> {
ch.source_path.as_deref().or_else(|| ch.path.as_deref())
}
fn validate_chapter_config( fn validate_chapter_config(
chapter_configs: &[(PathBuf, SearchChapterSettings)], chapter_configs: &[(PathBuf, SearchChapterSettings)],
book: &Book, book: &Book,
@ -329,13 +334,10 @@ fn validate_chapter_config(
let found = book let found = book
.iter() .iter()
.filter_map(|item| match item { .filter_map(|item| match item {
BookItem::Chapter(ch) if !ch.is_draft_chapter() => Some(ch), BookItem::Chapter(ch) if !ch.is_draft_chapter() => settings_path(ch),
_ => None, _ => None,
}) })
.any(|chapter| { .any(|source_path| source_path.starts_with(path));
let ch_path = chapter.source_path.as_ref().unwrap();
ch_path.starts_with(path)
});
if !found { if !found {
bail!( bail!(
"[output.html.search.chapter] key `{}` does not match any chapter paths", "[output.html.search.chapter] key `{}` does not match any chapter paths",

View file

@ -3,10 +3,11 @@ mod dummy_book;
use crate::dummy_book::{assert_contains_strings, assert_doesnt_contain_strings, DummyBook}; use crate::dummy_book::{assert_contains_strings, assert_doesnt_contain_strings, DummyBook};
use anyhow::Context; use anyhow::Context;
use mdbook::book::Chapter;
use mdbook::config::Config; use mdbook::config::Config;
use mdbook::errors::*; use mdbook::errors::*;
use mdbook::utils::fs::write_file; use mdbook::utils::fs::write_file;
use mdbook::MDBook; use mdbook::{BookItem, MDBook};
use pretty_assertions::assert_eq; use pretty_assertions::assert_eq;
use select::document::Document; use select::document::Document;
use select::predicate::{Attr, Class, Name, Predicate}; use select::predicate::{Attr, Class, Name, Predicate};
@ -1031,3 +1032,21 @@ fn custom_header_attributes() {
]; ];
assert_contains_strings(&contents, summary_strings); assert_contains_strings(&contents, summary_strings);
} }
#[test]
fn with_no_source_path() {
// Test for a regression where search would fail if source_path is None.
let temp = DummyBook::new().build().unwrap();
let mut md = MDBook::load(temp.path()).unwrap();
let chapter = Chapter {
name: "Sample chapter".to_string(),
content: "".to_string(),
number: None,
sub_items: Vec::new(),
path: Some(PathBuf::from("sample.html")),
source_path: None,
parent_names: Vec::new(),
};
md.book.sections.push(BookItem::Chapter(chapter));
md.build().unwrap();
}