feat: add compression and digest support with database schema updates

This commit is contained in:
Andrew Phillips
2025-05-14 09:45:51 -03:00
committed by Andrew Phillips (aider)
parent 9b61a37036
commit bbdfe19836
19 changed files with 181 additions and 111 deletions

View File

@@ -1,4 +1,4 @@
use humansize::{FormatSizeOptions, BINARY};
use humansize::{BINARY, FormatSizeOptions};
use log::debug;
use prettytable::format::TableFormat;
use regex::Regex;

View File

@@ -1,10 +1,10 @@
use anyhow::{anyhow, Context, Result};
use anyhow::{Context, Result, anyhow};
use std::fs;
use std::path::PathBuf;
use crate::db;
use clap::error::ErrorKind;
use clap::Command;
use clap::error::ErrorKind;
use log::{debug, warn};
use rusqlite::Connection;

View File

@@ -3,11 +3,11 @@ use libc::c_int;
use std::path::PathBuf;
use std::str::FromStr;
use anyhow::{anyhow, Result};
use anyhow::{Result, anyhow};
use clap::Command;
use nix::Error as NixError;
use nix::fcntl::FdFlag;
use nix::unistd::{close, pipe};
use nix::Error as NixError;
use std::io::Read;
use std::os::fd::FromRawFd;
use std::process::Stdio;
@@ -133,8 +133,8 @@ pub fn mode_diff(
) {
use std::io::BufWriter;
let mut buffered_pipe_writer = BufWriter::new(pipe_writer_raw);
let engine = get_compression_engine(compression_type)
.expect("Unable to get compression engine");
let engine =
get_compression_engine(compression_type).expect("Unable to get compression engine");
log::debug!("THREAD: Sending item to diff");
engine
.copy(item_path, &mut buffered_pipe_writer)

View File

@@ -1,12 +1,12 @@
use crate::db::Item;
use crate::modes::common::format_size;
use anyhow::anyhow;
use clap::error::ErrorKind;
use clap::Command;
use clap::error::ErrorKind;
use std::path::PathBuf;
use std::str::FromStr;
use crate::db::Item;
use crate::compression_engine::{get_compression_engine, CompressionType};
use crate::compression_engine::{CompressionType, get_compression_engine};
use crate::db::{get_item, get_item_last, get_item_matching};
use crate::modes::common::get_format_box_chars_no_border_line_separator;
use chrono::prelude::*;
@@ -123,8 +123,8 @@ fn show_item(
// Corrected logic for file_magic_cell:
// compression_type_val is already the successfully parsed CompressionType.
// The .expect() here will panic if get_compression_engine returns an Err.
let compression_engine =
get_compression_engine(compression_type_val.clone()).expect("Unable to get compression engine");
let compression_engine = get_compression_engine(compression_type_val.clone())
.expect("Unable to get compression engine");
let magic_result = compression_engine.magic(item_path_buf.clone()); // Use cloned item_path_buf
let file_magic_cell = match magic_result {
@@ -162,7 +162,7 @@ fn show_item(
Cell::new("Digest Value").with_style(Attr::Bold),
Cell::new(&dv_str),
]));
},
}
None => { /* Do nothing if None, as per original logic */ }
}

View File

