···4343pub mod options;
4444pub mod state;
45454646-/// Helper to check if a route should be rebuilt during incremental builds
4646+/// Helper to check if a route should be rebuilt during incremental builds.
4747+/// Returns `true` for full builds (when `routes_to_rebuild` is `None`).
4748fn should_rebuild_route(
4848- route_id: &RouteIdentifier,
4949+ route_id: Option<&RouteIdentifier>,
4950 routes_to_rebuild: &Option<FxHashSet<RouteIdentifier>>,
5051) -> bool {
5151- let result = match routes_to_rebuild {
5252- Some(set) => set.contains(route_id),
5353- None => true, // Full build
5454- };
5555-5656- if !result {
5757- trace!(target: "build", "Skipping route {:?} (not in rebuild set)", route_id);
5252+ match routes_to_rebuild {
5353+ Some(set) => {
5454+ // Incremental build - need route_id to check
5555+ let route_id = route_id.expect("route_id required for incremental builds");
5656+ let result = set.contains(route_id);
5757+ if !result {
5858+ trace!(target: "build", "Skipping route {:?} (not in rebuild set)", route_id);
5959+ }
6060+ result
6161+ }
6262+ None => true, // Full build - always rebuild
5863 }
5959-6060- result
6164}
62656363-/// Helper to track all assets used by a route
6666+/// Helper to track all assets used by a route.
6767+/// Only performs work when incremental builds are enabled and route_id is provided.
6468fn track_route_assets(
6569 build_state: &mut BuildState,
6666- route_id: &RouteIdentifier,
7070+ route_id: Option<&RouteIdentifier>,
6771 route_assets: &RouteAssets,
6872) {
7373+ // Skip tracking entirely when route_id is not provided (incremental disabled)
7474+ let Some(route_id) = route_id else {
7575+ return;
7676+ };
7777+6978 // Track images
7079 for image in &route_assets.images {
7180 if let Ok(canonical) = image.path().canonicalize() {
···321330322331 // Static base route
323332 if base_params.is_empty() {
324324- let route_id = RouteIdentifier::base(base_path.clone(), None);
333333+ // Only create RouteIdentifier when incremental builds are enabled
334334+ let route_id = if options.incremental {
335335+ Some(RouteIdentifier::base(base_path.clone(), None))
336336+ } else {
337337+ None
338338+ };
325339326340 // Check if we need to rebuild this route
327327- if should_rebuild_route(&route_id, &routes_to_rebuild) {
341341+ if should_rebuild_route(route_id.as_ref(), &routes_to_rebuild) {
328342 let mut route_assets = RouteAssets::with_default_assets(
329343 &route_assets_options,
330344 Some(image_cache.clone()),
···350364 info!(target: "pages", "{} -> {} {}", url, file_path.to_string_lossy().dimmed(), format_elapsed_time(route_start.elapsed(), &route_format_options));
351365352366 // Track assets for this route
353353- track_route_assets(&mut build_state, &route_id, &route_assets);
367367+ track_route_assets(&mut build_state, route_id.as_ref(), &route_assets);
354368355369 build_pages_images.extend(route_assets.images);
356370 build_pages_scripts.extend(route_assets.scripts);
···398412399413 // Build all pages for this route
400414 for page in pages {
401401- let route_id =
402402- RouteIdentifier::base(base_path.clone(), Some(page.0.0.clone()));
415415+ // Only create RouteIdentifier when incremental builds are enabled
416416+ let route_id = if options.incremental {
417417+ Some(RouteIdentifier::base(base_path.clone(), Some(page.0.0.clone())))
418418+ } else {
419419+ None
420420+ };
403421404422 // Check if we need to rebuild this specific page
405405- if should_rebuild_route(&route_id, &routes_to_rebuild) {
423423+ if should_rebuild_route(route_id.as_ref(), &routes_to_rebuild) {
406424 let page_start = Instant::now();
407425 let url = cached_route.url(&page.0);
408426 let file_path = cached_route.file_path(&page.0, &options.output_dir);
···421439 info!(target: "pages", "├─ {} {}", file_path.to_string_lossy().dimmed(), format_elapsed_time(page_start.elapsed(), &route_format_options));
422440423441 // Track assets for this page
424424- track_route_assets(&mut build_state, &route_id, &route_assets);
442442+ track_route_assets(&mut build_state, route_id.as_ref(), &route_assets);
425443426444 build_metadata.add_page(
427445 base_path.clone(),
···458476459477 if variant_params.is_empty() {
460478 // Static variant
461461- let route_id =
462462- RouteIdentifier::variant(variant_id.clone(), variant_path.clone(), None);
479479+ // Only create RouteIdentifier when incremental builds are enabled
480480+ let route_id = if options.incremental {
481481+ Some(RouteIdentifier::variant(variant_id.clone(), variant_path.clone(), None))
482482+ } else {
483483+ None
484484+ };
463485464486 // Check if we need to rebuild this variant
465465- if should_rebuild_route(&route_id, &routes_to_rebuild) {
487487+ if should_rebuild_route(route_id.as_ref(), &routes_to_rebuild) {
466488 let mut route_assets = RouteAssets::with_default_assets(
467489 &route_assets_options,
468490 Some(image_cache.clone()),
···491513 info!(target: "pages", "├─ {} {}", file_path.to_string_lossy().dimmed(), format_elapsed_time(variant_start.elapsed(), &route_format_options));
492514493515 // Track assets for this variant
494494- track_route_assets(&mut build_state, &route_id, &route_assets);
516516+ track_route_assets(&mut build_state, route_id.as_ref(), &route_assets);
495517496518 build_pages_images.extend(route_assets.images);
497519 build_pages_scripts.extend(route_assets.scripts);
···538560539561 // Build all pages for this variant group
540562 for page in pages {
541541- let route_id = RouteIdentifier::variant(
542542- variant_id.clone(),
543543- variant_path.clone(),
544544- Some(page.0.0.clone()),
545545- );
563563+ // Only create RouteIdentifier when incremental builds are enabled
564564+ let route_id = if options.incremental {
565565+ Some(RouteIdentifier::variant(
566566+ variant_id.clone(),
567567+ variant_path.clone(),
568568+ Some(page.0.0.clone()),
569569+ ))
570570+ } else {
571571+ None
572572+ };
546573547574 // Check if we need to rebuild this specific variant page
548548- if should_rebuild_route(&route_id, &routes_to_rebuild) {
575575+ if should_rebuild_route(route_id.as_ref(), &routes_to_rebuild) {
549576 let variant_page_start = Instant::now();
550577 let url = cached_route.variant_url(&page.0, &variant_id)?;
551578 let file_path = cached_route.variant_file_path(
···568595 info!(target: "pages", "│ ├─ {} {}", file_path.to_string_lossy().dimmed(), format_elapsed_time(variant_page_start.elapsed(), &route_format_options));
569596570597 // Track assets for this variant page
571571- track_route_assets(&mut build_state, &route_id, &route_assets);
598598+ track_route_assets(&mut build_state, route_id.as_ref(), &route_assets);
572599573600 build_metadata.add_page(
574601 variant_path.clone(),