Hardlinking fix for Windows (#668)
This commit is contained in:
parent
574cc78b12
commit
12a873ff66
|
@ -29,6 +29,8 @@ use crate::common_traits::*;
|
||||||
use crate::flc;
|
use crate::flc;
|
||||||
use crate::localizer_core::generate_translation_hashmap;
|
use crate::localizer_core::generate_translation_hashmap;
|
||||||
|
|
||||||
|
const TEMP_HARDLINK_FILE: &str = "rzeczek.rxrxrxl";
|
||||||
|
|
||||||
#[derive(PartialEq, Eq, Clone, Debug, Copy)]
|
#[derive(PartialEq, Eq, Clone, Debug, Copy)]
|
||||||
pub enum HashType {
|
pub enum HashType {
|
||||||
Blake3,
|
Blake3,
|
||||||
|
@ -1249,12 +1251,13 @@ fn filter_hard_links(vec_file_entry: &[FileEntry]) -> Vec<FileEntry> {
|
||||||
|
|
||||||
pub fn make_hard_link(src: &Path, dst: &Path) -> io::Result<()> {
|
pub fn make_hard_link(src: &Path, dst: &Path) -> io::Result<()> {
|
||||||
let dst_dir = dst.parent().ok_or_else(|| Error::new(ErrorKind::Other, "No parent"))?;
|
let dst_dir = dst.parent().ok_or_else(|| Error::new(ErrorKind::Other, "No parent"))?;
|
||||||
let temp = tempfile::Builder::new().tempfile_in(dst_dir)?;
|
let temp = dst_dir.join(TEMP_HARDLINK_FILE);
|
||||||
fs::rename(dst, temp.path())?;
|
fs::rename(dst, temp.as_path())?;
|
||||||
let result = fs::hard_link(src, dst);
|
let result = fs::hard_link(src, dst);
|
||||||
if result.is_err() {
|
if result.is_err() {
|
||||||
fs::rename(temp.path(), dst)?;
|
fs::rename(temp.as_path(), dst)?;
|
||||||
}
|
}
|
||||||
|
fs::remove_file(temp)?;
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,12 @@ use crate::help_functions::*;
|
||||||
use crate::localizer_core::generate_translation_hashmap;
|
use crate::localizer_core::generate_translation_hashmap;
|
||||||
use crate::notebook_enums::*;
|
use crate::notebook_enums::*;
|
||||||
|
|
||||||
|
#[derive(PartialEq, Eq)]
|
||||||
|
enum TypeOfTool {
|
||||||
|
Hardlinking,
|
||||||
|
Symlinking,
|
||||||
|
}
|
||||||
|
|
||||||
pub fn connect_button_hardlink_symlink(gui_data: &GuiData) {
|
pub fn connect_button_hardlink_symlink(gui_data: &GuiData) {
|
||||||
// Hardlinking
|
// Hardlinking
|
||||||
{
|
{
|
||||||
|
@ -20,7 +26,7 @@ pub fn connect_button_hardlink_symlink(gui_data: &GuiData) {
|
||||||
let gui_data = gui_data.clone();
|
let gui_data = gui_data.clone();
|
||||||
|
|
||||||
buttons_hardlink.connect_clicked(move |_| {
|
buttons_hardlink.connect_clicked(move |_| {
|
||||||
glib::MainContext::default().spawn_local(sym_hard_link_things(gui_data.clone(), true));
|
glib::MainContext::default().spawn_local(sym_hard_link_things(gui_data.clone(), TypeOfTool::Hardlinking));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,12 +37,12 @@ pub fn connect_button_hardlink_symlink(gui_data: &GuiData) {
|
||||||
let gui_data = gui_data.clone();
|
let gui_data = gui_data.clone();
|
||||||
|
|
||||||
buttons_symlink.connect_clicked(move |_| {
|
buttons_symlink.connect_clicked(move |_| {
|
||||||
glib::MainContext::default().spawn_local(sym_hard_link_things(gui_data.clone(), false));
|
glib::MainContext::default().spawn_local(sym_hard_link_things(gui_data.clone(), TypeOfTool::Symlinking));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn sym_hard_link_things(gui_data: GuiData, hardlinking: bool) {
|
async fn sym_hard_link_things(gui_data: GuiData, hardlinking: TypeOfTool) {
|
||||||
let notebook_main = gui_data.main_notebook.notebook_main.clone();
|
let notebook_main = gui_data.main_notebook.notebook_main.clone();
|
||||||
let main_tree_views = gui_data.main_notebook.get_main_tree_views();
|
let main_tree_views = gui_data.main_notebook.get_main_tree_views();
|
||||||
|
|
||||||
|
@ -90,13 +96,13 @@ pub async fn sym_hard_link_things(gui_data: GuiData, hardlinking: bool) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn hardlink_symlink(
|
fn hardlink_symlink(
|
||||||
tree_view: >k::TreeView,
|
tree_view: >k::TreeView,
|
||||||
column_file_name: i32,
|
column_file_name: i32,
|
||||||
column_path: i32,
|
column_path: i32,
|
||||||
column_color: i32,
|
column_color: i32,
|
||||||
column_selection: i32,
|
column_selection: i32,
|
||||||
hardlinking: bool,
|
hardlinking: TypeOfTool,
|
||||||
text_view_errors: &TextView,
|
text_view_errors: &TextView,
|
||||||
) {
|
) {
|
||||||
reset_text_view(text_view_errors);
|
reset_text_view(text_view_errors);
|
||||||
|
@ -192,13 +198,19 @@ pub fn hardlink_symlink(
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if hardlinking {
|
if hardlinking == TypeOfTool::Hardlinking {
|
||||||
for symhardlink_data in vec_symhardlink_data {
|
for symhardlink_data in vec_symhardlink_data {
|
||||||
for file_to_hardlink in symhardlink_data.files_to_symhardlink {
|
for file_to_hardlink in symhardlink_data.files_to_symhardlink {
|
||||||
|
// #[cfg(target_family = "unix")]
|
||||||
if let Err(e) = make_hard_link(&PathBuf::from(&symhardlink_data.original_data), &PathBuf::from(&file_to_hardlink)) {
|
if let Err(e) = make_hard_link(&PathBuf::from(&symhardlink_data.original_data), &PathBuf::from(&file_to_hardlink)) {
|
||||||
add_text_to_text_view(text_view_errors, format!("{} {}, reason {}", flg!("hardlink_failed"), file_to_hardlink, e).as_str());
|
add_text_to_text_view(text_view_errors, format!("{} {}, reason {}", flg!("hardlink_failed"), file_to_hardlink, e).as_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
// #[cfg(target_family = "windows")]
|
||||||
|
// if let Err(e) = fs::hard_link(&PathBuf::from(&symhardlink_data.original_data), &PathBuf::from(&file_to_hardlink)) {
|
||||||
|
// add_text_to_text_view(text_view_errors, format!("{} {}, reason {}", flg!("hardlink_failed"), file_to_hardlink, e).as_str());
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue