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