Mercurial > hg-stable
diff rust/rhg/src/commands/status.rs @ 48575:e91aa800ae5b
rhg: desambiguate status without decompressing filelog if possible
When status is unsure based on `stat()` and the dirstate if a file is clean
or modified, we need to compare it against the filelog.
This comparison can skip looking at contents if the lengths differ.
This changeset optimize this further to deduce what we can about the length
if the filelog without decompressing it or resolving deltas.
Differential Revision: https://phab.mercurial-scm.org/D11965
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Fri, 07 Jan 2022 14:40:21 +0100 |
parents | 35c47015b9b7 |
children | 99b1dfc06571 |
line wrap: on
line diff
--- a/rust/rhg/src/commands/status.rs Thu Jan 06 12:46:10 2022 +0100 +++ b/rust/rhg/src/commands/status.rs Fri Jan 07 14:40:21 2022 +0100 @@ -516,16 +516,16 @@ filelog.entry_for_node(entry.node_id()?).map_err(|_| { HgError::corrupted("filelog missing node from manifest") })?; - // TODO: check `fs_len` here like below, but based on - // `RevlogEntry::uncompressed_len` without decompressing the full filelog - // contents where possible. This is only valid if the revlog data does not - // contain metadata. See how Python’s `revlog.rawsize` calls - // `storageutil.filerevisioncopied`. - // (Maybe also check for content-modifying flags? See `revlog.size`.) - let filelog_data = filelog_entry.data()?; - let contents_in_p1 = filelog_data.file_data()?; - if contents_in_p1.len() as u64 != fs_len { - // No need to read the file contents: + if filelog_entry.file_data_len_not_equal_to(fs_len) { + // No need to read file contents: + // it cannot be equal if it has a different length. + return Ok(true); + } + + let p1_filelog_data = filelog_entry.data()?; + let p1_contents = p1_filelog_data.file_data()?; + if p1_contents.len() as u64 != fs_len { + // No need to read file contents: // it cannot be equal if it has a different length. return Ok(true); } @@ -535,5 +535,5 @@ } else { vfs.read(fs_path)? }; - Ok(contents_in_p1 != &*fs_contents) + Ok(p1_contents != &*fs_contents) }