diff --git a/src/commands/clone.rs b/src/commands/clone.rs index 2aa1e42..b4971b7 100644 --- a/src/commands/clone.rs +++ b/src/commands/clone.rs @@ -87,14 +87,14 @@ pub fn clone(remote: Values<'_>) { // create folder let p = ref_path.clone().join(Path::new(&relative_s)); if let Err(err) = DirBuilder::new().recursive(true).create(p.clone()) { - eprintln!("err: cannot create directory {}: {}", p.display(), err); + eprintln!("err: cannot create directory {} ({})", p.display(), err); } // add tree let path_folder = p.strip_prefix(ref_path.clone()).unwrap(); let lastmodified = folder.lastmodified.unwrap().timestamp_millis(); if let Err(err) = add_tree(&path_folder, &lastmodified.to_string()) { - eprintln!("err: saving ref of {}: {}", path_folder.display(), err); + eprintln!("err: saving ref of {} ({})", path_folder.display(), err); } } @@ -126,7 +126,7 @@ fn download_files(ref_p: PathBuf, files: Vec, api_props: &ApiProps) { let relative_p = Path::new(&relative_s); let lastmodified = obj.clone().lastmodified.unwrap().timestamp_millis(); if let Err(err) = add_blob(relative_p, &lastmodified.to_string()) { - eprintln!("err: saving ref of {}: {}", relative_s.clone(), err); + eprintln!("err: saving ref of {} ({})", relative_s.clone(), err); } }, Err(ApiError::Unexpected(_)) => { diff --git a/src/commands/push.rs b/src/commands/push.rs index 8859407..950a98e 100644 --- a/src/commands/push.rs +++ b/src/commands/push.rs @@ -1,11 +1,16 @@ -use crate::commands::{status, config}; -use crate::services::req_props::{ReqProps, ObjProps}; use crate::services::api::ApiError; use crate::services::upload_file::UploadFile; use crate::services::delete_path::DeletePath; -use crate::commands::status::{State, Obj}; -use crate::store::object::{add_blob, rm_blob}; +use crate::services::req_props::{ReqProps, ObjProps}; use crate::store::index; +use crate::store::object::{add_blob, rm_blob}; +use crate::commands::{status, config}; +use crate::commands::status::{State, Obj}; +use crate::commands::push::push_factory::{PushFactory, PushState}; + +pub mod push_factory; +pub mod new; +pub mod deleted; pub fn push() { dbg!(status::get_all_staged()); @@ -36,160 +41,3 @@ pub fn push() { // if dir upload dir } - -#[derive(Debug)] -enum PushState { - Done, - Valid, - Conflict, - Error, -} - -trait PushChange { - fn can_push(&self) -> PushState; - fn push(&self); -} - -struct New { - obj: Obj, -} - -impl PushChange for New { - fn can_push(&self) -> PushState { - // check if exist on server - let res = ReqProps::new() - .set_url(&self.obj.path.to_str().unwrap()) - .getlastmodified() - .send_req_single(); - - let file_infos = match res { - Ok(obj) => Ok(Some(obj)), - Err(ApiError::IncorrectRequest(err)) => { - if err.status() == 404 { - Ok(None) - } else { - Err(()) - } - }, - Err(_) => Err(()), - }; - - if let Ok(infos) = file_infos { - if let Some(info) = infos { - // file doesn't exist on remote - PushState::Valid - } else { - // todo check date - PushState::Conflict - } - } else { - PushState::Error - } - } - - fn push(&self) { - let obj = &self.obj; - let res = UploadFile::new() - .set_url(obj.path.to_str().unwrap()) - .set_file(obj.path.clone()) - .send_with_err(); - - match res { - Err(ApiError::IncorrectRequest(err)) => { - eprintln!("fatal: error pushing file {}: {}", obj.name, err.status()); - std::process::exit(1); - }, - Err(ApiError::RequestError(_)) => { - eprintln!("fatal: request error pushing file {}", obj.name); - std::process::exit(1); - } - _ => (), - } - - // update tree - add_blob(&obj.path.clone(), "todo_date"); - - // remove index - index::rm_line(obj.path.to_str().unwrap()); - } -} - - -struct Deleted { - obj: Obj, -} - -impl PushChange for Deleted { - fn can_push(&self) -> PushState { - // check if exist on server - let res = ReqProps::new() - .set_url(&self.obj.path.to_str().unwrap()) - .getlastmodified() - .send_with_err(); - - let file_infos = match res { - Ok(obj) => Ok(Some(obj)), - Err(ApiError::IncorrectRequest(err)) => { - if err.status() == 404 { - Ok(None) - } else { - Err(()) - } - }, - Err(_) => Err(()), - }; - - if let Ok(infos) = file_infos { - if let Some(inf) = infos { - // file doesn't exist on remote - PushState::Done - } else { - // todo check date - //PushState::Conflict - PushState::Valid - } - } else { - PushState::Error - } - } - - fn push(&self) { - let obj = &self.obj; - let res = DeletePath::new() - .set_url(obj.path.to_str().unwrap()) - .send_with_err(); - - match res { - Err(ApiError::IncorrectRequest(err)) => { - eprintln!("fatal: error deleting file {}: {}", obj.name, err.status()); - std::process::exit(1); - }, - Err(ApiError::RequestError(_)) => { - eprintln!("fatal: request error deleting file {}", obj.name); - std::process::exit(1); - } - _ => (), - } - - // update tree - rm_blob(&obj.path.clone()); - // remove index - index::rm_line(obj.path.to_str().unwrap()); - } -} - -struct PushFactory; - -impl PushFactory { - fn new(&self, obj: Obj) -> Box { - match obj.state { - State::New => Box::new(New { obj: obj.clone() }), - State::Renamed => todo!(), - State::Modified => todo!(), - State::Deleted => Box::new(Deleted { obj: obj.clone() }), - State::Default => todo!(), - } - } -} - - diff --git a/src/commands/push/deleted.rs b/src/commands/push/deleted.rs new file mode 100644 index 0000000..b0325f3 --- /dev/null +++ b/src/commands/push/deleted.rs @@ -0,0 +1,70 @@ +use crate::services::api::ApiError; +use crate::services::req_props::ReqProps; +use crate::services::delete_path::DeletePath; +use crate::store::index; +use crate::store::object::rm_blob; +use crate::commands::status::Obj; +use crate::commands::push::push_factory::{PushState, PushChange}; + +pub struct Deleted { + pub obj: Obj, +} + +impl PushChange for Deleted { + fn can_push(&self) -> PushState { + // check if exist on server + let res = ReqProps::new() + .set_url(&self.obj.path.to_str().unwrap()) + .getlastmodified() + .send_with_err(); + + let file_infos = match res { + Ok(obj) => Ok(Some(obj)), + Err(ApiError::IncorrectRequest(err)) => { + if err.status() == 404 { + Ok(None) + } else { + Err(()) + } + }, + Err(_) => Err(()), + }; + + if let Ok(infos) = file_infos { + if let Some(inf) = infos { + // file doesn't exist on remote + PushState::Done + } else { + // todo check date + //PushState::Conflict + PushState::Valid + } + } else { + PushState::Error + } + } + + fn push(&self) { + let obj = &self.obj; + let res = DeletePath::new() + .set_url(obj.path.to_str().unwrap()) + .send_with_err(); + + match res { + Err(ApiError::IncorrectRequest(err)) => { + eprintln!("fatal: error deleting file {}: {}", obj.name, err.status()); + std::process::exit(1); + }, + Err(ApiError::RequestError(_)) => { + eprintln!("fatal: request error deleting file {}", obj.name); + std::process::exit(1); + } + _ => (), + } + + // update tree + rm_blob(&obj.path.clone()); + // remove index + index::rm_line(obj.path.to_str().unwrap()); + } +} diff --git a/src/commands/push/new.rs b/src/commands/push/new.rs new file mode 100644 index 0000000..61fc275 --- /dev/null +++ b/src/commands/push/new.rs @@ -0,0 +1,71 @@ +use crate::services::api::ApiError; +use crate::services::req_props::ReqProps; +use crate::services::upload_file::UploadFile; +use crate::store::index; +use crate::store::object::add_blob; +use crate::commands::status::Obj; +use crate::commands::push::push_factory::{PushState, PushChange, PushFactory}; + +pub struct New { + pub obj: Obj, +} + +impl PushChange for New { + fn can_push(&self) -> PushState { + // check if exist on server + let res = ReqProps::new() + .set_url(&self.obj.path.to_str().unwrap()) + .getlastmodified() + .send_req_single(); + + let file_infos = match res { + Ok(obj) => Ok(Some(obj)), + Err(ApiError::IncorrectRequest(err)) => { + if err.status() == 404 { + Ok(None) + } else { + Err(()) + } + }, + Err(_) => Err(()), + }; + + if let Ok(infos) = file_infos { + if let Some(info) = infos { + // file doesn't exist on remote + PushState::Valid + } else { + // todo check date + PushState::Conflict + } + } else { + PushState::Error + } + } + + fn push(&self) { + let obj = &self.obj; + let res = UploadFile::new() + .set_url(obj.path.to_str().unwrap()) + .set_file(obj.path.clone()) + .send_with_err(); + + match res { + Err(ApiError::IncorrectRequest(err)) => { + eprintln!("fatal: error pushing file {}: {}", obj.name, err.status()); + std::process::exit(1); + }, + Err(ApiError::RequestError(_)) => { + eprintln!("fatal: request error pushing file {}", obj.name); + std::process::exit(1); + } + _ => (), + } + + // update tree + add_blob(&obj.path.clone(), "todo_date"); + + // remove index + index::rm_line(obj.path.to_str().unwrap()); + } +} diff --git a/src/commands/push/push_factory.rs b/src/commands/push/push_factory.rs new file mode 100644 index 0000000..2d2e0ce --- /dev/null +++ b/src/commands/push/push_factory.rs @@ -0,0 +1,32 @@ +use crate::commands::status::{State, Obj}; +use crate::commands::push::new::New; +use crate::commands::push::deleted::Deleted; + +#[derive(Debug)] +pub enum PushState { + Done, + Valid, + Conflict, + Error, +} + +pub trait PushChange { + fn can_push(&self) -> PushState; + fn push(&self); +} + +pub struct PushFactory; + +impl PushFactory { + pub fn new(&self, obj: Obj) -> Box { + match obj.state { + State::New => Box::new(New { obj: obj.clone() }), + State::Renamed => todo!(), + State::Modified => todo!(), + State::Deleted => Box::new(Deleted { obj: obj.clone() }), + State::Default => todo!(), + } + } +} + +