feat: add compression and digest support with database schema updates
This commit is contained in:
committed by
Andrew Phillips (aider)
parent
9b61a37036
commit
bbdfe19836
@@ -1,4 +1,4 @@
|
||||
use humansize::{FormatSizeOptions, BINARY};
|
||||
use humansize::{BINARY, FormatSizeOptions};
|
||||
use log::debug;
|
||||
use prettytable::format::TableFormat;
|
||||
use regex::Regex;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 */ }
|
||||
}
|
||||
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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(())
|
||||
}
|
||||
|
||||
@@ -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())?;
|
||||
|
||||
Reference in New Issue
Block a user