rust/hg-core/src/dirstate_tree/status.rs
changeset 48192 d2f760c2c91c
parent 48190 0cc0c0972164
child 48193 320de901896a
equal deleted inserted replaced
48191:a5a673ec8f6f 48192:d2f760c2c91c
       
     1 use crate::dirstate::entry::Timestamp;
     1 use crate::dirstate::status::IgnoreFnType;
     2 use crate::dirstate::status::IgnoreFnType;
     2 use crate::dirstate_tree::dirstate_map::BorrowedPath;
     3 use crate::dirstate_tree::dirstate_map::BorrowedPath;
     3 use crate::dirstate_tree::dirstate_map::ChildNodesRef;
     4 use crate::dirstate_tree::dirstate_map::ChildNodesRef;
     4 use crate::dirstate_tree::dirstate_map::DirstateMap;
     5 use crate::dirstate_tree::dirstate_map::DirstateMap;
     5 use crate::dirstate_tree::dirstate_map::NodeData;
     6 use crate::dirstate_tree::dirstate_map::NodeData;
     6 use crate::dirstate_tree::dirstate_map::NodeRef;
     7 use crate::dirstate_tree::dirstate_map::NodeRef;
     7 use crate::dirstate_tree::on_disk::DirstateV2ParseError;
     8 use crate::dirstate_tree::on_disk::DirstateV2ParseError;
     8 use crate::dirstate_tree::on_disk::Timestamp;
       
     9 use crate::matchers::get_ignore_function;
     9 use crate::matchers::get_ignore_function;
    10 use crate::matchers::Matcher;
    10 use crate::matchers::Matcher;
    11 use crate::utils::files::get_bytes_from_os_string;
    11 use crate::utils::files::get_bytes_from_os_string;
    12 use crate::utils::files::get_path_from_bytes;
    12 use crate::utils::files::get_path_from_bytes;
    13 use crate::utils::hg_path::HgPath;
    13 use crate::utils::hg_path::HgPath;
   180     /// `symlink_metadata` for child nodes that exist in the dirstate and don’t
   180     /// `symlink_metadata` for child nodes that exist in the dirstate and don’t
   181     /// need to call `read_dir`.
   181     /// need to call `read_dir`.
   182     fn can_skip_fs_readdir(
   182     fn can_skip_fs_readdir(
   183         &self,
   183         &self,
   184         directory_metadata: Option<&std::fs::Metadata>,
   184         directory_metadata: Option<&std::fs::Metadata>,
   185         cached_directory_mtime: Option<&Timestamp>,
   185         cached_directory_mtime: Option<Timestamp>,
   186     ) -> bool {
   186     ) -> bool {
   187         if !self.options.list_unknown && !self.options.list_ignored {
   187         if !self.options.list_unknown && !self.options.list_ignored {
   188             // All states that we care about listing have corresponding
   188             // All states that we care about listing have corresponding
   189             // dirstate entries.
   189             // dirstate entries.
   190             // This happens for example with `hg status -mard`.
   190             // This happens for example with `hg status -mard`.
   198                 // by a previous run of the `status` algorithm which found this
   198                 // by a previous run of the `status` algorithm which found this
   199                 // directory eligible for `read_dir` caching.
   199                 // directory eligible for `read_dir` caching.
   200                 if let Some(meta) = directory_metadata {
   200                 if let Some(meta) = directory_metadata {
   201                     if let Ok(current_mtime) = meta.modified() {
   201                     if let Ok(current_mtime) = meta.modified() {
   202                         let current_mtime = Timestamp::from(current_mtime);
   202                         let current_mtime = Timestamp::from(current_mtime);
   203                         if current_mtime == *cached_mtime {
   203                         if current_mtime == cached_mtime {
   204                             // The mtime of that directory has not changed
   204                             // The mtime of that directory has not changed
   205                             // since then, which means that the results of
   205                             // since then, which means that the results of
   206                             // `read_dir` should also be unchanged.
   206                             // `read_dir` should also be unchanged.
   207                             return true;
   207                             return true;
   208                         }
   208                         }
   220         has_ignored_ancestor: bool,
   220         has_ignored_ancestor: bool,
   221         dirstate_nodes: ChildNodesRef<'tree, 'on_disk>,
   221         dirstate_nodes: ChildNodesRef<'tree, 'on_disk>,
   222         directory_hg_path: &BorrowedPath<'tree, 'on_disk>,
   222         directory_hg_path: &BorrowedPath<'tree, 'on_disk>,
   223         directory_fs_path: &Path,
   223         directory_fs_path: &Path,
   224         directory_metadata: Option<&std::fs::Metadata>,
   224         directory_metadata: Option<&std::fs::Metadata>,
   225         cached_directory_mtime: Option<&Timestamp>,
   225         cached_directory_mtime: Option<Timestamp>,
   226         is_at_repo_root: bool,
   226         is_at_repo_root: bool,
   227     ) -> Result<bool, DirstateV2ParseError> {
   227     ) -> Result<bool, DirstateV2ParseError> {
   228         if self.can_skip_fs_readdir(directory_metadata, cached_directory_mtime)
   228         if self.can_skip_fs_readdir(directory_metadata, cached_directory_mtime)
   229         {
   229         {
   230             dirstate_nodes
   230             dirstate_nodes
   466                     //
   466                     //
   467                     // We deem this scenario (unlike the previous one) to be
   467                     // We deem this scenario (unlike the previous one) to be
   468                     // unlikely enough in practice.
   468                     // unlikely enough in practice.
   469                     let timestamp = directory_mtime.into();
   469                     let timestamp = directory_mtime.into();
   470                     let cached = dirstate_node.cached_directory_mtime();
   470                     let cached = dirstate_node.cached_directory_mtime();
   471                     if cached != Some(&timestamp) {
   471                     if cached != Some(timestamp) {
   472                         let hg_path = dirstate_node
   472                         let hg_path = dirstate_node
   473                             .full_path_borrowed(self.dmap.on_disk)?
   473                             .full_path_borrowed(self.dmap.on_disk)?
   474                             .detach_from_tree();
   474                             .detach_from_tree();
   475                         self.new_cachable_directories
   475                         self.new_cachable_directories
   476                             .lock()
   476                             .lock()