diff options
Diffstat (limited to 'vendor/gix-index/src/file/verify.rs')
-rw-r--r-- | vendor/gix-index/src/file/verify.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/vendor/gix-index/src/file/verify.rs b/vendor/gix-index/src/file/verify.rs new file mode 100644 index 000000000..6743b37a7 --- /dev/null +++ b/vendor/gix-index/src/file/verify.rs @@ -0,0 +1,41 @@ +use std::sync::atomic::AtomicBool; + +use crate::File; + +mod error { + /// The error returned by [File::verify_integrity()][super::File::verify_integrity()]. + #[derive(Debug, thiserror::Error)] + #[allow(missing_docs)] + pub enum Error { + #[error("Could not read index file to generate hash")] + Io(#[from] std::io::Error), + #[error("Index checksum should have been {expected}, but was {actual}")] + ChecksumMismatch { + actual: gix_hash::ObjectId, + expected: gix_hash::ObjectId, + }, + #[error("Checksum of in-memory index wasn't computed yet")] + NoChecksum, + } +} +pub use error::Error; + +impl File { + /// Verify the integrity of the index to assure its consistency. + pub fn verify_integrity(&self) -> Result<(), Error> { + let checksum = self.checksum.ok_or(Error::NoChecksum)?; + let num_bytes_to_hash = self.path.metadata()?.len() - checksum.as_bytes().len() as u64; + let should_interrupt = AtomicBool::new(false); + let actual = gix_features::hash::bytes_of_file( + &self.path, + num_bytes_to_hash as usize, + checksum.kind(), + &mut gix_features::progress::Discard, + &should_interrupt, + )?; + (actual == checksum).then_some(()).ok_or(Error::ChecksumMismatch { + actual, + expected: checksum, + }) + } +} |