1
0
Fork 0
mirror of synced 2024-04-29 01:52:39 +12:00

Hardlinking fix for Windows (#668)

This commit is contained in:
Rafał Mikrut 2022-04-08 17:17:16 +02:00 committed by GitHub
parent 574cc78b12
commit 12a873ff66
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 9 deletions

View file

@ -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
} }

View file

@ -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: &gtk::TreeView, tree_view: &gtk::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 {