@@ -114,9 +114,10 @@ import qualified Language.LSP.Server as LSP
114
114
import Numeric.Natural (Natural )
115
115
import Options.Applicative hiding (action )
116
116
import qualified System.Directory.Extra as IO
117
- import System.Exit (ExitCode (ExitFailure ),
117
+ import System.Exit (ExitCode (ExitFailure , ExitSuccess ),
118
118
exitWith )
119
- import System.FilePath (takeExtension ,
119
+ import System.FilePath ((</>) ,
120
+ takeExtension ,
120
121
takeFileName )
121
122
import System.IO (BufferMode (LineBuffering , NoBuffering ),
122
123
Handle , hFlush ,
@@ -125,6 +126,7 @@ import System.IO (BufferMode (LineBuffe
125
126
hSetEncoding , stderr ,
126
127
stdin , stdout , utf8 )
127
128
import System.Random (newStdGen )
129
+ import System.Process (readProcessWithExitCode )
128
130
import System.Time.Extra (Seconds , offsetTime ,
129
131
showDuration )
130
132
@@ -446,15 +448,29 @@ defaultMain recorder Arguments{..} = withHeapStats (cmapWithPrio LogHeapStats re
446
448
c ide
447
449
448
450
expandFiles :: [FilePath ] -> IO [FilePath ]
449
- expandFiles = concatMapM $ \ x -> do
451
+ expandFiles paths = do
452
+ let haskellFind x =
453
+ let recurse " ." = True
454
+ recurse y | " ." `isPrefixOf` takeFileName y = False -- skip .git etc
455
+ recurse y = takeFileName y `notElem` [" dist" , " dist-newstyle" ] -- cabal directories
456
+ in filter (\ y -> takeExtension y `elem` [" .hs" , " .lhs" ]) <$> IO. listFilesInside (return . recurse) x
457
+ (testGitExitCode, _, _) <- readProcessWithExitCode " git" [" status" ] " "
458
+ let findFiles =
459
+ case testGitExitCode of
460
+ ExitSuccess -> \ path -> do
461
+ let lookups = [path, path </> " *.hs" , path </> " *.lhs" ]
462
+ (trackedExitCode, trackedStdout, _) <- readProcessWithExitCode " git" (" ls-files" : lookups) " "
463
+ (untrackedExitCode, untrackedStdout, _) <- readProcessWithExitCode " git" (" ls-files" : " -o" : lookups) " "
464
+ if trackedExitCode == ExitSuccess && untrackedExitCode == ExitSuccess
465
+ then pure $ lines trackedStdout <> lines untrackedStdout
466
+ else haskellFind path
467
+ _ -> haskellFind
468
+ flip concatMapM paths $ \ x -> do
450
469
b <- IO. doesFileExist x
451
470
if b
452
471
then return [x]
453
472
else do
454
- let recurse " ." = True
455
- recurse y | " ." `isPrefixOf` takeFileName y = False -- skip .git etc
456
- recurse y = takeFileName y `notElem` [" dist" , " dist-newstyle" ] -- cabal directories
457
- files <- filter (\ y -> takeExtension y `elem` [" .hs" , " .lhs" ]) <$> IO. listFilesInside (return . recurse) x
473
+ files <- findFiles x
458
474
when (null files) $
459
475
fail $ " Couldn't find any .hs/.lhs files inside directory: " ++ x
460
476
return files
0 commit comments