rust/rhg/src/commands/status.rs
changeset 47374 bd88b6bfd8da
parent 47322 1760de72a992
child 47674 ff97e793ed36
--- a/rust/rhg/src/commands/status.rs	Wed May 26 11:53:37 2021 +0200
+++ b/rust/rhg/src/commands/status.rs	Tue May 25 09:20:30 2021 +0200
@@ -9,6 +9,7 @@
 use crate::ui::Ui;
 use clap::{Arg, SubCommand};
 use hg;
+use hg::dirstate_tree::dirstate_map::DirstateMap;
 use hg::errors::HgResultExt;
 use hg::errors::IoResultExt;
 use hg::matchers::AlwaysMatcher;
@@ -16,7 +17,7 @@
 use hg::repo::Repo;
 use hg::revlog::node::Node;
 use hg::utils::hg_path::{hg_path_to_os_string, HgPath};
-use hg::{DirstateMap, StatusError};
+use hg::StatusError;
 use hg::{HgPathCow, StatusOptions};
 use log::{info, warn};
 use std::convert::TryInto;
@@ -164,14 +165,17 @@
     };
 
     let repo = invocation.repo?;
-    let mut dmap = DirstateMap::new();
     let dirstate_data =
         repo.hg_vfs().mmap_open("dirstate").io_not_found_as_none()?;
     let dirstate_data = match &dirstate_data {
         Some(mmap) => &**mmap,
         None => b"",
     };
-    let parents = dmap.read(dirstate_data)?;
+    let (mut dmap, parents) = if repo.has_dirstate_v2() {
+        DirstateMap::new_v2(dirstate_data)?
+    } else {
+        DirstateMap::new_v1(dirstate_data)?
+    };
     let options = StatusOptions {
         // TODO should be provided by the dirstate parsing and
         // hence be stored on dmap. Using a value that assumes we aren't
@@ -187,8 +191,8 @@
         collect_traversed_dirs: false,
     };
     let ignore_file = repo.working_directory_vfs().join(".hgignore"); // TODO hardcoded
-    let (mut ds_status, pattern_warnings) = hg::status(
-        &dmap,
+    let (mut ds_status, pattern_warnings) = hg::dirstate_tree::status::status(
+        &mut dmap,
         &AlwaysMatcher,
         repo.working_directory_path().to_owned(),
         vec![ignore_file],