rhg: Don’t attempt to read persistent nodemap without .hg/requires opt-in
authorSimon Sapin <simon.sapin@octobus.net>
Thu, 25 Feb 2021 21:29:12 +0100
changeset 46630 842f2372ced6
parent 46629 90481550467c
child 46631 230f73019e49
rhg: Don’t attempt to read persistent nodemap without .hg/requires opt-in Differential Revision: https://phab.mercurial-scm.org/D10077
rust/hg-core/src/revlog/nodemap_docket.rs
--- a/rust/hg-core/src/revlog/nodemap_docket.rs	Thu Feb 04 17:34:20 2021 -0800
+++ b/rust/hg-core/src/revlog/nodemap_docket.rs	Thu Feb 25 21:29:12 2021 +0100
@@ -1,4 +1,5 @@
 use crate::errors::{HgError, HgResultExt};
+use crate::requirements;
 use bytes_cast::{unaligned, BytesCast};
 use memmap::Mmap;
 use std::path::{Path, PathBuf};
@@ -38,6 +39,14 @@
         repo: &Repo,
         index_path: &Path,
     ) -> Result<Option<(Self, Mmap)>, RevlogError> {
+        if !repo
+            .requirements()
+            .contains(requirements::NODEMAP_REQUIREMENT)
+        {
+            // If .hg/requires does not opt it, don’t try to open a nodemap
+            return Ok(None);
+        }
+
         let docket_path = index_path.with_extension("n");
         let docket_bytes = if let Some(bytes) =
             repo.store_vfs().read(&docket_path).io_not_found_as_none()?
@@ -88,6 +97,8 @@
                 Err(HgError::corrupted("persistent nodemap too short").into())
             }
         } else {
+            // Even if .hg/requires opted in, some revlogs are deemed small
+            // enough to not need a persistent nodemap.
             Ok(None)
         }
     }