Skip to content
This repository was archived by the owner on Jan 30, 2023. It is now read-only.

Commit dc1b2c7

Browse files
authored
Don't process files multiple times (#1)
1 parent b158897 commit dc1b2c7

File tree

2 files changed

+60
-10
lines changed

2 files changed

+60
-10
lines changed

src/main/scala/org/scalastyle/Directory.scala

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,27 @@ object Directory {
6464
files: Iterable[File],
6565
excludeFilter: Option[FileFilter] = None
6666
): Seq[FileSpec] = {
67-
files.flatMap { f =>
68-
if (excludeFilter.exists(_.accept(f))) {
69-
Nil
70-
} else if (f.isDirectory) {
71-
privateGetFiles(encoding, f.listFiles, excludeFilter)
72-
} else if (scalaFileFilter.accept(f)) {
73-
Seq(new DirectoryFileSpec(f.getAbsolutePath, encoding, f.getAbsoluteFile))
74-
} else {
75-
Nil
67+
68+
def getFilesHelper(currentFiles: Iterable[File], acc: Set[File]): Set[File] = {
69+
currentFiles.headOption match {
70+
case Some(f) =>
71+
if (excludeFilter.exists(_.accept(f))) {
72+
getFilesHelper(currentFiles.tail, acc)
73+
} else if (f.isDirectory) {
74+
val newCurrentFiles = currentFiles.tail ++ f.listFiles
75+
getFilesHelper(newCurrentFiles, acc)
76+
} else if (scalaFileFilter.accept(f) && !acc(f)) {
77+
val newAcc = acc + f
78+
getFilesHelper(currentFiles.tail, newAcc)
79+
} else {
80+
getFilesHelper(currentFiles.tail, acc)
81+
}
82+
case None => acc
7683
}
77-
}.toSeq
84+
}
85+
86+
val uniqueFiles = getFilesHelper(files, Set.empty)
87+
uniqueFiles.toSeq.map(f => new DirectoryFileSpec(f.getAbsolutePath, encoding, f.getAbsoluteFile))
7888
}
89+
7990
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package org.scalastyle
2+
3+
import java.io.File
4+
5+
import org.junit.{Assert, Test}
6+
import org.scalatestplus.junit.AssertionsForJUnit
7+
8+
class DirectoryTest extends AssertionsForJUnit {
9+
10+
private def toFile(s: String) = {
11+
val base = "src/test/resources/testDir/"
12+
new File(base + s)
13+
}
14+
15+
@Test
16+
def processSingleFileOnlyOnce(): Unit = {
17+
val duplicatedFile = List("dirA/X.scala", "dirA/X.scala")
18+
assertGetFiles(1, duplicatedFile)
19+
}
20+
21+
@Test
22+
def processDirectoryOnlyOnce(): Unit = {
23+
val duplicatedDir = List("dirA", "dirA")
24+
assertGetFiles(1, duplicatedDir)
25+
}
26+
27+
@Test
28+
def processFileInProcessDirOnlyOnce(): Unit = {
29+
val duplicatedFileInDir = List("dirB", "dirB/Y.scala")
30+
assertGetFiles(2, duplicatedFileInDir)
31+
}
32+
33+
34+
private def assertGetFiles(nrExpectedFiles: Int, inputFiles: Seq[String]): Unit = {
35+
val files = Directory.getFiles(None, inputFiles.map(toFile))
36+
Assert.assertEquals(nrExpectedFiles, files.size)
37+
}
38+
39+
}

0 commit comments

Comments
 (0)