From 8b9f05f168498823369732d710e82a653075d897 Mon Sep 17 00:00:00 2001 From: brxken128 <77554505+brxken128@users.noreply.github.com> Date: Tue, 17 Jan 2023 16:57:44 +0000 Subject: [PATCH] working single file copy --- core/src/object/fs/copy.rs | 184 +++++++++++++++++-------------------- core/src/object/fs/cut.rs | 1 - 2 files changed, 82 insertions(+), 103 deletions(-) diff --git a/core/src/object/fs/copy.rs b/core/src/object/fs/copy.rs index cce361b9d..ac9f17223 100644 --- a/core/src/object/fs/copy.rs +++ b/core/src/object/fs/copy.rs @@ -1,4 +1,4 @@ -use super::{context_menu_fs_info, FsInfo, ObjectType}; +use super::{context_menu_fs_info, get_path_from_location_id, FsInfo, ObjectType}; use crate::job::{JobError, JobReportUpdate, JobResult, JobState, StatefulJob, WorkerContext}; use serde::{Deserialize, Serialize}; use specta::Type; @@ -8,8 +8,8 @@ pub struct FileCopierJob {} #[derive(Serialize, Deserialize, Debug, Clone)] pub struct FileCopierJobState { - pub root_path: PathBuf, - pub root_prefix: PathBuf, + pub target_path: PathBuf, // target dir prefix too + pub source_path: PathBuf, pub root_type: ObjectType, } @@ -23,7 +23,7 @@ pub struct FileCopierJobInit { #[derive(Serialize, Deserialize, Debug, Clone)] pub struct FileCopierJobStep { - pub fs_info: FsInfo, + pub source_fs_info: FsInfo, } const JOB_NAME: &str = "file_copier"; @@ -39,52 +39,27 @@ impl StatefulJob for FileCopierJob { } async fn init(&self, ctx: WorkerContext, state: &mut JobState) -> Result<(), JobError> { - // let fs_info = context_menu_fs_info( - // &ctx.library_ctx.db, - // state.init.location_id, - // state.init.path_id, - // ) - // .await?; + let source_fs_info = context_menu_fs_info( + &ctx.library_ctx.db, + state.init.source_location_id, + state.init.source_path_id, + ) + .await?; - // let root_prefix = if fs_info.obj_type == ObjectType::File { - // let mut output_path = fs_info.obj_path.clone(); - // output_path.set_file_name( - // fs_info - // .obj_path - // .file_stem() - // .unwrap() - // .to_str() - // .unwrap() - // .to_string() + "-Copy" - // + &fs_info.obj_path.extension().map_or_else( - // || String::from(""), - // |x| String::from(".") + x.to_str().unwrap(), - // ), - // ); - // output_path - // } else { - // let mut output_path = fs_info.obj_path.clone(); - // output_path.set_file_name( - // output_path - // .file_stem() - // .unwrap() - // .to_str() - // .unwrap() - // .to_string() + "-Copy", - // ); - // output_path - // }; + let mut full_target_path = + get_path_from_location_id(&ctx.library_ctx.db, state.init.target_location_id).await?; + full_target_path.push(state.init.target_path.clone()); - // state.data = Some(FileCopierJobState { - // root_path: fs_info.obj_path.clone(), - // root_prefix, - // root_type: fs_info.obj_type.clone(), - // }); + state.data = Some(FileCopierJobState { + target_path: full_target_path, + source_path: source_fs_info.obj_path.clone(), + root_type: source_fs_info.obj_type.clone(), + }); - // state.steps = VecDeque::new(); - // state.steps.push_back(FileCopierJobStep { fs_info }); + state.steps = VecDeque::new(); + state.steps.push_back(FileCopierJobStep { source_fs_info }); - // ctx.progress(vec![JobReportUpdate::TaskCount(state.steps.len())]); + ctx.progress(vec![JobReportUpdate::TaskCount(state.steps.len())]); Ok(()) } @@ -94,70 +69,75 @@ impl StatefulJob for FileCopierJob { ctx: WorkerContext, state: &mut JobState, ) -> Result<(), JobError> { - // let step = state.steps[0].clone(); - // let info = &step.fs_info; + let step = state.steps[0].clone(); + let info = &step.source_fs_info; - // let job_state = state.data.clone().ok_or(JobError::MissingData { - // value: String::from("job state"), - // })?; + let job_state = state.data.clone().ok_or(JobError::MissingData { + value: String::from("job state"), + })?; - // match info.obj_type { - // ObjectType::File => { - // let mut path = job_state.root_prefix.clone(); + match info.obj_type { + ObjectType::File => { + let mut path = job_state.target_path.clone(); - // if job_state.root_type == ObjectType::Directory { - // path.push( - // info.obj_path - // .strip_prefix(job_state.root_path.clone()) - // .unwrap(), - // ); - // } + if job_state.root_type == ObjectType::Directory { + path.push( + info.obj_path + .strip_prefix(job_state.source_path.clone()) + .unwrap(), + ); + } else { + path.push(info.obj_path.clone().file_name().unwrap()); + } - // std::fs::copy(info.obj_path.clone(), path.clone())?; - // } - // ObjectType::Directory => { - // for entry in std::fs::read_dir(info.obj_path.clone())? { - // let entry = entry?; - // if entry.metadata()?.is_dir() { - // let obj_type = ObjectType::Directory; - // state.steps.push_back(FileCopierJobStep { - // fs_info: FsInfo { - // obj_id: None, - // obj_name: String::new(), - // obj_path: entry.path(), - // obj_type, - // }, - // }); + dbg!(info.obj_path.clone()); + dbg!(path.clone()); - // let path_suffix = entry - // .path() - // .strip_prefix(job_state.root_path.clone()) - // .unwrap() - // .to_path_buf(); + std::fs::copy(info.obj_path.clone(), path.clone())?; + } + _ => todo!(), // ObjectType::Directory => { + // for entry in std::fs::read_dir(info.obj_path.clone())? { + // let entry = entry?; + // if entry.metadata()?.is_dir() { + // let obj_type = ObjectType::Directory; + // state.steps.push_back(FileCopierJobStep { + // fs_info: FsInfo { + // obj_id: None, + // obj_name: String::new(), + // obj_path: entry.path(), + // obj_type, + // }, + // }); - // let mut path = job_state.root_prefix.clone(); - // path.push(path_suffix); - // std::fs::create_dir_all(path)?; - // } else { - // let obj_type = ObjectType::File; - // state.steps.push_back(FileCopierJobStep { - // fs_info: FsInfo { - // obj_id: None, - // obj_name: entry.file_name().to_str().unwrap().to_string(), - // obj_path: entry.path(), - // obj_type, - // }, - // }); - // }; + // let path_suffix = entry + // .path() + // .strip_prefix(job_state.root_path.clone()) + // .unwrap() + // .to_path_buf(); - // ctx.progress(vec![JobReportUpdate::TaskCount(state.steps.len())]); - // } - // } - // }; + // let mut path = job_state.root_prefix.clone(); + // path.push(path_suffix); + // std::fs::create_dir_all(path)?; + // } else { + // let obj_type = ObjectType::File; + // state.steps.push_back(FileCopierJobStep { + // fs_info: FsInfo { + // obj_id: None, + // obj_name: entry.file_name().to_str().unwrap().to_string(), + // obj_path: entry.path(), + // obj_type, + // }, + // }); + // }; - // ctx.progress(vec![JobReportUpdate::CompletedTaskCount( - // state.step_number + 1, - // )]); + // ctx.progress(vec![JobReportUpdate::TaskCount(state.steps.len())]); + // } + // } + }; + + ctx.progress(vec![JobReportUpdate::CompletedTaskCount( + state.step_number + 1, + )]); Ok(()) } diff --git a/core/src/object/fs/cut.rs b/core/src/object/fs/cut.rs index d41547deb..60203c6e4 100644 --- a/core/src/object/fs/cut.rs +++ b/core/src/object/fs/cut.rs @@ -67,7 +67,6 @@ impl StatefulJob for FileCutterJob { let source_info = &step.source_fs_info; let mut full_output = step.target_directory.clone(); - full_output.push(source_info.obj_path.clone().file_name().unwrap()); dbg!(source_info.obj_path.clone());