Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Recursive copy semantics are very unclear #24

Open
dpc opened this issue Mar 1, 2019 · 5 comments
Open

Recursive copy semantics are very unclear #24

dpc opened this issue Mar 1, 2019 · 5 comments

Comments

@dpc
Copy link

dpc commented Mar 1, 2019

is

fs_extra::dir_copy("a/b", "c/d");

goint to create c/d/b, or just c/d? Does it depend on c/d existing or not? The documentation is very unclear.

"Copies the directory contents from one place to another using recursive method. This function will also copy the permission bits of the original files to destionation files (not for directories)."

Explains non of it.

@webdesus
Copy link
Owner

webdesus commented Mar 1, 2019

Sorry, but fs_extra does not exist method dir_copy. fs_extra have this method fs_extra::dir::copy which contains third argument copy_options, where you can set necessary settings for copy operation.

If you are expected this c/d/b behavior, you should set true for the copy_inside property of copy_option object

@webdesus webdesus closed this as completed Mar 1, 2019
@dpc
Copy link
Author

dpc commented Mar 1, 2019

This is all not well explained in documentation. I was able to figure it out myself, but it require some trail and error.

@webdesus
Copy link
Owner

webdesus commented Mar 2, 2019

Thank you for your feedback, i will improve docs :)

@ctron
Copy link

ctron commented Jan 9, 2020

I have to agree that the semantics are are bit weird:

Taking a look at the copy function:

    if options.copy_inside {
        if to.exists() {
            if let Some(dir_name) = from.components().last() {
                to.push(dir_name.as_os_str());
            } else {
                err!("Invalid folder from", ErrorKind::InvalidFolder);
            }
        }
    } else {
        if let Some(dir_name) = from.components().last() {
            to.push(dir_name.as_os_str());
        } else {
            err!("Invalid folder from", ErrorKind::InvalidFolder);
        }
    }

Depending on the fact that the target directory exists or not, the outcome is different. And there seems to be no way to influence that.

e.g.: copying a/b from a to c, setting copy_inside=true will result in:

  • c/b - if c does not exist
  • or c/a/b - if c did already exist

So the behavior of copy with copy_inside=true is not as cp -r.

Which causes as problem when you want to copy from multiple source directories, to a single target directory with copy_inside=true.

Also is the documentation of https://docs.rs/fs_extra/1.1.0/fs_extra/dir/fn.copy.html wrong IMHO. It refers to a non-existing copy option named mirror_copy.

I guess the right fix would be to simple drop the "if exists" check for copy_inside.

@webdesus
Copy link
Owner

webdesus commented Jan 9, 2020

Hi @ctron,

is not as cp -r

I checked right now behaviors cp -r and this behavior the same as mine. These operations have a different outcome if the target folder exists or doesn't ...

It refers to a non-existing copy option named mirror_copy.

My bad... i missed this moment, when changed old name(mirror_copy) by new (copy_inside)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants