aboutsummaryrefslogtreecommitdiff
path: root/src/dots.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/dots.rs')
-rw-r--r--src/dots.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/dots.rs b/src/dots.rs
new file mode 100644
index 0000000..5b75254
--- /dev/null
+++ b/src/dots.rs
@@ -0,0 +1,48 @@
+use std::fs::{remove_file, symlink_metadata};
+use std::os::unix::fs::symlink;
+use std::path::PathBuf;
+use dirs::home_dir;
+use crate::config::Dot;
+
+pub fn deploy_dots(dots: Vec<Dot>, dots_dir: PathBuf) {
+ let prepended_dots = dots.iter().map(|m|
+ Dot {
+ source: dots_dir.join(&m.source),
+ destination: prepend_user_dir(&m.destination)
+ }
+ );
+
+ for dot in prepended_dots {
+ println!("linking from {} to {}", dot.source.display(), dot.destination.display());
+ let _ = symlink(&dot.source, &dot.destination).map_err(|err|
+ eprintln!("failed to symlink: {}", err.to_string())
+ );
+ }
+}
+
+pub fn unlink_dots(dots: Vec<Dot>, dots_dir: PathBuf) {
+ let prepended_dots = dots.iter().map(|m|
+ Dot {
+ source: dots_dir.join(&m.source),
+ destination: prepend_user_dir(&m.destination)
+ }
+ );
+
+ for dot in prepended_dots {
+ println!("unlinking {}", dot.destination.display());
+ let metadata = symlink_metadata(dot.destination.clone());
+ if metadata.is_err() {
+ eprintln!("failed to query metadata for {}: {}", dot.destination.display(), metadata.err().unwrap());
+ continue
+ }
+ if metadata.ok().unwrap().is_symlink() {
+ let _ = remove_file(dot.destination).map_err(|err|
+ eprintln!("failed to remove symlink: {}", err)
+ );
+ }
+ }
+}
+
+fn prepend_user_dir(path: &PathBuf) -> PathBuf {
+ home_dir().unwrap().join(path)
+} \ No newline at end of file