Elliotte Rusty Harold created IO-845:
----------------------------------------

             Summary: 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


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 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)

Reply via email to