rust/hg-core/src/dirstate_tree/status.rs
branchstable
changeset 49337 6cd249556e20
parent 49000 dd6b67d5c256
child 49365 79b2c98ab7b4
equal deleted inserted replaced
49320:3d3d7fc6035a 49337:6cd249556e20
     2 use crate::dirstate::status::IgnoreFnType;
     2 use crate::dirstate::status::IgnoreFnType;
     3 use crate::dirstate::status::StatusPath;
     3 use crate::dirstate::status::StatusPath;
     4 use crate::dirstate_tree::dirstate_map::BorrowedPath;
     4 use crate::dirstate_tree::dirstate_map::BorrowedPath;
     5 use crate::dirstate_tree::dirstate_map::ChildNodesRef;
     5 use crate::dirstate_tree::dirstate_map::ChildNodesRef;
     6 use crate::dirstate_tree::dirstate_map::DirstateMap;
     6 use crate::dirstate_tree::dirstate_map::DirstateMap;
       
     7 use crate::dirstate_tree::dirstate_map::DirstateVersion;
     7 use crate::dirstate_tree::dirstate_map::NodeData;
     8 use crate::dirstate_tree::dirstate_map::NodeData;
     8 use crate::dirstate_tree::dirstate_map::NodeRef;
     9 use crate::dirstate_tree::dirstate_map::NodeRef;
     9 use crate::dirstate_tree::on_disk::DirstateV2ParseError;
    10 use crate::dirstate_tree::on_disk::DirstateV2ParseError;
    10 use crate::matchers::get_ignore_function;
    11 use crate::matchers::get_ignore_function;
    11 use crate::matchers::Matcher;
    12 use crate::matchers::Matcher;
    59         .build_global()
    60         .build_global()
    60         .ok();
    61         .ok();
    61 
    62 
    62     let (ignore_fn, warnings, patterns_changed): (IgnoreFnType, _, _) =
    63     let (ignore_fn, warnings, patterns_changed): (IgnoreFnType, _, _) =
    63         if options.list_ignored || options.list_unknown {
    64         if options.list_ignored || options.list_unknown {
    64             let mut hasher = Sha1::new();
    65             let (ignore_fn, warnings, changed) = match dmap.dirstate_version {
    65             let (ignore_fn, warnings) = get_ignore_function(
    66                 DirstateVersion::V1 => {
    66                 ignore_files,
    67                     let (ignore_fn, warnings) = get_ignore_function(
    67                 &root_dir,
    68                         ignore_files,
    68                 &mut |pattern_bytes| hasher.update(pattern_bytes),
    69                         &root_dir,
    69             )?;
    70                         &mut |_pattern_bytes| {},
    70             let new_hash = *hasher.finalize().as_ref();
    71                     )?;
    71             let changed = new_hash != dmap.ignore_patterns_hash;
    72                     (ignore_fn, warnings, None)
    72             dmap.ignore_patterns_hash = new_hash;
    73                 }
    73             (ignore_fn, warnings, Some(changed))
    74                 DirstateVersion::V2 => {
       
    75                     let mut hasher = Sha1::new();
       
    76                     let (ignore_fn, warnings) = get_ignore_function(
       
    77                         ignore_files,
       
    78                         &root_dir,
       
    79                         &mut |pattern_bytes| hasher.update(pattern_bytes),
       
    80                     )?;
       
    81                     let new_hash = *hasher.finalize().as_ref();
       
    82                     let changed = new_hash != dmap.ignore_patterns_hash;
       
    83                     dmap.ignore_patterns_hash = new_hash;
       
    84                     (ignore_fn, warnings, Some(changed))
       
    85                 }
       
    86             };
       
    87             (ignore_fn, warnings, changed)
    74         } else {
    88         } else {
    75             (Box::new(|&_| true), vec![], None)
    89             (Box::new(|&_| true), vec![], None)
    76         };
    90         };
    77 
    91 
    78     let filesystem_time_at_status_start =
    92     let filesystem_time_at_status_start =
   133     let new_cachable = common.new_cachable_directories.into_inner().unwrap();
   147     let new_cachable = common.new_cachable_directories.into_inner().unwrap();
   134     let outdated = common.outated_cached_directories.into_inner().unwrap();
   148     let outdated = common.outated_cached_directories.into_inner().unwrap();
   135 
   149 
   136     outcome.dirty = common.ignore_patterns_have_changed == Some(true)
   150     outcome.dirty = common.ignore_patterns_have_changed == Some(true)
   137         || !outdated.is_empty()
   151         || !outdated.is_empty()
   138         || !new_cachable.is_empty();
   152         || (!new_cachable.is_empty()
       
   153             && dmap.dirstate_version == DirstateVersion::V2);
   139 
   154 
   140     // Remove outdated mtimes before adding new mtimes, in case a given
   155     // Remove outdated mtimes before adding new mtimes, in case a given
   141     // directory is both
   156     // directory is both
   142     for path in &outdated {
   157     for path in &outdated {
   143         let node = dmap.get_or_insert(path)?;
   158         let node = dmap.get_or_insert(path)?;