diff --git a/rust/hg-core/src/revlog/revlog.rs b/rust/hg-core/src/revlog/revlog.rs --- a/rust/hg-core/src/revlog/revlog.rs +++ b/rust/hg-core/src/revlog/revlog.rs @@ -18,7 +18,7 @@ use crate::errors::HgError; use crate::repo::Repo; use crate::revlog::Revision; -use crate::{Node, NULL_REVISION}; +use crate::{Node, RevlogIndex, NULL_REVISION}; const REVISION_FLAG_CENSORED: u16 = 1 << 15; const REVISION_FLAG_ELLIPSIS: u16 = 1 << 14; @@ -112,14 +112,23 @@ let nodemap = if index.is_inline() { None } else { - NodeMapDocket::read_from_file(repo, index_path)?.map( - |(docket, data)| { - nodemap::NodeTree::load_bytes( - Box::new(data), - docket.data_length, - ) - }, - ) + if let Some((docket, data)) = + NodeMapDocket::read_from_file(repo, index_path)? + { + Some(nodemap::NodeTree::load_bytes( + Box::new(data), + docket.data_length, + )) + } else { + let mut nodemap = nodemap::NodeTree::default(); + for rev in 0..index.len() { + let rev = rev as Revision; + nodemap + .insert(&index, index.node(rev).unwrap(), rev) + .unwrap(); + } + Some(nodemap) + } }; Ok(Revlog {