This PR allows the CopyFile resource to recursively copy directories as well, similar to scp -r.
This PR enhances the CopyFile resource in a few ways.
It can now copy directories as well, recursively with their contents.
It now takes the standard Pulumi asserts and archives as input, allowing for seamless interop with other resources.
It now checks whether the specified file or directory have changed (in content, not timestamp) and copies only if they did.
In light of these changes, I've renamed CopyFile to just Copy which is a breaking change.
Resolves #23
Resolves #33
Resolves #42
TODO
[x] The current implementation fails as soon as a file or directory already exists on the remote, like the previous CopyFile.
[x] Before GA, should we rename CopyFile to Copy or RemoteCopy or insert your proposal here?
[ ] The integration test copies a bunch of EC2 setup code with TestEc2RemoteTs, which we should share instead. What would be a good way to do that, given the code is in the TS tests, not in the Go driver?
Design considerations
The behavior of the copy operation was modeled after cp and scp.
source | dest - exists as dir | dest - does not exist | dest - exists as file
-------|----------------------|-----------------------|-----------------------
dir | dest/dir | dest/dir | error
dir/ | dest/x for x in dir | dest/dir | error
file | dest/file | dest | dest (overwritten)
Specifically:
When copying a directory, we overwrite existing files. (The current CopyFile resource for single files does that, too.)
When copying a directory, we don't clear the remote directory first so that no left-over files from previous copies will be around. We can always add a flag for that if needed.
Implementation notes
I've looked around for open source Go packages implementing scp of folders, but to my surprise, I couldn't find one with an acceptable license that 1) wasn't ancient and 2) was cross-platform.
The current implementation copies files sequentially and is therefore probably slow for large trees. If we replaced the implementation, I don't think the shape of the resource would change, so this shouldn't be a GA blocker.
The size.ts file in both steps of the integration test is useless because it always has the same value. However, I found that without a TS file present in the additional step, it would not be run. Haven't debugged further.
This PR allows the CopyFile resource to recursively copy directories as well, similar to
scp -r
.This PR enhances the CopyFile resource in a few ways.
In light of these changes, I've renamed
CopyFile
to justCopy
which is a breaking change.Resolves #23 Resolves #33 Resolves #42
TODO
The current implementation fails as soon as a file or directory already exists on the remote, like the previousCopyFile
.CopyFile
toCopy
orRemoteCopy
or insert your proposal here?TestEc2RemoteTs
, which we should share instead. What would be a good way to do that, given the code is in the TS tests, not in the Go driver?Design considerations
The behavior of the copy operation was modeled after
cp
andscp
.Specifically:
Implementation notes
size.ts
file in both steps of the integration test is useless because it always has the same value. However, I found that without a TS file present in the additional step, it would not be run. Haven't debugged further.