cp_r 0.5.2

Copy files and directories recursively, preserving mtime and permissions
Documentation
#![cfg(windows)]

use std::fs::{create_dir, metadata, read_link, read_to_string, symlink_metadata, write};
use std::os::windows::fs::{symlink_dir, symlink_file};
use std::path::Path;

use tempfile::TempDir;

use cp_r::CopyOptions;

#[test]
fn copy_file_symlink() {
    let tmp = TempDir::with_prefix("src").unwrap();
    let src = tmp.path();
    write(src.join("target"), b"hello").unwrap();
    symlink_file("target", src.join("link")).unwrap();

    let dest_tmp = TempDir::with_prefix("dest").unwrap();
    let dest = dest_tmp.path();
    CopyOptions::new().copy_tree(src, dest).unwrap();

    assert_eq!(read_to_string(dest.join("link")).unwrap(), "hello");
    assert_eq!(read_link(dest.join("link")).unwrap(), Path::new("target"));
}

#[test]
fn copy_dir_symlink() {
    let tmp = TempDir::with_prefix("src").unwrap();
    let src = tmp.path();
    create_dir(src.join("target")).unwrap();
    symlink_dir("target", src.join("link")).unwrap();
    println!(
        "source symlink target is {:?}",
        read_link(src.join("link")).unwrap()
    );

    let dest_tmp = TempDir::with_prefix("dest").unwrap();
    let dest = dest_tmp.path();
    CopyOptions::new().copy_tree(&src, &dest).unwrap();
    println!(
        "dest symlink target is {:?}",
        read_link(dest.join("link")).unwrap()
    );

    assert!(symlink_metadata(dest.join("link")).unwrap().is_symlink());
    assert!(metadata(dest.join("link")).unwrap().is_dir());
    assert_eq!(read_link(dest.join("link")).unwrap(), Path::new("target"));
}