You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Gary D. Gregory (Jira)" <ji...@apache.org> on 2024/01/28 14:28:00 UTC

[jira] [Commented] (IO-845) Copying symbolic links. how should FileUtils.copyDirectory. behave?

    [ https://issues.apache.org/jira/browse/IO-845?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17811667#comment-17811667 ] 

Gary D. Gregory commented on IO-845:
------------------------------------

"Through the current 3.15.1 release..." 
I think you mean 3.14.0 or are you referring the snapshot builds?

> 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
>
> Through the current 3.15.1 release there are 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 hot 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)