Add RefStore::find_storeid_by_partial_hash() helper

This commit is contained in:
Matthias Beyer 2017-10-14 13:41:44 +02:00
parent 6c387e893c
commit d37de44c94
2 changed files with 21 additions and 6 deletions

View file

@ -102,6 +102,7 @@ fn remove(rt: &Runtime) {
let yes = cmd.is_present("yes"); let yes = cmd.is_present("yes");
if yes || ask_bool(&format!("Delete Ref with hash '{}'", hash)[..], None) { if yes || ask_bool(&format!("Delete Ref with hash '{}'", hash)[..], None) {
match rt.store().get_by_partitial_hash(
match rt.store().delete_by_hash(hash) { match rt.store().delete_by_hash(hash) {
Err(e) => trace_error(&e), Err(e) => trace_error(&e),
Ok(_) => info!("Ok"), Ok(_) => info!("Ok"),

View file

@ -23,6 +23,7 @@ use std::fs::File;
use libimagstore::store::FileLockEntry; use libimagstore::store::FileLockEntry;
use libimagstore::storeid::IntoStoreId; use libimagstore::storeid::IntoStoreId;
use libimagstore::storeid::StoreId;
use libimagstore::storeid::StoreIdIterator; use libimagstore::storeid::StoreIdIterator;
use libimagstore::store::Store; use libimagstore::store::Store;
@ -47,6 +48,10 @@ pub trait RefStore {
/// Returns None if the hash cannot be found. /// Returns None if the hash cannot be found.
fn get_by_hash<'a>(&'a self, hash: String) -> Result<Option<FileLockEntry<'a>>>; fn get_by_hash<'a>(&'a self, hash: String) -> Result<Option<FileLockEntry<'a>>>;
/// Find a store id by partial ref (also see documentation for
/// `RefStore::get_by_partitial_hash()`.
fn find_storeid_by_partial_hash(&self, hash: &String) -> Result<Option<StoreId>>;
/// Get a Ref object from the store by (eventually partial) hash. /// Get a Ref object from the store by (eventually partial) hash.
/// ///
/// If the hash is complete, `RefStore::get_by_hash()` should be used as it is cheaper. /// If the hash is complete, `RefStore::get_by_hash()` should be used as it is cheaper.
@ -123,23 +128,32 @@ impl RefStore for Store {
.map_err(From::from) .map_err(From::from)
} }
/// Get a Ref object from the store by (eventually partial) hash. fn find_storeid_by_partial_hash(&self, hash: &String) -> Result<Option<StoreId>> {
/// debug!("Trying to find '{}' in store...", hash);
/// If the hash is complete, `RefStore::get_by_hash()` should be used as it is cheaper.
/// If the hash comes from user input and thus might be abbreviated, this function can be used.
fn get_by_partitial_hash<'a>(&'a self, hash: &String) -> Result<Option<FileLockEntry<'a>>> {
for id in self.retrieve_for_module("ref")? { for id in self.retrieve_for_module("ref")? {
let components_have_hash = id let components_have_hash = id
.components() .components()
.any(|c| c.as_os_str().to_str().map(|s| s.contains(hash)).unwrap_or(false)); .any(|c| c.as_os_str().to_str().map(|s| s.contains(hash)).unwrap_or(false));
if components_have_hash { if components_have_hash {
return self.get(id).map_err(From::from); debug!("Found hash '{}' in {:?}", hash, id);
return Ok(Some(id))
} }
} }
Ok(None) Ok(None)
} }
/// Get a Ref object from the store by (eventually partial) hash.
///
/// If the hash is complete, `RefStore::get_by_hash()` should be used as it is cheaper.
/// If the hash comes from user input and thus might be abbreviated, this function can be used.
fn get_by_partitial_hash<'a>(&'a self, hash: &String) -> Result<Option<FileLockEntry<'a>>> {
match self.find_storeid_by_partial_hash(hash)? {
Some(id) => self.get(id).map_err(From::from),
None => Ok(None),
}
}
/// Delete a ref by hash /// Delete a ref by hash
/// ///
/// If the returned Result contains an error, the ref might not be deleted. /// If the returned Result contains an error, the ref might not be deleted.