@@ -141,30 +141,24 @@ pub fn mode_list(
},
ColumnType::Compression => {
Cell::new(&string_column(item.compression.to_string(), column_width))
},
}
ColumnType::DigestType => {
Cell::new(&string_column(item.digest_type.to_string(), column_width))
},
ColumnType::DigestValue => {
match item.digest_value {
Some(ref value) => Cell::new(&string_column(value.to_string(), column_width)),
None => Cell::new("Missing")
.with_style(Attr::ForegroundColor(color::RED))
.with_style(Attr::Bold),
}
}
ColumnType::DigestValue => match item.digest_value {
Some(ref value) => Cell::new(&string_column(value.to_string(), column_width)),
None => Cell::new("Missing")
.with_style(Attr::ForegroundColor(color::RED))
.with_style(Attr::Bold),
},
ColumnType::FileSize => match item_path.metadata() {
Ok(metadata) => Cell::new_align(
&size_column(
metadata.len(),
args.options.human_readable,
column_width,
),
&size_column(metadata.len(), args.options.human_readable, column_width),
Alignment::RIGHT,
),
Err(_) => Cell::new_align("Missing", Alignment::RIGHT)
.with_style(Attr::ForegroundColor(color::RED))
.with_style(Attr::Bold),
.with_style(Attr::ForegroundColor(color::RED))
.with_style(Attr::Bold),
},
ColumnType::FilePath => Cell::new(&string_column(
item_path.clone().into_os_string().into_string().unwrap(),

View File

@@ -1,18 +1,18 @@
use anyhow::{anyhow, Context, Result};
use anyhow::{Context, Result, anyhow};
use is_terminal::IsTerminal;
use std::collections::HashMap;
use std::io::{self, Read};
use std::str::FromStr;
use clap::error::ErrorKind;
use clap::Command;
use clap::error::ErrorKind;
use log::debug;
use std::path::PathBuf;
use rusqlite::Connection;
use std::path::PathBuf;
use crate::compression_engine::{CompressionType, get_compression_engine};
use crate::db::{self};
use crate::digest_engine::{get_digest_engine, DigestType};
use crate::compression_engine::{get_compression_engine, CompressionType};
use crate::digest_engine::{DigestType, get_digest_engine};
use crate::modes::common::get_meta_from_env;
use chrono::Utc;
@@ -133,8 +133,8 @@ pub fn mode_save(
let mut stdout = io::stdout().lock();
let mut buffer = [0; libc::BUFSIZ as usize];
let compression_engine = get_compression_engine(compression_type.clone())
.expect("Unable to get compression engine");
let compression_engine =
get_compression_engine(compression_type.clone()).expect("Unable to get compression engine");
let mut item_out: Box<dyn Write> =
compression_engine
.create(item_path.clone())

View File

@@ -4,9 +4,9 @@ use std::path::PathBuf;
use strum::IntoEnumIterator;
use crate::compression_engine;
use crate::compression_engine::program::CompressionEngineProgram;
use crate::compression_engine::CompressionType;
use crate::compression_engine::COMPRESSION_PROGRAMS;
use crate::compression_engine::CompressionType;
use crate::compression_engine::program::CompressionEngineProgram;
use crate::FORMAT_BOX_CHARS_NO_BORDER_LINE_SEPARATOR;
use crate::FORMAT_NO_BORDER_LINE_SEPARATOR;
@@ -68,7 +68,7 @@ fn build_compression_table() -> Table {
b->"Decompress"));
let default_type = compression_engine::default_compression_type();
for compression_type in CompressionType::iter() {
let compression_program: CompressionEngineProgram =
match &COMPRESSION_PROGRAMS[compression_type.clone()] {
@@ -109,9 +109,9 @@ fn build_compression_table() -> Table {
fn build_digest_table() -> Table {
use crate::digest_engine;
use crate::digest_engine::program::DigestEngineProgram;
use crate::digest_engine::DigestType;
use crate::digest_engine::DIGEST_PROGRAMS;
use crate::digest_engine::DigestType;
use crate::digest_engine::program::DigestEngineProgram;
let mut digest_table = Table::new();
if std::io::stdout().is_terminal() {
@@ -128,17 +128,16 @@ fn build_digest_table() -> Table {
b->"Args"));
let default_type = digest_engine::default_digest_type();
for digest_type in DigestType::iter() {
let digest_program: DigestEngineProgram =
match &DIGEST_PROGRAMS[digest_type.clone()] {
Some(digest_program) => digest_program.clone(),
None => DigestEngineProgram {
program: "".to_string(),
args: Vec::new(),
supported: true,
},
};
let digest_program: DigestEngineProgram = match &DIGEST_PROGRAMS[digest_type.clone()] {
Some(digest_program) => digest_program.clone(),
None => DigestEngineProgram {
program: "".to_string(),
args: Vec::new(),
supported: true,
},
};
let is_default = digest_type == default_type;
@@ -172,15 +171,12 @@ pub fn mode_status(
db_path: PathBuf,
) -> Result<(), anyhow::Error> {
println!("PATHS:");
build_path_table(data_path, db_path)
.printstd();
build_path_table(data_path, db_path).printstd();
println!();
println!("COMPRESSION:");
build_compression_table()
.printstd();
build_compression_table().printstd();
println!();
println!("DIGEST:");
build_digest_table()
.printstd();
build_digest_table().printstd();
Ok(())
}

View File

@@ -4,10 +4,10 @@ use std::str::FromStr;
use crate::compression_engine::{CompressionType, get_compression_engine};
use crate::db;
use clap::error::ErrorKind;
use clap::Command;
use log::{debug, info};
use crate::digest_engine;
use clap::Command;
use clap::error::ErrorKind;
use log::{debug, info};
use rusqlite::Connection;
pub fn mode_update(
@@ -46,9 +46,9 @@ 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 compression_engine =
get_compression_engine(compression_type).expect("Unable to get compression engine");
if item.size.is_none() {
info!("Updating unknown stream size");
let item_file_metadata = item_path.metadata();
@@ -66,7 +66,6 @@ pub fn mode_update(
}
}
if item.digest_value.is_none() {
let digest_type = digest_engine::DigestType::from_str(&item.digest_type)?;
@@ -81,7 +80,7 @@ pub fn mode_update(
// Create and initialize digest engine
let mut digest_engine = digest_engine::get_digest_engine(digest_type);
// Read file content and update digest
let mut reader = compression_engine.open(item_path)?;
let mut buffer = [0; 4096];
@@ -92,10 +91,10 @@ pub fn mode_update(
}
digest_engine.update(&buffer[..bytes_read]);
}
// Get final digest value
let digest_value = digest_engine.finalize()?;
// Update item with new digest value
item.digest_value = Some(digest_value);
db::update_item(conn, item.clone())?;