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();