rust/hg-core/src/dirstate_tree/dispatch.rs
changeset 48068 bf8837e3d7ce
parent 48061 060cd909439f
equal deleted inserted replaced
48067:d3eb5f50052c 48068:bf8837e3d7ce
     1 use std::path::PathBuf;
     1 use std::path::PathBuf;
     2 
     2 
     3 use crate::dirstate::parsers::Timestamp;
     3 use crate::dirstate::parsers::Timestamp;
       
     4 use crate::dirstate::CopyMapIter;
       
     5 use crate::dirstate::StateMapIter;
     4 use crate::dirstate_tree::on_disk::DirstateV2ParseError;
     6 use crate::dirstate_tree::on_disk::DirstateV2ParseError;
     5 use crate::matchers::Matcher;
     7 use crate::matchers::Matcher;
     6 use crate::utils::hg_path::{HgPath, HgPathBuf};
     8 use crate::utils::hg_path::{HgPath, HgPathBuf};
     7 use crate::CopyMapIter;
       
     8 use crate::DirstateEntry;
     9 use crate::DirstateEntry;
     9 use crate::DirstateError;
    10 use crate::DirstateError;
    10 use crate::DirstateMap;
       
    11 use crate::DirstateParents;
    11 use crate::DirstateParents;
    12 use crate::DirstateStatus;
    12 use crate::DirstateStatus;
    13 use crate::PatternFileWarning;
    13 use crate::PatternFileWarning;
    14 use crate::StateMapIter;
       
    15 use crate::StatusError;
    14 use crate::StatusError;
    16 use crate::StatusOptions;
    15 use crate::StatusOptions;
    17 
    16 
    18 /// `rust/hg-cpython/src/dirstate/dirstate_map.rs` implements in Rust a
    17 /// `rust/hg-cpython/src/dirstate/dirstate_map.rs` implements in Rust a
    19 /// `DirstateMap` Python class that wraps `Box<dyn DirstateMapMethods + Send>`,
    18 /// `DirstateMap` Python class that wraps `Box<dyn DirstateMapMethods + Send>`,
   210                 >,
   209                 >,
   211             > + Send
   210             > + Send
   212             + '_,
   211             + '_,
   213     >;
   212     >;
   214 }
   213 }
   215 
       
   216 impl DirstateMapMethods for DirstateMap {
       
   217     fn clear(&mut self) {
       
   218         self.clear()
       
   219     }
       
   220 
       
   221     /// Used to set a value directory.
       
   222     ///
       
   223     /// XXX Is temporary during a refactor of V1 dirstate and will disappear
       
   224     /// shortly.
       
   225     fn set_entry(
       
   226         &mut self,
       
   227         filename: &HgPath,
       
   228         entry: DirstateEntry,
       
   229     ) -> Result<(), DirstateV2ParseError> {
       
   230         self.set_entry(&filename, entry);
       
   231         Ok(())
       
   232     }
       
   233 
       
   234     fn add_file(
       
   235         &mut self,
       
   236         filename: &HgPath,
       
   237         entry: DirstateEntry,
       
   238     ) -> Result<(), DirstateError> {
       
   239         self.add_file(filename, entry)
       
   240     }
       
   241 
       
   242     fn remove_file(
       
   243         &mut self,
       
   244         filename: &HgPath,
       
   245         in_merge: bool,
       
   246     ) -> Result<(), DirstateError> {
       
   247         self.remove_file(filename, in_merge)
       
   248     }
       
   249 
       
   250     fn drop_entry_and_copy_source(
       
   251         &mut self,
       
   252         filename: &HgPath,
       
   253     ) -> Result<(), DirstateError> {
       
   254         self.drop_entry_and_copy_source(filename)
       
   255     }
       
   256 
       
   257     fn has_tracked_dir(
       
   258         &mut self,
       
   259         directory: &HgPath,
       
   260     ) -> Result<bool, DirstateError> {
       
   261         self.has_tracked_dir(directory)
       
   262     }
       
   263 
       
   264     fn has_dir(&mut self, directory: &HgPath) -> Result<bool, DirstateError> {
       
   265         self.has_dir(directory)
       
   266     }
       
   267 
       
   268     fn pack_v1(
       
   269         &mut self,
       
   270         parents: DirstateParents,
       
   271         now: Timestamp,
       
   272     ) -> Result<Vec<u8>, DirstateError> {
       
   273         Ok(self.pack(parents, now)?)
       
   274     }
       
   275 
       
   276     fn pack_v2(
       
   277         &mut self,
       
   278         _now: Timestamp,
       
   279         _can_append: bool,
       
   280     ) -> Result<(Vec<u8>, Vec<u8>, bool), DirstateError> {
       
   281         panic!(
       
   282             "should have used dirstate_tree::DirstateMap to use the v2 format"
       
   283         )
       
   284     }
       
   285 
       
   286     fn status<'a>(
       
   287         &'a mut self,
       
   288         matcher: &'a (dyn Matcher + Sync),
       
   289         root_dir: PathBuf,
       
   290         ignore_files: Vec<PathBuf>,
       
   291         options: StatusOptions,
       
   292     ) -> Result<(DirstateStatus<'a>, Vec<PatternFileWarning>), StatusError>
       
   293     {
       
   294         crate::status(self, matcher, root_dir, ignore_files, options)
       
   295     }
       
   296 
       
   297     fn copy_map_len(&self) -> usize {
       
   298         self.copy_map.len()
       
   299     }
       
   300 
       
   301     fn copy_map_iter(&self) -> CopyMapIter<'_> {
       
   302         Box::new(
       
   303             self.copy_map
       
   304                 .iter()
       
   305                 .map(|(key, value)| Ok((&**key, &**value))),
       
   306         )
       
   307     }
       
   308 
       
   309     fn copy_map_contains_key(
       
   310         &self,
       
   311         key: &HgPath,
       
   312     ) -> Result<bool, DirstateV2ParseError> {
       
   313         Ok(self.copy_map.contains_key(key))
       
   314     }
       
   315 
       
   316     fn copy_map_get(
       
   317         &self,
       
   318         key: &HgPath,
       
   319     ) -> Result<Option<&HgPath>, DirstateV2ParseError> {
       
   320         Ok(self.copy_map.get(key).map(|p| &**p))
       
   321     }
       
   322 
       
   323     fn copy_map_remove(
       
   324         &mut self,
       
   325         key: &HgPath,
       
   326     ) -> Result<Option<HgPathBuf>, DirstateV2ParseError> {
       
   327         Ok(self.copy_map.remove(key))
       
   328     }
       
   329 
       
   330     fn copy_map_insert(
       
   331         &mut self,
       
   332         key: HgPathBuf,
       
   333         value: HgPathBuf,
       
   334     ) -> Result<Option<HgPathBuf>, DirstateV2ParseError> {
       
   335         Ok(self.copy_map.insert(key, value))
       
   336     }
       
   337 
       
   338     fn len(&self) -> usize {
       
   339         (&**self).len()
       
   340     }
       
   341 
       
   342     fn contains_key(
       
   343         &self,
       
   344         key: &HgPath,
       
   345     ) -> Result<bool, DirstateV2ParseError> {
       
   346         Ok((&**self).contains_key(key))
       
   347     }
       
   348 
       
   349     fn get(
       
   350         &self,
       
   351         key: &HgPath,
       
   352     ) -> Result<Option<DirstateEntry>, DirstateV2ParseError> {
       
   353         Ok((&**self).get(key).cloned())
       
   354     }
       
   355 
       
   356     fn iter(&self) -> StateMapIter<'_> {
       
   357         Box::new((&**self).iter().map(|(key, value)| Ok((&**key, *value))))
       
   358     }
       
   359 
       
   360     fn iter_tracked_dirs(
       
   361         &mut self,
       
   362     ) -> Result<
       
   363         Box<
       
   364             dyn Iterator<Item = Result<&HgPath, DirstateV2ParseError>>
       
   365                 + Send
       
   366                 + '_,
       
   367         >,
       
   368         DirstateError,
       
   369     > {
       
   370         self.set_all_dirs()?;
       
   371         Ok(Box::new(
       
   372             self.all_dirs
       
   373                 .as_ref()
       
   374                 .unwrap()
       
   375                 .iter()
       
   376                 .map(|path| Ok(&**path)),
       
   377         ))
       
   378     }
       
   379 
       
   380     fn debug_iter(
       
   381         &self,
       
   382         all: bool,
       
   383     ) -> Box<
       
   384         dyn Iterator<
       
   385                 Item = Result<
       
   386                     (&HgPath, (u8, i32, i32, i32)),
       
   387                     DirstateV2ParseError,
       
   388                 >,
       
   389             > + Send
       
   390             + '_,
       
   391     > {
       
   392         // Not used for the flat (not tree-based) DirstateMap
       
   393         let _ = all;
       
   394 
       
   395         Box::new(
       
   396             (&**self)
       
   397                 .iter()
       
   398                 .map(|(path, entry)| Ok((&**path, entry.debug_tuple()))),
       
   399         )
       
   400     }
       
   401 }