From f8e4ebf41bdef817b625b726caec15588f57d118 Mon Sep 17 00:00:00 2001 From: Chen Gong Date: Sat, 5 Jan 2019 04:40:33 +0800 Subject: [PATCH] fix(SymlinkingPrebuiltDictionaries): remove dangling symlinks Closes #241 --- src/rime/lever/deployment_tasks.cc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/rime/lever/deployment_tasks.cc b/src/rime/lever/deployment_tasks.cc index ec8f5ca93..6f47a9e73 100644 --- a/src/rime/lever/deployment_tasks.cc +++ b/src/rime/lever/deployment_tasks.cc @@ -477,9 +477,16 @@ bool SymlinkingPrebuiltDictionaries::Run(Deployer* deployer) { fs::path entry(test->path()); if (fs::is_symlink(entry)) { try { - auto target_path = fs::canonical(entry); - if (target_path.has_parent_path() && - fs::equivalent(shared_data_path, target_path.parent_path())) { + // a symlink becomes dangling if the target file is no longer provided + bool symlink_valid = fs::status_known(fs::symlink_status(entry)); + bool linked_to_shared_data = false; + if (symlink_valid) { + auto target_path = fs::canonical(entry); + linked_to_shared_data = + target_path.has_parent_path() && + fs::equivalent(shared_data_path, target_path.parent_path()); + } + if (!symlink_valid || linked_to_shared_data) { LOG(INFO) << "removing symlink: " << entry.filename().string(); fs::remove(entry); }