[
https://issues.apache.org/jira/browse/IO-845?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18053716#comment-18053716
]
Peter De Maeyer commented on IO-845:
------------------------------------
The behavior changed since 2.20.0 in a way that it is no longer usable for me,
so I created IO-885 which contains my suggestion of what the well-defined
behavior of {{copyDirectory}} should be.
> Copying symbolic links. how should FileUtils.copyDirectory. behave?
> -------------------------------------------------------------------
>
> Key: IO-845
> URL: https://issues.apache.org/jira/browse/IO-845
> Project: Commons IO
> Issue Type: Bug
> Reporter: Elliotte Rusty Harold
> Priority: Major
>
> The current 2.15.1 release and earlier versions have bugs in the copying of
> symbolic link cycles using FileUtils.copyDirectory. There are also bugs in
> copying broken symbolic links reported in IO-807. These are fixed at head
> because symbolic links to directories are now copied as symbolic links rather
> than by resolving the files. However this causes problems for some
> non-hypothetical existing code that relied on the old behavior for copying
> directories containing non-cyclical symbolic links.In particular, Google has
> [reported failures in some of their internal
> projects|https://github.com/apache/commons-io/commit/ec4144b01b4107d6b39f5f4d784cf05217ea4dfa#commitcomment-137567006]
> when using the version at head as a result of this. However I don't think
> that the directories Google is copying contain cycles, so they weren't
> hitting the old bugs.
> The question is how to resolve this so that FileUtils.copyDirectory behaves
> reasonably with all possible directories whether cycles are present or not.
> Is there a consistent and reasonable way we can or should copy some links to
> directories as directories and others as actual directories? There are a
> number of cases to consider:
> 1. No symbolic links. Just copy everything and we're good.
> 2. Symbolic links but only to files, not directories. Copy the file or copy
> the link?
> 3. Symbolic links but only to files within the root directory being copied.
> Right now at head we create a link to the old directory in the source. We
> could instead create a link to the new directory in the target.
> 4. Symbolic links to files outside the root directory being copied. Right now
> at head we create a link to the old directory in the source. We should
> probably keep this behavior.
> I think the behavior we want is as follows, and then I think we handle most
> use cases while avoiding cycle problems:
> 1. Start from a root directory, the source.
> 2. Never copy anything that is not contained in that directory to the target.
> 3. When walking the directory tree, if a symbolic link is encountered:
> 3.1 If the symbolic link points outside the source, create a new symbolic
> link to the same target.
> 3.2 If the symbolic link points to a target inside the source, create a new
> symbolic link to the copy of the target.
> However every symbolic link in the source turns into a symbolic link in the
> copy. Cycles do not cause problems because they are not followed. The only
> discrepancy I see in this approach is that a link to a directory outside the
> source that is a link that points back into the source still points back into
> the source, not the target. Thus the copy can point back into the source
> indirectly. Perhaps when copying links that point outside the source we can
> fully resolve them to and repoint as needed.
> I don't know that this actually fixes Google's problem. They sort of want
> files if not directories to be resolved when copying. Maybe that's a
> argument. Maybe that's a separate method like
> FileUtils.actualizeFiles(directory) that walks a file tree and replaces every
> link to a file with the contents of the target file.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)