diff --git a/Cargo.lock b/Cargo.lock index 6a232f6..fbf8b9a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "ahash" version = "0.7.6" @@ -68,6 +74,12 @@ dependencies = [ "generic-array 0.14.6", ] +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + [[package]] name = "cfg-if" version = "1.0.0" @@ -113,6 +125,15 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -159,6 +180,28 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" +[[package]] +name = "filetime" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a3de6e8d11b22ff9edc6d916f890800597d60f8b2da1caf2955c274638d6412" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "windows-sys", +] + +[[package]] +name = "flate2" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "fs_extra" version = "1.2.0" @@ -248,6 +291,17 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "lzma-sys" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + [[package]] name = "man" version = "0.3.0" @@ -269,6 +323,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "miniz_oxide" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +dependencies = [ + "adler", +] + [[package]] name = "nom" version = "7.1.1" @@ -409,6 +472,12 @@ dependencies = [ "sha1", ] +[[package]] +name = "pkg-config" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" + [[package]] name = "proc-macro2" version = "1.0.43" @@ -543,6 +612,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tar" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" +dependencies = [ + "filetime", + "libc", + "xattr", +] + [[package]] name = "thiserror" version = "1.0.34" @@ -598,9 +678,12 @@ dependencies = [ "colored", "config", "dirs", + "flate2", "fs_extra", "man", "size_format", + "tar", + "xz2", ] [[package]] @@ -637,6 +720,90 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" + +[[package]] +name = "xattr" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +dependencies = [ + "libc", +] + +[[package]] +name = "xz2" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" +dependencies = [ + "lzma-sys", +] + [[package]] name = "yaml-rust" version = "0.4.5" diff --git a/Cargo.toml b/Cargo.toml index c102a8e..3ceb38c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,6 +22,9 @@ fs_extra = "1.2.0" anyhow = "1.0" size_format = "1.0.2" config = "0.13.1" +flate2 = "1.0" +xz2 = "0.1" +tar = "0.4" [build-dependencies] man = "0.3.0" diff --git a/src/archive.rs b/src/archive.rs new file mode 100644 index 0000000..2cdcbf6 --- /dev/null +++ b/src/archive.rs @@ -0,0 +1,53 @@ +/* + * Vento, a CLI inventory for your files. + * Copyright (C) 2023 Lux Aliaga + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +use crate::common; +use anyhow::Result; +use colored::Colorize; +use std::{fs::File, path::PathBuf}; +use xz2::write::XzEncoder; + +pub fn export_inv(slot: &str, output: PathBuf, message: bool) -> Result<()> { + let slotdir: PathBuf = match slot { + "active" | "a" => common::env_config()?.active_dir, + "inactive" | "i" => common::env_config()?.inactive_dir, + _ => PathBuf::new(), + }; + + let archive = File::create(&output)?; + let enc = XzEncoder::new(archive, 9); + let mut tar = tar::Builder::new(enc); + tar.append_dir_all("", slotdir)?; + + if message { + println!( + "✅ {} {} {} {}", + "Exported".green(), + match slot { + "a" => "active", + "i" => "inactive", + _ => &slot, + } + .bold(), + "slot into".green(), + &output.to_str().unwrap() + ); + }; + Ok(()) +} diff --git a/src/bin/vento.rs b/src/bin/vento.rs index a3df48b..61ece31 100644 --- a/src/bin/vento.rs +++ b/src/bin/vento.rs @@ -18,8 +18,9 @@ */ use anyhow::Result; -use std::env; +use std::{env, path::PathBuf}; use vento::{ + archive, error::{throw_error, ErrorType}, help, history, inv, }; @@ -42,6 +43,23 @@ fn main() -> Result<()> { "-i" | "--init" => inv::init()?, "-c" | "--switch" => inv::switch(true)?, "-u" | "--undo" => history::undo()?, + "-e" | "--export-inv" => match args.len() { + 4 => archive::export_inv(&args[2], PathBuf::from(&args[3]), true)?, + 3 => match args[2].as_str() { + "active" | "a" | "inactive" | "i" => { + let mut path = PathBuf::from(match args[2].as_str() { + "a" => "active", + "i" => "inactive", + _ => &args[2], + }); + path.set_extension("tar.xz"); + archive::export_inv(&args[2], path, true)? + } + _ => archive::export_inv("active", PathBuf::from(&args[2]), true)?, + }, + 2 => archive::export_inv("active", PathBuf::from("active.tar.xz"), true)?, + _ => throw_error(ErrorType::TooManyArgs)?, + }, "-s" => match args.len() { 4 => inv::list(&args[2], &args[3])?, 3 => inv::list(&args[2], "")?, diff --git a/src/lib.rs b/src/lib.rs index b25da4b..e218b03 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -17,6 +17,7 @@ * */ +pub mod archive; pub mod common; pub mod error; pub mod help;