create intermediate dir for FileSystemRepository
fixes #128
diff --git a/src/repository.rs b/src/repository.rs
index 1615bb2..577b3d2 100644
--- a/src/repository.rs
+++ b/src/repository.rs
@@ -143,15 +143,22 @@
M: Metadata,
{
Self::check::<M>(role, meta_path)?;
+ let components = meta_path.components::<D>(version);
let mut path = self.local_path.join("metadata");
- path.extend(meta_path.components::<D>(version));
+ path.extend(&components);
if path.exists() {
debug!("Metadata path exists. Deleting: {:?}", path);
fs::remove_file(&path)?
}
+ if components.len() > 1 {
+ let mut path = self.local_path.clone();
+ path.extend(&components[..(components.len() - 1)]);
+ DirBuilder::new().recursive(true).create(path)?;
+ }
+
let mut file = File::create(&path)?;
D::to_writer(&mut file, metadata)?;
Ok(())
@@ -201,7 +208,15 @@
}
let mut path = self.local_path.clone().join("targets");
- path.extend(target_path.components());
+ let components = target_path.components();
+
+ if components.len() > 1 {
+ let mut path = path.clone();
+ path.extend(&components[..(components.len() - 1)]);
+ DirBuilder::new().recursive(true).create(path)?;
+ }
+
+ path.extend(components);
temp_file.persist(&path)?;
Ok(())
@@ -370,7 +385,7 @@
R: Read,
{
Err(Error::Opaque(
- "Http repo store not implemented".to_string(),
+ "Http repo store not implemented".to_string(),
))
}
@@ -541,12 +556,17 @@
let mut repo = FileSystemRepository::<Json>::new(temp_dir.path().to_path_buf());
repo.initialize().unwrap();
+ // test that init worked
+ assert!(temp_dir.path().join("metadata").exists());
+ assert!(temp_dir.path().join("targets").exists());
+ assert!(temp_dir.path().join("temp").exists());
+
let data: &[u8] = b"like tears in the rain";
let target_description = TargetDescription::from_reader(data, &[HashAlgorithm::Sha256])
.unwrap();
- let path = TargetPath::new("batty".into()).unwrap();
+ let path = TargetPath::new("foo/bar/baz".into()).unwrap();
repo.store_target(data, &path).unwrap();
- assert!(temp_dir.path().join("targets").join("batty").exists());
+ assert!(temp_dir.path().join("targets").join("foo").join("bar").join("baz").exists());
let mut read = repo.fetch_target(&path, &target_description, 0).unwrap();
let mut buf = Vec::new();