1use std::fs;
2use std::path::Path;
3
4use crate::ShellError;
5
6pub fn link_directory(target: &Path, link: &Path) -> Result<(), ShellError> {
8 if link.exists() || link.is_symlink() {
9 remove_existing(link)?;
10 }
11 if let Some(parent) = link.parent() {
12 fs::create_dir_all(parent)?;
13 }
14 create_symlink(target, link)?;
15 Ok(())
16}
17
18pub fn remove_existing(path: &Path) -> Result<(), ShellError> {
20 if !path.exists() && !path.is_symlink() {
21 return Ok(());
22 }
23 let metadata = fs::symlink_metadata(path)?;
24 if metadata.file_type().is_symlink() || metadata.is_file() {
25 fs::remove_file(path)?;
26 } else {
27 fs::remove_dir_all(path)?;
28 }
29 Ok(())
30}
31
32#[cfg(unix)]
33fn create_symlink(target: &Path, link: &Path) -> Result<(), ShellError> {
34 std::os::unix::fs::symlink(target, link)?;
35 Ok(())
36}
37
38#[cfg(windows)]
39fn create_symlink(target: &Path, link: &Path) -> Result<(), ShellError> {
40 std::os::windows::fs::symlink_dir(target, link)?;
41 Ok(())
42}