summaryrefslogtreecommitdiffstats
path: root/lib/core/libimagstore
diff options
context:
space:
mode:
Diffstat (limited to 'lib/core/libimagstore')
-rw-r--r--lib/core/libimagstore/Cargo.toml6
-rw-r--r--lib/core/libimagstore/src/file_abstraction/fs.rs20
-rw-r--r--lib/core/libimagstore/src/file_abstraction/inmemory.rs6
-rw-r--r--lib/core/libimagstore/src/file_abstraction/stdio/mapper/json.rs10
-rw-r--r--lib/core/libimagstore/src/file_abstraction/stdio/mod.rs9
-rw-r--r--lib/core/libimagstore/src/file_abstraction/stdio/out.rs2
-rw-r--r--lib/core/libimagstore/src/store.rs119
-rw-r--r--lib/core/libimagstore/src/storeid.rs8
-rw-r--r--lib/core/libimagstore/src/util.rs2
9 files changed, 93 insertions, 89 deletions
diff --git a/lib/core/libimagstore/Cargo.toml b/lib/core/libimagstore/Cargo.toml
index 0f664d35..0fce876d 100644
--- a/lib/core/libimagstore/Cargo.toml
+++ b/lib/core/libimagstore/Cargo.toml
@@ -13,6 +13,12 @@ documentation = "https://matthiasbeyer.github.io/imag/imag_documentation/index.h
repository = "https://github.com/matthiasbeyer/imag"
homepage = "http://imag-pim.org"
+[badges]
+travis-ci = { repository = "matthiasbeyer/imag" }
+is-it-maintained-issue-resolution = { repository = "matthiasbeyer/imag" }
+is-it-maintained-open-issues = { repository = "matthiasbeyer/imag" }
+maintenance = { status = "actively-developed" }
+
[dependencies]
glob = "0.2.11"
lazy_static = "0.2"
diff --git a/lib/core/libimagstore/src/file_abstraction/fs.rs b/lib/core/libimagstore/src/file_abstraction/fs.rs
index 0773a178..7dad3361 100644
--- a/lib/core/libimagstore/src/file_abstraction/fs.rs
+++ b/lib/core/libimagstore/src/file_abstraction/fs.rs
@@ -48,8 +48,8 @@ impl FileAbstractionInstance for FSFileAbstractionInstance {
FSFileAbstractionInstance::File(ref mut f, _) => return {
// We seek to the beginning of the file since we expect each
// access to the file to be in a different context
- try!(f.seek(SeekFrom::Start(0))
- .chain_err(|| SEK::FileNotSeeked));
+ f.seek(SeekFrom::Start(0))
+ .chain_err(|| SEK::FileNotSeeked)?;
let mut s = String::new();
f.read_to_string(&mut s)
@@ -58,7 +58,7 @@ impl FileAbstractionInstance for FSFileAbstractionInstance {
.and_then(|s| Entry::from_str(id, &s))
},
FSFileAbstractionInstance::Absent(ref p) =>
- (try!(open_file(p).chain_err(|| SEK::FileNotFound)), p.clone()),
+ (open_file(p).chain_err(|| SEK::FileNotFound)?, p.clone()),
};
*self = FSFileAbstractionInstance::File(file, path);
if let FSFileAbstractionInstance::File(ref mut f, _) = *self {
@@ -84,15 +84,15 @@ impl FileAbstractionInstance for FSFileAbstractionInstance {
FSFileAbstractionInstance::File(ref mut f, _) => return {
// We seek to the beginning of the file since we expect each
// access to the file to be in a different context
- try!(f.seek(SeekFrom::Start(0))
- .chain_err(|| SEK::FileNotCreated));
+ f.seek(SeekFrom::Start(0))
+ .chain_err(|| SEK::FileNotCreated)?;
- try!(f.set_len(buf.len() as u64).chain_err(|| SEK::FileNotWritten));
+ f.set_len(buf.len() as u64).chain_err(|| SEK::FileNotWritten)?;
f.write_all(&buf).chain_err(|| SEK::FileNotWritten)
},
FSFileAbstractionInstance::Absent(ref p) =>
- (try!(create_file(p).chain_err(|| SEK::FileNotCreated)), p.clone()),
+ (create_file(p).chain_err(|| SEK::FileNotCreated)?, p.clone()),
};
*self = FSFileAbstractionInstance::File(file, path);
if let FSFileAbstractionInstance::File(ref mut f, _) = *self {
@@ -129,7 +129,7 @@ impl FileAbstraction for FSFileAbstraction {
match to.parent() {
Some(p) => if !p.exists() {
debug!("Creating: {:?}", p);
- let _ = try!(create_dir_all(&PathBuf::from(p)));
+ let _ = create_dir_all(&PathBuf::from(p))?;
},
None => {
debug!("Failed to find parent. This looks like it will fail now");
@@ -184,11 +184,11 @@ impl FileAbstraction for FSFileAbstraction {
})
.fold(Ok(vec![]), |acc, e| {
acc.and_then(move |mut a| {
- a.push(try!(e));
+ a.push(e?);
Ok(a)
})
});
- Ok(PathIterator::new(Box::new(try!(i).into_iter())))
+ Ok(PathIterator::new(Box::new(i?.into_iter())))
}
}
diff --git a/lib/core/libimagstore/src/file_abstraction/inmemory.rs b/lib/core/libimagstore/src/file_abstraction/inmemory.rs
index 9a9adf67..094a5af0 100644
--- a/lib/core/libimagstore/src/file_abstraction/inmemory.rs
+++ b/lib/core/libimagstore/src/file_abstraction/inmemory.rs
@@ -131,7 +131,7 @@ impl FileAbstraction for InMemoryFileAbstraction {
let mut mtx = self.backend().lock().expect("Locking Mutex failed");
let backend = mtx.get_mut();
- let a = try!(backend.get(from).cloned().ok_or(SE::from_kind(SEK::FileNotFound)));
+ let a = backend.get(from).cloned().ok_or(SE::from_kind(SEK::FileNotFound))?;
backend.insert(to.clone(), a);
debug!("Copying: {:?} -> {:?} worked", from, to);
Ok(())
@@ -142,7 +142,7 @@ impl FileAbstraction for InMemoryFileAbstraction {
let mut mtx = self.backend().lock().expect("Locking Mutex failed");
let backend = mtx.get_mut();
- let a = try!(backend.get(from).cloned().ok_or(SE::from_kind(SEK::FileNotFound)));
+ let a = backend.get(from).cloned().ok_or(SE::from_kind(SEK::FileNotFound))?;
backend.insert(to.clone(), a);
debug!("Renaming: {:?} -> {:?} worked", from, to);
Ok(())
@@ -176,7 +176,7 @@ impl FileAbstraction for InMemoryFileAbstraction {
fn fill<'a>(&'a mut self, mut d: Drain) -> Result<(), SE> {
debug!("Draining into : {:?}", self);
- let mut mtx = try!(self.backend().lock().map_err(|_| SEK::LockError));
+ let mut mtx = self.backend().lock().map_err(|_| SEK::LockError)?;
let backend = mtx.get_mut();
for (path, element) in d.iter() {
diff --git a/lib/core/libimagstore/src/file_abstraction/stdio/mapper/json.rs b/lib/core/libimagstore/src/file_abstraction/stdio/mapper/json.rs
index 3bd46d6c..7bc8fc9d 100644
--- a/lib/core/libimagstore/src/file_abstraction/stdio/mapper/json.rs
+++ b/lib/core/libimagstore/src/file_abstraction/stdio/mapper/json.rs
@@ -73,15 +73,15 @@ impl Mapper for JsonMapper {
let mut document = {
debug!("Reading Document");
let mut s = String::new();
- try!(r.read_to_string(&mut s).chain_err(|| SEK::IoError));
+ r.read_to_string(&mut s).chain_err(|| SEK::IoError)?;
debug!("Document = {:?}", s);
debug!("Parsing Document");
- let doc : Document = try!(serde_json::from_str(&s).chain_err(|| SEK::IoError));
+ let doc : Document = serde_json::from_str(&s).chain_err(|| SEK::IoError)?;
debug!("Document = {:?}", doc);
doc
};
- let _ = try!(::semver::Version::parse(&document.version)
+ let _ = ::semver::Version::parse(&document.version)
.chain_err(|| SEK::VersionError)
.and_then(|doc_vers| {
// safe because cargo does not compile if crate version is not valid
@@ -96,7 +96,7 @@ impl Mapper for JsonMapper {
} else {
Ok(())
}
- }));
+ })?;
for (key, val) in document.store.drain() {
debug!("(key, value) ({:?}, {:?})", key, val);
@@ -110,7 +110,7 @@ impl Mapper for JsonMapper {
})
.map(|_| ());
- let _ = try!(res);
+ let _ = res?;
}
Ok(())
diff --git a/lib/core/libimagstore/src/file_abstraction/stdio/mod.rs b/lib/core/libimagstore/src/file_abstraction/stdio/mod.rs
index 7bf4f425..5b93f6f0 100644
--- a/lib/core/libimagstore/src/file_abstraction/stdio/mod.rs
+++ b/lib/core/libimagstore/src/file_abstraction/stdio/mod.rs
@@ -56,11 +56,10 @@ impl<W, M> StdIoFileAbstraction<W, M>
pub fn new<R: Read>(in_stream: &mut R, out_stream: Rc<RefCell<W>>, mapper: M) -> Result<StdIoFileAbstraction<W, M>, SE> {
StdoutFileAbstraction::new(out_stream, mapper)
.and_then(|out| {
- let _ = try!(out
- .backend()
- .lock()
- .map_err(|_| SE::from_kind(SEK::LockError))
- .map(|mut mtx| out.mapper().read_to_fs(in_stream, mtx.get_mut())));
+ let _ = out.backend()
+ .lock()
+ .map_err(|_| SE::from_kind(SEK::LockError))
+ .map(|mut mtx| out.mapper().read_to_fs(in_stream, mtx.get_mut()))?;
Ok(StdIoFileAbstraction(out))
})
diff --git a/lib/core/libimagstore/src/file_abstraction/stdio/out.rs b/lib/core/libimagstore/src/file_abstraction/stdio/out.rs
index c8540b33..5f62e899 100644
--- a/lib/core/libimagstore/src/file_abstraction/stdio/out.rs
+++ b/lib/core/libimagstore/src/file_abstraction/stdio/out.rs
@@ -150,7 +150,7 @@ impl<W: Write, M: Mapper> FileAbstraction for StdoutFileAbstraction<W, M> {
fn fill(&mut self, mut d: Drain) -> Result<(), SE> {
debug!("Draining into : {:?}", self);
- let mut mtx = try!(self.backend().lock().map_err(|_| SE::from_kind(SEK::IoError)));
+ let mut mtx = self.backend().lock().map_err(|_| SE::from_kind(SEK::IoError))?;
let backend = mtx.get_mut();
for (path, element) in d.iter() {
diff --git a/lib/core/libimagstore/src/store.rs b/lib/core/libimagstore/src/store.rs
index 21e42e4f..cdbebb50 100644
--- a/lib/core/libimagstore/src/store.rs
+++ b/lib/core/libimagstore/src/store.rs
@@ -140,13 +140,13 @@ impl Iterator for Walk {
impl StoreEntry {
fn new(id: StoreId, backend: &Box<FileAbstraction>) -> Result<StoreEntry> {
- let pb = try!(id.clone().into_pathbuf());
+ let pb = id.clone().into_pathbuf()?;
#[cfg(feature = "fs-lock")]
{
- try!(open_file(pb.clone())
+ open_file(pb.clone())
.and_then(|f| f.lock_exclusive())
- .chain_err(|| SEK::IoError));
+ .chain_err(|| SEK::IoError)?;
}
Ok(StoreEntry {
@@ -258,7 +258,7 @@ impl Store {
use configuration::*;
debug!("Validating Store configuration");
- let _ = try!(config_is_valid(&store_config).chain_err(|| SEK::ConfigurationError));
+ let _ = config_is_valid(&store_config).chain_err(|| SEK::ConfigurationError)?;
debug!("Building new Store object");
if !location.exists() {
@@ -268,9 +268,10 @@ impl Store {
.chain_err(|| SEK::IoError);
}
- try!(backend.create_dir_all(&location)
- .chain_err(|| SEK::StorePathCreate(location.clone()))
- .map_dbg_err_str("Failed"));
+ backend
+ .create_dir_all(&location)
+ .chain_err(|| SEK::StorePathCreate(location.clone()))
+ .map_dbg_err_str("Failed")?;
} else if location.is_file() {
debug!("Store path exists as file");
return Err(SE::from_kind(SEK::StorePathExists(location)));
@@ -391,7 +392,7 @@ impl Store {
/// - CreateCallError(EntryAlreadyExists()) if the entry exists already.
///
pub fn create<'a, S: IntoStoreId>(&'a self, id: S) -> Result<FileLockEntry<'a>> {
- let id = try!(id.into_storeid()).with_base(self.path().clone());
+ let id = id.into_storeid()?.with_base(self.path().clone());
debug!("Creating id: '{}'", id);
@@ -408,7 +409,7 @@ impl Store {
}
hsmap.insert(id.clone(), {
debug!("Creating: '{}'", id);
- let mut se = try!(StoreEntry::new(id.clone(), &self.backend));
+ let mut se = StoreEntry::new(id.clone(), &self.backend)?;
se.status = StoreEntryStatus::Borrowed;
se
});
@@ -434,21 +435,20 @@ impl Store {
/// - RetrieveCallError(LockPoisoned()) if the internal lock is poisened.
///
pub fn retrieve<'a, S: IntoStoreId>(&'a self, id: S) -> Result<FileLockEntry<'a>> {
- let id = try!(id.into_storeid()).with_base(self.path().clone());
+ let id = id.into_storeid()?.with_base(self.path().clone());
debug!("Retrieving id: '{}'", id);
- let entry = try!({
- self.entries
- .write()
- .map_err(|_| SE::from_kind(SEK::LockPoisoned))
- .and_then(|mut es| {
- let new_se = try!(StoreEntry::new(id.clone(), &self.backend));
- let se = es.entry(id.clone()).or_insert(new_se);
- let entry = se.get_entry();
- se.status = StoreEntryStatus::Borrowed;
- entry
- })
- .chain_err(|| SEK::RetrieveCallError)
- });
+ let entry = self
+ .entries
+ .write()
+ .map_err(|_| SE::from_kind(SEK::LockPoisoned))
+ .and_then(|mut es| {
+ let new_se = StoreEntry::new(id.clone(), &self.backend)?;
+ let se = es.entry(id.clone()).or_insert(new_se);
+ let entry = se.get_entry();
+ se.status = StoreEntryStatus::Borrowed;
+ entry
+ })
+ .chain_err(|| SEK::RetrieveCallError)?;
debug!("Constructing FileLockEntry: '{}'", id);
Ok(FileLockEntry::new(self, entry))
@@ -465,16 +465,15 @@ impl Store {
/// - Errors Store::retrieve() might return
///
pub fn get<'a, S: IntoStoreId + Clone>(&'a self, id: S) -> Result<Option<FileLockEntry<'a>>> {
- let id = try!(id.into_storeid()).with_base(self.path().clone());
+ let id = id.into_storeid()?.with_base(self.path().clone());
debug!("Getting id: '{}'", id);
- let exists = try!(id.exists()) || try!(self.entries
+ let exists = id.exists()? || self.entries
.read()
.map(|map| map.contains_key(&id))
.map_err(|_| SE::from_kind(SEK::LockPoisoned))
- .chain_err(|| SEK::GetCallError)
- );
+ .chain_err(|| SEK::GetCallError)?;
if !exists {
debug!("Does not exist in internal cache or filesystem: {:?}", id);
@@ -558,17 +557,17 @@ impl Store {
Ok(e) => e,
};
- let se = try!(hsmap.get_mut(&entry.location).ok_or_else(|| {
+ let se = hsmap.get_mut(&entry.location).ok_or_else(|| {
SE::from_kind(SEK::IdNotFound(entry.location.clone()))
- }));
+ })?;
assert!(se.is_borrowed(), "Tried to update a non borrowed entry.");
debug!("Verifying Entry");
- try!(entry.entry.verify());
+ entry.entry.verify()?;
debug!("Writing Entry");
- try!(se.write_entry(&entry.entry));
+ se.write_entry(&entry.entry)?;
if modify_presence {
debug!("Modifying ppresence of {} -> Present", entry.get_location());
se.status = StoreEntryStatus::Present;
@@ -590,7 +589,7 @@ impl Store {
/// - Errors StoreEntry::new() might return
///
pub fn retrieve_copy<S: IntoStoreId>(&self, id: S) -> Result<Entry> {
- let id = try!(id.into_storeid()).with_base(self.path().clone());
+ let id = id.into_storeid()?.with_base(self.path().clone());
debug!("Retrieving copy of '{}'", id);
let entries = match self.entries.write() {
Err(_) => {
@@ -605,7 +604,7 @@ impl Store {
return Err(SE::from_kind(SEK::IdLocked)).chain_err(|| SEK::RetrieveCopyCallError);
}
- try!(StoreEntry::new(id, &self.backend)).get_entry()
+ StoreEntry::new(id, &self.backend)?.get_entry()
}
/// Delete an entry
@@ -620,7 +619,7 @@ impl Store {
/// - DeleteCallError(FileError()) if the internals failed to remove the file.
///
pub fn delete<S: IntoStoreId>(&self, id: S) -> Result<()> {
- let id = try!(id.into_storeid()).with_base(self.path().clone());
+ let id = id.into_storeid()?.with_base(self.path().clone());
debug!("Deleting id: '{}'", id);
@@ -641,7 +640,7 @@ impl Store {
// StoreId::exists(), a PathBuf object gets allocated. So we simply get a
// PathBuf here, check whether it is there and if it is, we can re-use it to
// delete the filesystem file.
- let pb = try!(id.into_pathbuf());
+ let pb = id.into_pathbuf()?;
if pb.exists() {
// looks like we're deleting a not-loaded file from the store.
@@ -660,7 +659,7 @@ impl Store {
// remove the entry first, then the file
entries.remove(&id);
- let pb = try!(id.clone().with_base(self.path().clone()).into_pathbuf());
+ let pb = id.clone().with_base(self.path().clone()).into_pathbuf()?;
if let Err(e) = self.backend.remove_file(&pb) {
return Err(e)
.chain_err(|| SEK::FileError)
@@ -689,12 +688,11 @@ impl Store {
-> Result<()>
{
let new_id = new_id.with_base(self.path().clone());
- let hsmap = try!(
- self.entries
- .write()
- .map_err(|_| SE::from_kind(SEK::LockPoisoned))
- .chain_err(|| SEK::MoveCallError)
- );
+ let hsmap = self
+ .entries
+ .write()
+ .map_err(|_| SE::from_kind(SEK::LockPoisoned))
+ .chain_err(|| SEK::MoveCallError)?;
if hsmap.contains_key(&new_id) {
return Err(SE::from_kind(SEK::EntryAlreadyExists(new_id.clone())))
@@ -703,8 +701,8 @@ impl Store {
let old_id = entry.get_location().clone();
- let old_id_as_path = try!(old_id.clone().with_base(self.path().clone()).into_pathbuf());
- let new_id_as_path = try!(new_id.clone().with_base(self.path().clone()).into_pathbuf());
+ let old_id_as_path = old_id.clone().with_base(self.path().clone()).into_pathbuf()?;
+ let new_id_as_path = new_id.clone().with_base(self.path().clone()).into_pathbuf()?;
self.backend.copy(&old_id_as_path, &new_id_as_path)
.and_then(|_| {
if remove_old {
@@ -777,10 +775,10 @@ impl Store {
debug!("Old id is not yet borrowed");
- let old_id_pb = try!(old_id.clone().with_base(self.path().clone()).into_pathbuf());
- let new_id_pb = try!(new_id.clone().with_base(self.path().clone()).into_pathbuf());
+ let old_id_pb = old_id.clone().with_base(self.path().clone()).into_pathbuf()?;
+ let new_id_pb = new_id.clone().with_base(self.path().clone()).into_pathbuf()?;
- if try!(self.backend.exists(&new_id_pb)) {
+ if self.backend.exists(&new_id_pb)? {
return Err(SE::from_kind(SEK::EntryAlreadyExists(new_id.clone())));
}
debug!("New entry does not yet exist on filesystem. Good.");
@@ -817,11 +815,12 @@ impl Store {
let is_file = {
let mut base = self.path().clone();
base.push(element.clone());
- try!(self.backend.is_file(&base))
+ println!("Checking: {:?}", base);
+ self.backend.is_file(&base)?
};
if is_file {
- let sid = try!(StoreId::from_full_path(self.path(), element));
+ let sid = StoreId::from_full_path(self.path(), element)?;
elems.push(sid);
}
}
@@ -841,14 +840,14 @@ impl Debug for Store {
/// TODO: Make pretty.
fn fmt(&self, fmt: &mut Formatter) -> RResult<(), FMTError> {
- try!(write!(fmt, " --- Store ---\n"));
- try!(write!(fmt, "\n"));
- try!(write!(fmt, " - location : {:?}\n", self.location));
- try!(write!(fmt, " - configuration : {:?}\n", self.configuration));
- try!(write!(fmt, "\n"));
- try!(write!(fmt, "Entries:\n"));
- try!(write!(fmt, "{:?}", self.entries));
- try!(write!(fmt, "\n"));
+ write!(fmt, " --- Store ---\n")?;
+ write!(fmt, "\n")?;
+ write!(fmt, " - location : {:?}\n", self.location)?;
+ write!(fmt, " - configuration : {:?}\n", self.configuration)?;
+ write!(fmt, "\n")?;
+ write!(fmt, "Entries:\n")?;
+ write!(fmt, "{:?}", self.entries)?;
+ write!(fmt, "\n")?;
Ok(())
}
@@ -979,7 +978,7 @@ impl Entry {
pub fn from_reader<S: IntoStoreId>(loc: S, file: &mut Read) -> Result<Entry> {
let text = {
let mut s = String::new();
- try!(file.read_to_string(&mut s));
+ file.read_to_string(&mut s)?;
s
};
Self::from_str(loc, &text[..])
@@ -1000,10 +999,10 @@ impl Entry {
pub fn from_str<S: IntoStoreId>(loc: S, s: &str) -> Result<Entry> {
use util::entry_buffer_to_header_content;
- let (header, content) = try!(entry_buffer_to_header_content(s));
+ let (header, content) = entry_buffer_to_header_content(s)?;
Ok(Entry {
- location: try!(loc.into_storeid()),
+ location: loc.into_storeid()?,
header: header,
content: content,
})
diff --git a/lib/core/libimagstore/src/storeid.rs b/lib/core/libimagstore/src/storeid.rs
index 94fa3433..dde25a2e 100644
--- a/lib/core/libimagstore/src/storeid.rs
+++ b/lib/core/libimagstore/src/storeid.rs
@@ -59,9 +59,9 @@ impl StoreId {
pub fn from_full_path<D>(store_part: &PathBuf, full_path: D) -> Result<StoreId>
where D: Deref<Target = Path>
{
- let p = try!(
- full_path.strip_prefix(store_part).chain_err(|| SEK::StoreIdBuildFromFullPathError)
- );
+ let p = full_path
+ .strip_prefix(store_part)
+ .chain_err(|| SEK::StoreIdBuildFromFullPathError)?;
StoreId::new(Some(store_part.clone()), PathBuf::from(p))
}
@@ -91,7 +91,7 @@ impl StoreId {
/// specified.
pub fn into_pathbuf(mut self) -> Result<PathBuf> {
let base = self.base.take();
- let mut base = try!(base.ok_or_else(|| SEK::StoreIdHasNoBaseError(self.id.clone())));
+ let mut base = base.ok_or_else(|| SEK::StoreIdHasNoBaseError(self.id.clone()))?;
base.push(self.id);
Ok(base)
}
diff --git a/lib/core/libimagstore/src/util.rs b/lib/core/libimagstore/src/util.rs
index e77e8eb3..040881d2 100644
--- a/lib/core/libimagstore/src/util.rs
+++ b/lib/core/libimagstore/src/util.rs
@@ -64,6 +64,6 @@ pub fn entry_buffer_to_header_content(buf: &str) -> Result<(Value, String)> {
let content = matches.name("content").map(|r| r.as_str()).unwrap_or("");
- Ok((try!(Value::parse(header.as_str())), String::from(content)))
+ Ok((Value::parse(header.as_str())?, String::from(content)))
}