kitab

Unnamed repository; edit this file 'description' to name the repository.
Info | Log | Files | Refs | LICENSE

commit 88080f1563b78b2114c5a011785b057a2f117010
parent 120b3b63a71b3a0ce0d54f4e8bc6e91a60d3d671
Author: lash <dev@holbrook.no>
Date:   Wed, 28 Sep 2022 07:42:14 +0000

Add multiple digests for xattr import

Diffstat:
Msrc/biblatex.rs | 4++--
Msrc/digest.rs | 45++++++++++++++++++++++++++++++++++-----------
Msrc/main.rs | 65++++++++++++++++++++++++++++++++++++++++++++++-------------------
3 files changed, 82 insertions(+), 32 deletions(-)

diff --git a/src/biblatex.rs b/src/biblatex.rs @@ -77,8 +77,6 @@ pub fn read_all(mut r: impl Read, digests: &Vec<RecordDigest>) -> Result<Vec<Met // use clone instead let digest = parse_digest(&e); match digest { - RecordDigest::Empty => { - }, RecordDigest::Sha512(r) => { use_digests.push(RecordDigest::Sha512(r)); }, @@ -91,6 +89,8 @@ pub fn read_all(mut r: impl Read, digests: &Vec<RecordDigest>) -> Result<Vec<Met RecordDigest::SwarmHash(r) => { use_digests.push(RecordDigest::SwarmHash(r)); }, + _ => { + }, } for v in digests { diff --git a/src/digest.rs b/src/digest.rs @@ -1,4 +1,5 @@ use std::marker::Copy; +use std::io::Read; use std::fmt; use std::str::FromStr; @@ -12,6 +13,7 @@ use sha2::{ use log::error; +#[derive(Copy, Clone)] pub enum DigestType { Sha512, #[cfg(feature="digest_md5")] @@ -35,21 +37,25 @@ impl FromStr for DigestType { } } +impl DigestType { + pub fn digest_for(&self, f: impl Read) -> RecordDigest { + RecordDigest::Empty + } +} + /// Encapsulations of supported digests for digest data. pub enum RecordDigest { Sha512(Vec<u8>), Sha256(Vec<u8>), MD5(Vec<u8>), SwarmHash(Vec<u8>), + EmptyWithType(DigestType), Empty, } impl Clone for RecordDigest { fn clone(&self) -> RecordDigest { match self { - RecordDigest::Empty => { - RecordDigest::Empty - }, RecordDigest::Sha512(v) => { RecordDigest::Sha512(v.to_vec()) }, @@ -62,6 +68,9 @@ impl Clone for RecordDigest { RecordDigest::SwarmHash(v) => { RecordDigest::SwarmHash(v.to_vec()) }, + _ => { + RecordDigest::Empty + }, } } } @@ -69,9 +78,6 @@ impl Clone for RecordDigest { impl RecordDigest { pub fn fingerprint(&self) -> Vec<u8> { match self { - RecordDigest::Empty => { - return vec!(); - }, RecordDigest::Sha512(v) => { return v.to_vec(); }, @@ -84,6 +90,9 @@ impl RecordDigest { RecordDigest::SwarmHash(v) => { return v.to_vec(); }, + _ => { + return vec!() + }, } } @@ -92,9 +101,6 @@ impl RecordDigest { /// TODO: implememt in fmt for digest instead pub fn urn(&self) -> String { match self { - RecordDigest::Empty => { - return String::new(); - }, RecordDigest::Sha512(v) => { return String::from("sha512:") + hex::encode(&v).as_str(); }, @@ -107,6 +113,9 @@ impl RecordDigest { RecordDigest::SwarmHash(v) => { return hex::encode(&v); }, + _ => { + return String::new(); + }, } } } @@ -139,7 +148,14 @@ pub fn from_urn(urn: &str) -> Result<RecordDigest, ParseError> { let mut v = urn.split(":"); let r = match v.next() { Some("sha512") => { - let digest_hex = v.next().unwrap(); + let digest_hex = match v.next() { + Some(r) => { + r + }, + None => { + return Err(ParseError::new("not a valid digest urn")); + }, + }; let digest = hex::decode(digest_hex).unwrap(); match from_vec(digest) { Ok(vv) => { @@ -162,7 +178,14 @@ pub fn from_urn(urn: &str) -> Result<RecordDigest, ParseError> { RecordDigest::Sha256(digest) }, Some("md5") => { - let digest_hex = v.next().unwrap(); + let digest_hex = match v.next() { + Some(r) => { + r + }, + None => { + return Err(ParseError::new("not a valid digest urn")); + }, + }; let digest = hex::decode(digest_hex).unwrap(); if digest.len() != 16 { diff --git a/src/main.rs b/src/main.rs @@ -188,8 +188,8 @@ fn store(index_path: &Path, m: &MetaData) { debug!("stored as rdf {:?}", fp); } -fn exec_import_xattr(f: &Path, index_path: &Path) -> bool { - let m = match MetaData::from_xattr(f) { +fn exec_import_xattr(f: &Path, index_path: &Path, digests: &Vec<RecordDigest>) -> bool { + let mut m = match MetaData::from_xattr(f) { Ok(r) => { r } @@ -201,7 +201,27 @@ fn exec_import_xattr(f: &Path, index_path: &Path) -> bool { debug!("successfully processed xattr import source"); info!("importing xattr source {:?}", &m); - store(index_path, &m); + + let mut digest_types: Vec<DigestType> = vec!(); + + for v in digests.iter() { + match v { + RecordDigest::EmptyWithType(digest_typ) => { + digest_types.push(*digest_typ); + }, + RecordDigest::Empty => { + digest_types.push(DigestType::Sha512); + }, + _ => { + warn!("digest specifier {:?} is invalid in xattr import context.", v); + }, + }; + } + + for v in digests_from_path(f, &digest_types) { + m.set_fingerprint(v); + store(index_path, &m); + } true } @@ -240,7 +260,7 @@ fn exec_import_biblatex(f: &Path, index_path: &Path, digests: &Vec<RecordDigest> for m in entries { info!("importing biblatex source {:?}", &m); - store(index_path, &m); + store(index_path, &m); } true @@ -282,8 +302,7 @@ fn exec_import(p: &Path, index_path: &Path, digests: Vec<RecordDigest>) { let fp = entry.path(); debug!("attempt xattr import {:?}", fp); - //if exec_import_xattr(fp, index_path, &digests) { - if exec_import_xattr(fp, index_path) { + if exec_import_xattr(fp, index_path, &digests) { continue; } @@ -294,7 +313,6 @@ fn exec_import(p: &Path, index_path: &Path, digests: Vec<RecordDigest>) { } debug!("attempt rdf import {:?}", fp); - //if exec_import_rdf(fp, index_path, &digests) { if exec_import_rdf(fp, index_path) { continue; } @@ -334,7 +352,16 @@ fn main() { digests.push(digest); }, Err(e) => { - panic!("invalid digest URN: {:?}", e); + let digest_type = match DigestType::from_str(digest_str) { + Ok(v) => { + v + }, + Err(e) => { + panic!("invalid digest specifier: {:?}", e); + }, + }; + let digest_empty = RecordDigest::EmptyWithType(digest_type); + digests.push(digest_empty); }, } } @@ -356,7 +383,7 @@ fn main() { match arg.values_of("adddigest") { Some(r) => { for digest_str in r { - match DigestType::from_str(&digest_str) { + match DigestType::from_str(digest_str.clone()) { Ok(digest) => { info!("using digest type {}", digest_str); digests.push(digest); @@ -378,14 +405,14 @@ fn main() { _ => {}, } - match args.subcommand_matches("new") { - Some(v) => { - let p = str_to_path(v); - info!("new metadata for path {:?}", &p); - if !exec_entry(p.as_path(), index_dir.as_path()) { - r = false; - } - }, - _ => {}, - } +// match args.subcommand_matches("new") { +// Some(v) => { +// let p = str_to_path(v); +// info!("new metadata for path {:?}", &p); +// if !exec_entry(p.as_path(), index_dir.as_path()) { +// r = false; +// } +// }, +// _ => {}, +// } }