commit 51672f3705526d7860264a61b55013d5639e7efa Author: Rasmus Rosengren Date: Wed Aug 25 18:01:39 2021 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..5946e28 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,117 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "async-recursion" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7d78656ba01f1b93024b7c3a0467f1608e4be67d725749fdcd7d2c7678fd7a2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "dfm" +version = "0.1.0" +dependencies = [ + "async-recursion", + "tokio", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "libc" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1fa8cddc8fbbee11227ef194b5317ed014b8acbf15139bd716a18ad3fe99ec5" + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" + +[[package]] +name = "proc-macro2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f58f7e8eaa0009c5fec437aabf511bd9933e4b2d7407bd05273c01a8906ea7" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "tokio" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92036be488bb6594459f2e03b60e42df6f937fe6ca5c5ffdcb539c6b84dc40f5" +dependencies = [ + "autocfg", + "num_cpus", + "pin-project-lite", + "tokio-macros", +] + +[[package]] +name = "tokio-macros" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54473be61f4ebe4efd09cec9bd5d16fa51d70ea0192213d754d2d500457db110" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..6e89e1a --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "dfm" +version = "0.1.0" +edition = "2018" +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[profile.release] +lto = true +codegen-units = 1 + +[dependencies] +async-recursion = "0.3" +tokio = { version = "1.10", features = ["fs", "macros", "rt-multi-thread"] } diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..e4fb79b --- /dev/null +++ b/src/main.rs @@ -0,0 +1,47 @@ +use async_recursion::async_recursion; +use tokio::fs; + +#[tokio::main] +async fn main() -> std::io::Result<()> { + let home_dir = std::env::var("HOME").expect("Could not get home dir"); + symlink_folder(&format!("{}/.df", home_dir), &home_dir).await; + Ok(()) +} + +#[async_recursion] +async fn symlink_folder(src_dir: &str, target_dir: &str) { + fs::create_dir_all(target_dir) + .await + .expect(&format!("Could not create {}", target_dir)); + let mut dir_contents = fs::read_dir(src_dir) + .await + .expect(&format!("Could read dir {}", src_dir)); + while let Ok(Some(entry)) = dir_contents.next_entry().await { + let os_name = entry.file_name(); + let name = os_name.to_str().unwrap(); + if name == ".git" { + continue; + } + + if let Ok(metadata) = entry.metadata().await { + if metadata.is_dir() { + symlink_folder( + &format!("{}/{}", src_dir, name), + &format!("{}/{}", target_dir, name), + ) + .await; + } + + if metadata.is_file() { + #[allow(unused_must_use)] + let _ = fs::remove_file(&format!("{}/{}", target_dir, name)).await; + fs::symlink( + &format!("{}/{}", src_dir, name), + &format!("{}/{}", target_dir, name), + ) + .await + .unwrap(); + } + } + } +}