From 0229d6c9fd911d527b64b72e13b3041daa286db3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cyryl=20P=C5=82otnicki?= Date: Sun, 1 Sep 2019 10:36:42 +0100 Subject: [PATCH] Scna repo on open --- src/error.rs | 2 -- src/lib.rs | 1 - src/repository.rs | 36 +++++++++++++++++++++++++++--------- src/restore.rs | 2 +- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/error.rs b/src/error.rs index 1e09a3a..77653ca 100644 --- a/src/error.rs +++ b/src/error.rs @@ -6,8 +6,6 @@ use failure::Fail; pub enum BakareError { #[fail(display = "io error")] IOError, - #[fail(display = "unknown source path")] - UnknownSourcePathError, } impl From for BakareError { diff --git a/src/lib.rs b/src/lib.rs index 1364b81..7cc4082 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,7 +13,6 @@ pub struct ItemVersion<'a>(&'a str); #[derive(Copy, Clone)] pub struct IndexVersion; -#[derive(Clone)] struct IndexViewReadonly<'a> { index_version: IndexVersion, items: Vec>, diff --git a/src/repository.rs b/src/repository.rs index 71865e7..59aa563 100644 --- a/src/repository.rs +++ b/src/repository.rs @@ -1,10 +1,15 @@ use std::fs; -use std::path::Path; +use std::path::{Path, PathBuf}; + +use walkdir::{DirEntry, WalkDir}; use crate::error::BakareError; use crate::IndexVersion; use crate::IndexViewReadonly; use crate::ItemVersion; +use std::borrow::Cow; +use std::rc::Rc; +use std::sync::Arc; /// represents a place where backup is stored an can be restored from. /// right now only on-disk directory storage is supported @@ -17,9 +22,10 @@ pub struct Repository<'a> { newest_index_version: IndexVersion, } -#[derive(Copy, Clone)] +#[derive(Clone)] pub struct RepositoryItem<'a> { version: ItemVersion<'a>, + relative_path: Rc, } pub struct RepositoryIterator<'a> { @@ -29,7 +35,7 @@ pub struct RepositoryIterator<'a> { } impl<'a> Iterator for RepositoryIterator<'a> { - type Item = RepositoryItem<'a>; + type Item = &'a RepositoryItem<'a>; fn next(&mut self) -> Option { if self.index.items.is_empty() || self.current_item_number >= self.index.items.len() - 1 { @@ -37,7 +43,7 @@ impl<'a> Iterator for RepositoryIterator<'a> { } else { let current_item_number = self.current_item_number; self.current_item_number += 1; - Some(self.index.items[current_item_number]) + Some(&self.index.items[current_item_number]) } } } @@ -50,14 +56,26 @@ impl<'a> RepositoryItem<'a> { impl<'a> Repository<'a> { pub fn open(path: &Path) -> Result { - // TODO open index from file + let walker = WalkDir::new(path); + let all_files: Result, _> = walker + .into_iter() + .filter_entry(|e| e.path() != path && !e.path().is_dir()) + .collect(); + let all_files = all_files?; + let all_items: Vec = all_files + .into_iter() + .map(|p| RepositoryItem { + version: ItemVersion(""), + relative_path: Rc::from(p.path()), + }) + .collect(); let version = IndexVersion; Ok(Repository { path, index: IndexViewReadonly { index_version: version, - items: vec![], + items: all_items, }, newest_index_version: version, }) @@ -88,11 +106,11 @@ impl<'a> Repository<'a> { Ok(()) } - pub fn item(&self, path: &Path) -> Option { + pub fn item(&self, path: &Path) -> Option<&RepositoryItem> { None } - pub fn newest_version_for(&self, source_path: &Path) -> Result { - Err(BakareError::UnknownSourcePathError) + pub fn newest_version_for(&self, item: RepositoryItem) -> ItemVersion { + ItemVersion("") } } diff --git a/src/restore.rs b/src/restore.rs index 43914bd..698373f 100644 --- a/src/restore.rs +++ b/src/restore.rs @@ -4,9 +4,9 @@ use std::path::Path; use walkdir::DirEntry; use crate::error::BakareError; +use crate::ItemVersion; use crate::repository::Repository; use crate::repository::RepositoryItem; -use crate::ItemVersion; pub struct Engine<'a> { repository: &'a Repository<'a>,