feat: add diff mode to compare items
This commit is contained in:
committed by
Andrew Phillips (aider)
parent
f39a781caf
commit
c1e04fc9c5
76
src/main.rs
76
src/main.rs
@@ -34,6 +34,7 @@ extern crate lazy_static;
|
|||||||
|
|
||||||
pub mod compression;
|
pub mod compression;
|
||||||
pub mod db;
|
pub mod db;
|
||||||
|
//pub mod item;
|
||||||
|
|
||||||
use compression::CompressionType;
|
use compression::CompressionType;
|
||||||
use compression::program::CompressionEngineProgram;
|
use compression::program::CompressionEngineProgram;
|
||||||
@@ -87,31 +88,35 @@ struct Args {
|
|||||||
|
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
struct ModeArgs {
|
struct ModeArgs {
|
||||||
#[arg(group("mode"), help_heading("Mode Options"), short, long, conflicts_with_all(["get", "list", "update", "delete", "info", "status"]))]
|
#[arg(group("mode"), help_heading("Mode Options"), short, long, conflicts_with_all(["get", "diff", "list", "update", "delete", "info", "status"]))]
|
||||||
#[arg(help("Save an item using any tags or metadata provided"))]
|
#[arg(help("Save an item using any tags or metadata provided"))]
|
||||||
save: bool,
|
save: bool,
|
||||||
|
|
||||||
#[arg(group("mode"), help_heading("Mode Options"), short, long, conflicts_with_all(["save", "list", "update", "delete", "info", "status"]))]
|
#[arg(group("mode"), help_heading("Mode Options"), short, long, conflicts_with_all(["save", "diff", "list", "update", "delete", "info", "status"]))]
|
||||||
#[arg(help("Get an item either by it's ID or by a combination of matching tags and metatdata"))]
|
#[arg(help("Get an item either by it's ID or by a combination of matching tags and metatdata"))]
|
||||||
get: bool,
|
get: bool,
|
||||||
|
|
||||||
#[arg(group("mode"), help_heading("Mode Options"), short, long, conflicts_with_all(["save", "get", "update", "delete", "info", "status"]))]
|
#[arg(group("mode"), help_heading("Mode Options"), long, conflicts_with_all(["save", "get", "list", "update", "delete", "info", "status"]))]
|
||||||
|
#[arg(help("Show a diff between two items by ID"))]
|
||||||
|
diff: bool,
|
||||||
|
|
||||||
|
#[arg(group("mode"), help_heading("Mode Options"), short, long, conflicts_with_all(["save", "get", "diff", "update", "delete", "info", "status"]))]
|
||||||
#[arg(help("List items, filtering on tags or metadata if given"))]
|
#[arg(help("List items, filtering on tags or metadata if given"))]
|
||||||
list: bool,
|
list: bool,
|
||||||
|
|
||||||
#[arg(group("mode"), help_heading("Mode Options"), short, long, conflicts_with_all(["save", "get", "list", "delete", "info", "status"]), requires("ids_or_tags"))]
|
#[arg(group("mode"), help_heading("Mode Options"), short, long, conflicts_with_all(["save", "get", "diff", "list", "delete", "info", "status"]), requires("ids_or_tags"))]
|
||||||
#[arg(help("Update a specified item ID's tags and/or metadata"))]
|
#[arg(help("Update a specified item ID's tags and/or metadata"))]
|
||||||
update: bool,
|
update: bool,
|
||||||
|
|
||||||
#[arg(group("mode"), help_heading("Mode Options"), short, long, conflicts_with_all(["save", "get", "list", "update", "info", "status"]), requires("ids_or_tags"))]
|
#[arg(group("mode"), help_heading("Mode Options"), short, long, conflicts_with_all(["save", "get", "diff", "list", "update", "info", "status"]), requires("ids_or_tags"))]
|
||||||
#[arg(help("Delete items either by ID or by matching tags"))]
|
#[arg(help("Delete items either by ID or by matching tags"))]
|
||||||
delete: bool,
|
delete: bool,
|
||||||
|
|
||||||
#[arg(group("mode"), help_heading("Mode Options"), short, long, conflicts_with_all(["save", "get", "list", "update", "delete", "status"]), requires("ids_or_tags"))]
|
#[arg(group("mode"), help_heading("Mode Options"), short, long, conflicts_with_all(["save", "get", "diff", "list", "update", "delete", "status"]), requires("ids_or_tags"))]
|
||||||
#[arg(help("Get an item either by it's ID or by a combination of matching tags and metatdata"))]
|
#[arg(help("Get an item either by it's ID or by a combination of matching tags and metatdata"))]
|
||||||
info: bool,
|
info: bool,
|
||||||
|
|
||||||
#[arg(group("mode"), help_heading("Mode Options"), short('S'), long, conflicts_with_all(["save", "get", "list", "update", "delete", "info"]))]
|
#[arg(group("mode"), help_heading("Mode Options"), short('S'), long, conflicts_with_all(["save", "get", "diff", "list", "update", "delete", "info"]))]
|
||||||
#[arg(help("Show status of directories and supported compression algorithms"))]
|
#[arg(help("Show status of directories and supported compression algorithms"))]
|
||||||
status: bool
|
status: bool
|
||||||
}
|
}
|
||||||
@@ -148,7 +153,7 @@ struct OptionsArgs {
|
|||||||
verbose: u8,
|
verbose: u8,
|
||||||
|
|
||||||
#[arg(short, long)]
|
#[arg(short, long)]
|
||||||
#[arg(help("Do show any messages"))]
|
#[arg(help("Do not show any messages"))]
|
||||||
quiet: bool,
|
quiet: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,6 +163,7 @@ enum KeepModes {
|
|||||||
Unknown,
|
Unknown,
|
||||||
Save,
|
Save,
|
||||||
Get,
|
Get,
|
||||||
|
Diff,
|
||||||
List,
|
List,
|
||||||
Update,
|
Update,
|
||||||
Delete,
|
Delete,
|
||||||
@@ -248,6 +254,8 @@ fn main() -> Result<(), Error> {
|
|||||||
mode = KeepModes::Save;
|
mode = KeepModes::Save;
|
||||||
} else if args.mode.get {
|
} else if args.mode.get {
|
||||||
mode = KeepModes::Get;
|
mode = KeepModes::Get;
|
||||||
|
} else if args.mode.diff {
|
||||||
|
mode = KeepModes::Diff;
|
||||||
} else if args.mode.list {
|
} else if args.mode.list {
|
||||||
mode = KeepModes::List;
|
mode = KeepModes::List;
|
||||||
} else if args.mode.delete {
|
} else if args.mode.delete {
|
||||||
@@ -302,6 +310,7 @@ fn main() -> Result<(), Error> {
|
|||||||
match mode {
|
match mode {
|
||||||
KeepModes::Save => mode_save(&mut cmd, args, ids, tags, conn, data_path)?,
|
KeepModes::Save => mode_save(&mut cmd, args, ids, tags, conn, data_path)?,
|
||||||
KeepModes::Get => mode_get(&mut cmd, args, ids, tags, &mut conn, data_path)?,
|
KeepModes::Get => mode_get(&mut cmd, args, ids, tags, &mut conn, data_path)?,
|
||||||
|
KeepModes::Diff => mode_diff(&mut cmd, args, ids, tags, &mut conn, data_path)?,
|
||||||
KeepModes::List => mode_list(&mut cmd, args, ids, tags, &mut conn, data_path)?,
|
KeepModes::List => mode_list(&mut cmd, args, ids, tags, &mut conn, data_path)?,
|
||||||
KeepModes::Update => mode_update(&mut cmd, args, ids, tags, &mut conn, data_path)?,
|
KeepModes::Update => mode_update(&mut cmd, args, ids, tags, &mut conn, data_path)?,
|
||||||
KeepModes::Info => mode_info(&mut cmd, args, ids, tags, &mut conn, data_path)?,
|
KeepModes::Info => mode_info(&mut cmd, args, ids, tags, &mut conn, data_path)?,
|
||||||
@@ -470,6 +479,56 @@ fn mode_get(cmd: &mut Command, args: Args, ids: &mut Vec<i64>, tags: &mut Vec<St
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn mode_diff(cmd: &mut Command, args: Args, ids: &mut Vec<i64>, tags: &mut Vec<String>, conn: &mut Connection, data_path: PathBuf) -> Result<()> {
|
||||||
|
|
||||||
|
if ! tags.is_empty() {
|
||||||
|
cmd.error(ErrorKind::InvalidValue, "Tags given, you must supply exactly two IDs when using --diff").exit();
|
||||||
|
} else if ids.len() > 2 || ids.len() < 1 {
|
||||||
|
cmd.error(ErrorKind::InvalidValue, "You must supply exactly one or two IDs when using --diff").exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
let item_a: Option<db::Item> = db::get_item(conn, ids[0])?;
|
||||||
|
|
||||||
|
let mut item_b: Option<db::Item> = None;
|
||||||
|
if ids.len() == 2 {
|
||||||
|
item_b = db::get_item(conn, ids[1])?;
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(item_a) = item_a {
|
||||||
|
debug!("MAIN: Found item A {:?}", item_a);
|
||||||
|
|
||||||
|
let mut item_path_a = data_path.clone();
|
||||||
|
item_path_a.push(item_a.id.unwrap().to_string());
|
||||||
|
|
||||||
|
let compression_type_a = CompressionType::from_str(&item_a.compression)?;
|
||||||
|
debug!("MAIN: Item A has compression type {:?}", compression_type_a.clone());
|
||||||
|
|
||||||
|
let compression_engine_a = compression::get_engine(compression_type_a).expect("Unable to get compression engine");
|
||||||
|
|
||||||
|
if let Some(item_b) = item_b {
|
||||||
|
debug!("MAIN: Found item B {:?}", item_b);
|
||||||
|
|
||||||
|
let mut item_path_b = data_path.clone();
|
||||||
|
item_path_b.push(item_b.id.unwrap().to_string());
|
||||||
|
|
||||||
|
let compression_type_b = CompressionType::from_str(&item_b.compression)?;
|
||||||
|
debug!("MAIN: Item B has compression type {:?}", compression_type_b.clone());
|
||||||
|
|
||||||
|
let compression_engine_b = compression::get_engine(compression_type_b).expect("Unable to get compression engine");
|
||||||
|
|
||||||
|
let program = "diff";
|
||||||
|
let args = ["-u"];
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
} else {
|
||||||
|
Err(anyhow!("Unable to find second item in database"))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Err(anyhow!("Unable to find first item in database"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
fn mode_list(cmd: &mut Command, args: Args, ids: &mut Vec<i64>, tags: &Vec<String>, conn: &mut Connection, data_path: PathBuf) -> Result<()> {
|
fn mode_list(cmd: &mut Command, args: Args, ids: &mut Vec<i64>, tags: &Vec<String>, conn: &mut Connection, data_path: PathBuf) -> Result<()> {
|
||||||
if ! ids.is_empty() {
|
if ! ids.is_empty() {
|
||||||
cmd.error(ErrorKind::InvalidValue, "ID given, you can only supply tags when using --list").exit();
|
cmd.error(ErrorKind::InvalidValue, "ID given, you can only supply tags when using --list").exit();
|
||||||
@@ -907,7 +966,6 @@ fn format_size_human_readable(size: u64) -> String {
|
|||||||
humansize::format_size(size, options)
|
humansize::format_size(size, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn format_size(size: u64, human_readable: bool) -> String {
|
fn format_size(size: u64, human_readable: bool) -> String {
|
||||||
match human_readable {
|
match human_readable {
|
||||||
true => format_size_human_readable(size),
|
true => format_size_human_readable(size),
|
||||||
|
|||||||
Reference in New Issue
Block a user