From 9a99bbd8bc6e1812fcf798af3567f0d6911bede3 Mon Sep 17 00:00:00 2001 From: "Andrew Phillips (aider)" Date: Tue, 13 May 2025 18:26:42 -0300 Subject: [PATCH] feat: Recalculate digest if digest_type is set but digest_value is missing --- src/modes/update.rs | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/modes/update.rs b/src/modes/update.rs index 08aa28e..8e0e84d 100644 --- a/src/modes/update.rs +++ b/src/modes/update.rs @@ -49,8 +49,8 @@ pub fn mode_update( let compression_type = CompressionType::from_str(&item.compression)?; let compression_engine = get_compression_engine(compression_type) .expect("Unable to get compression engine"); - let size = compression_engine.size(item_path)? as i64; - item.size = Some(size); + let size = compression_engine.size(item_path.clone())?; + item.size = Some(size as i64); db::update_item(conn, item.clone())?; } else { debug!( @@ -60,6 +60,36 @@ pub fn mode_update( } } + // If digest is defined and not None, but digest_value is missing, recalculate it + if item.digest_type != "None" && item.digest_value.is_none() { + debug!("MAIN: Recalculating digest for item {:?}", item.id); + + // Get the digest type + let digest_type = DigestType::from_str(&item.digest_type)?; + let mut digest_engine = get_digest_engine(digest_type); + + // Read the file using the compression engine + let compression_type = CompressionType::from_str(&item.compression)?; + let compression_engine = get_compression_engine(compression_type) + .expect("Unable to get compression engine"); + + let mut reader = compression_engine.open(item_path.clone())?; + let mut buffer = [0; 4096]; + + loop { + let n = reader.read(&mut buffer)?; + if n == 0 { + break; + } + digest_engine.update(&buffer[..n]); + } + + // Finalize the digest and update the item + let digest_value = digest_engine.finalize()?; + item.digest_value = Some(digest_value); + db::update_item(conn, item.clone())?; + } + if !args.item.meta.is_empty() { debug!("MAIN: Updating item meta"); for kv in args.item.meta.iter() {