@@ -25,6 +25,7 @@ import monix.reactive.Consumer
2525import monix .reactive .MulticastStrategy
2626import monix .reactive .Observable
2727import sbt .internal .inc .PlainVirtualFileConverter
28+ import bloop .logging .Logger
2829
2930object SourceHasher {
3031 private final val sourceMatcher =
@@ -58,7 +59,8 @@ object SourceHasher {
5859 updateGenerator : SourceGenerator => Task [List [AbsolutePath ]],
5960 parallelUnits : Int ,
6061 cancelCompilation : Promise [Unit ],
61- scheduler : Scheduler
62+ scheduler : Scheduler ,
63+ logger : Logger
6264 ): Task [Either [Unit , List [HashedSource ]]] = {
6365 val isCancelled = AtomicBoolean (false )
6466 val sourceFilesAndDirectories = project.sources.distinct
@@ -80,8 +82,10 @@ object SourceHasher {
8082 def visitFileFailed (
8183 t : Path ,
8284 e : IOException
83- ): FileVisitResult = FileVisitResult .CONTINUE
84-
85+ ): FileVisitResult = {
86+ logger.error(s " Failed to visit file $t: ${e.getMessage}" , e)
87+ FileVisitResult .CONTINUE
88+ }
8589 def preVisitDirectory (
8690 directory : Path ,
8791 attributes : BasicFileAttributes
@@ -103,7 +107,7 @@ object SourceHasher {
103107 val discovery = fileVisitor(matchSourceFile)
104108 val opts = java.util.EnumSet .of(FileVisitOption .FOLLOW_LINKS )
105109 sourceFilesAndDirectories.foreach { sourcePath =>
106- if (visitedDirs.contains(sourcePath.underlying)) ()
110+ if (visitedDirs.contains(sourcePath.underlying) || ! sourcePath.exists ) ()
107111 else if (isCancelled.get) ()
108112 else {
109113 Files .walkFileTree(sourcePath.underlying, opts, Int .MaxValue , discovery)
0 commit comments