Skip to content

Comments

IO-845 PathUtils.copyDirectory copies or follows symbolic links#827

Open
peterdemaeyer wants to merge 7 commits intoapache:masterfrom
peterdemaeyer:IO-845-copyDirectoryPreservesSymbolicLinks
Open

IO-845 PathUtils.copyDirectory copies or follows symbolic links#827
peterdemaeyer wants to merge 7 commits intoapache:masterfrom
peterdemaeyer:IO-845-copyDirectoryPreservesSymbolicLinks

Conversation

@peterdemaeyer
Copy link
Contributor

Defined the behavior of PathUtils.copyDirectory for symbolic links. It depends on the option LinkOption.NOFOLLOW_LINKS. Non-symbolic (hard) links are out of scope, given that the copy behavior for them was already well-defined: they're treated as regular files.
For the sake of conciseness, the following paragraphs use the term "link" for "symbolic link".

Without NOFOLLOW_LINKS option:

  • Links are followed, so that there are no links in the target directory.
  • Cyclic links result in FileSystemLoopException.
  • Broken links are ignored, they are not copied at all.

With NOFOLLOW_LINKS option:

  • Links are copied as links, so that there are links in the target directory for every link in the source directory.
  • Links that link to a file or directory inside the source directory are copied to relative links inside the target directory, linking to the copied file or directory.
  • Links that link to a file or directory outside the source directory are copied to links inside the target directory, linking to the same file or directory as the link in the source directory.
  • Cyclic links are preserved, mirrored to cyclic links in the target directory.
  • Broken links are ignored, they are not copied at all.

All of this is also explained in the updated JavaDoc.

Thanks for your contribution to Apache Commons! Your help is appreciated!

Before you push a pull request, review this list:

  • Read the contribution guidelines for this project.
  • Read the ASF Generative Tooling Guidance if you use Artificial Intelligence (AI).
  • I used AI to create any part of, or all of, this pull request. Which AI tool was used to create this pull request, and to what extent did it contribute?
  • Run a successful build using the default Maven goal with mvn; that's mvn on the command line by itself.
  • Write unit tests that match behavioral changes, where the tests fail if the changes to the runtime are not applied. This may not always be possible, but it is a best practice.
  • Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
  • Each commit in the pull request should have a meaningful subject line and body. Note that a maintainer may squash commits during the merge process.

Copy link
Member

@garydgregory garydgregory left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello @peterdemaeyer !
I have a comment in the copy visitor, and a small implementation issue about comparing enums.

Copy link
Member

@garydgregory garydgregory left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello @peterdemaeyer

Thank you for your update. You'll want to run mvn by itself before you push to run all build checks; this runs the default Maven goal as defined in the POM.

@garydgregory
Copy link
Member

garydgregory commented Feb 13, 2026

Hi @peterdemaeyer

Trying to use headers like <h4> in Javadoc is an exercise in frustration. Different versions seems to have different rules. We do use <h2> without errors, for example in org.apache.commons.lang3.function.MethodInvokers's class Javadoc. I don't think you can use an HTML header in a way that'll work across all the versions we support, all LTS versions. I would keep it simple and use <strong> or <em>.

@peterdemaeyer
Copy link
Contributor Author

peterdemaeyer commented Feb 14, 2026 via email

@garydgregory
Copy link
Member

garydgregory commented Feb 14, 2026 via email

@peterdemaeyer
Copy link
Contributor Author

peterdemaeyer commented Feb 21, 2026

Hi @peterdemaeyer

Trying to use headers like <h4> in Javadoc is an exercise in frustration. Different versions seems to have different rules. We do use <h2> without errors, for example in org.apache.commons.lang3.function.MethodInvokers's class Javadoc. I don't think you can use an HTML header in a way that'll work across all the versions we support, all LTS versions. I would keep it simple and use \<strong\> or \<em\>.

Okay, I'll change it, but beware that I didn't randomly pick <h4>, I was following this specification that says: "headings in the documentation comments for constructors, methods, fields and other members should start at heading level 4."

Your own example of <h2> for class JavaDoc is also in line with that same specification by the way: "comments for module, package, and type declarations (including nested types) should start at heading level 2".

@peterdemaeyer
Copy link
Contributor Author

peterdemaeyer commented Feb 21, 2026

Enjoy your vacation! Gary

Thanks! I noticed you addressed your comment while I was on vacation. Perfect.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants