Mercurial > hg
comparison rust/hg-core/src/dirstate_tree/status.rs @ 49558:363923bd51cd stable
dirstate-v2: hash the source of the ignore patterns as well
Fixes the test introduced in the last changeset. This caused the hash
to change, which means that the check in the test had to be adapted.
Since this hash is only done as a caching mechanism, invalidation does
not pose any backwards compatibility issues.
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Wed, 02 Nov 2022 12:05:34 +0100 |
parents | 8ee3889bab92 |
children | 18282cf18aa2 c52435820bbd |
comparison
equal
deleted
inserted
replaced
49557:ca19335e86e5 | 49558:363923bd51cd |
---|---|
8 use crate::dirstate_tree::dirstate_map::NodeRef; | 8 use crate::dirstate_tree::dirstate_map::NodeRef; |
9 use crate::dirstate_tree::on_disk::DirstateV2ParseError; | 9 use crate::dirstate_tree::on_disk::DirstateV2ParseError; |
10 use crate::matchers::get_ignore_function; | 10 use crate::matchers::get_ignore_function; |
11 use crate::matchers::Matcher; | 11 use crate::matchers::Matcher; |
12 use crate::utils::files::get_bytes_from_os_string; | 12 use crate::utils::files::get_bytes_from_os_string; |
13 use crate::utils::files::get_bytes_from_path; | |
13 use crate::utils::files::get_path_from_bytes; | 14 use crate::utils::files::get_path_from_bytes; |
14 use crate::utils::hg_path::HgPath; | 15 use crate::utils::hg_path::HgPath; |
15 use crate::BadMatch; | 16 use crate::BadMatch; |
16 use crate::DirstateStatus; | 17 use crate::DirstateStatus; |
17 use crate::HgPathBuf; | 18 use crate::HgPathBuf; |
64 let (ignore_fn, warnings, changed) = match dmap.dirstate_version { | 65 let (ignore_fn, warnings, changed) = match dmap.dirstate_version { |
65 DirstateVersion::V1 => { | 66 DirstateVersion::V1 => { |
66 let (ignore_fn, warnings) = get_ignore_function( | 67 let (ignore_fn, warnings) = get_ignore_function( |
67 ignore_files, | 68 ignore_files, |
68 &root_dir, | 69 &root_dir, |
69 &mut |_pattern_bytes| {}, | 70 &mut |_source, _pattern_bytes| {}, |
70 )?; | 71 )?; |
71 (ignore_fn, warnings, None) | 72 (ignore_fn, warnings, None) |
72 } | 73 } |
73 DirstateVersion::V2 => { | 74 DirstateVersion::V2 => { |
74 let mut hasher = Sha1::new(); | 75 let mut hasher = Sha1::new(); |
75 let (ignore_fn, warnings) = get_ignore_function( | 76 let (ignore_fn, warnings) = get_ignore_function( |
76 ignore_files, | 77 ignore_files, |
77 &root_dir, | 78 &root_dir, |
78 &mut |pattern_bytes| hasher.update(pattern_bytes), | 79 &mut |source, pattern_bytes| { |
80 // If inside the repo, use the relative version to | |
81 // make it deterministic inside tests. | |
82 // The performance hit should be negligible. | |
83 let source = source | |
84 .strip_prefix(&root_dir) | |
85 .unwrap_or(source); | |
86 let source = get_bytes_from_path(source); | |
87 | |
88 let mut subhasher = Sha1::new(); | |
89 subhasher.update(pattern_bytes); | |
90 let patterns_hash = subhasher.finalize(); | |
91 | |
92 hasher.update(source); | |
93 hasher.update(b" "); | |
94 hasher.update(patterns_hash); | |
95 hasher.update(b"\n"); | |
96 }, | |
79 )?; | 97 )?; |
80 let new_hash = *hasher.finalize().as_ref(); | 98 let new_hash = *hasher.finalize().as_ref(); |
81 let changed = new_hash != dmap.ignore_patterns_hash; | 99 let changed = new_hash != dmap.ignore_patterns_hash; |
82 dmap.ignore_patterns_hash = new_hash; | 100 dmap.ignore_patterns_hash = new_hash; |
83 (ignore_fn, warnings, Some(changed)) | 101 (ignore_fn, warnings, Some(changed)) |