Skip to content

Commit c8ff0ce

Browse files
authored
Fix listFiles() and listDirectory() to follow symbolic links (#6808)
Signed-off-by: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com>
1 parent 4657cc0 commit c8ff0ce

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

modules/nf-commons/src/main/nextflow/extension/FilesEx.groovy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import java.nio.ByteBuffer
2222
import java.nio.channels.SeekableByteChannel
2323
import java.nio.file.FileAlreadyExistsException
2424
import java.nio.file.FileSystemException
25+
import java.nio.file.FileVisitOption
2526
import java.nio.file.FileVisitResult
2627
import java.nio.file.Files
2728
import java.nio.file.LinkOption
@@ -658,8 +659,9 @@ class FilesEx {
658659
return null
659660

660661
final result = []
662+
final opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS)
661663

662-
Files.walkFileTree(self, new SimpleFileVisitor<Path>() {
664+
Files.walkFileTree(self, opts, Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
663665

664666
FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
665667
if( filter == null || invokeFilter(filter, file, attrs) )

modules/nf-commons/src/test/nextflow/extension/FilesExTest.groovy

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,28 @@ class FilesExTest extends Specification {
603603
sourceFolder.deleteDir()
604604
}
605605

606+
def 'should list files in symlinked directory' () {
607+
608+
given:
609+
def folder = Files.createTempDirectory('test')
610+
def realDir = folder.resolve('realDir')
611+
Files.createDirectories(realDir)
612+
realDir.resolve('file1.txt').text = 'Hello1'
613+
realDir.resolve('file2.txt').text = 'Hello2'
614+
def linkDir = folder.resolve('linkDir')
615+
Files.createSymbolicLink(linkDir, realDir)
616+
617+
when:
618+
def paths = linkDir.listFiles()
619+
620+
then:
621+
paths.size() == 2
622+
paths.collect { it.name }.sort() == ['file1.txt', 'file2.txt']
623+
624+
cleanup:
625+
folder?.deleteDir()
626+
}
627+
606628

607629
def testSetReadonly() {
608630

0 commit comments

Comments
 (0)