Compare commits

..

2 Commits

Author SHA1 Message Date
d628848af6 Silence hlint 2023-02-23 23:15:08 +08:00
b547324253 Smarter variants for 'listDirectory', fixing #797 2023-02-23 21:47:50 +08:00
3 changed files with 120 additions and 94 deletions

View File

@@ -335,7 +335,7 @@ ghcSet mtarget = do
getInstalledGHCs :: (MonadReader env m, HasDirs env, MonadIO m) => m [Either FilePath GHCTargetVersion] getInstalledGHCs :: (MonadReader env m, HasDirs env, MonadIO m) => m [Either FilePath GHCTargetVersion]
getInstalledGHCs = do getInstalledGHCs = do
ghcdir <- ghcupGHCBaseDir ghcdir <- ghcupGHCBaseDir
fs <- liftIO $ hideErrorDef [NoSuchThing] [] $ listDirectory (fromGHCupPath ghcdir) fs <- liftIO $ hideErrorDef [NoSuchThing] [] $ listDirectoryDirs (fromGHCupPath ghcdir)
forM fs $ \f -> case parseGHCupGHCDir f of forM fs $ \f -> case parseGHCupGHCDir f of
Right r -> pure $ Right r Right r -> pure $ Right r
Left _ -> pure $ Left f Left _ -> pure $ Left f
@@ -438,7 +438,7 @@ getInstalledHLSs = do
Nothing -> pure $ Left f Nothing -> pure $ Left f
hlsdir <- ghcupHLSBaseDir hlsdir <- ghcupHLSBaseDir
fs <- liftIO $ hideErrorDef [NoSuchThing] [] $ listDirectory (fromGHCupPath hlsdir) fs <- liftIO $ hideErrorDef [NoSuchThing] [] $ listDirectoryDirs (fromGHCupPath hlsdir)
new <- forM fs $ \f -> case parseGHCupHLSDir f of new <- forM fs $ \f -> case parseGHCupHLSDir f of
Right r -> pure $ Right r Right r -> pure $ Right r
Left _ -> pure $ Left f Left _ -> pure $ Left f
@@ -626,7 +626,7 @@ hlsInternalServerScripts ver mghcVer = do
dir <- ghcupHLSDir ver dir <- ghcupHLSDir ver
let bdir = fromGHCupPath dir </> "bin" let bdir = fromGHCupPath dir </> "bin"
fmap (bdir </>) . filter (\f -> maybe True (\gv -> ("-" <> T.unpack (prettyVer gv)) `isSuffixOf` f) mghcVer) fmap (bdir </>) . filter (\f -> maybe True (\gv -> ("-" <> T.unpack (prettyVer gv)) `isSuffixOf` f) mghcVer)
<$> liftIO (listDirectory bdir) <$> liftIO (listDirectoryFiles bdir)
-- | Get all binaries for a hls version from the ~/.ghcup/hls/<ver>/lib/haskell-language-server-<ver>/bin directory, if any. -- | Get all binaries for a hls version from the ~/.ghcup/hls/<ver>/lib/haskell-language-server-<ver>/bin directory, if any.
-- Returns the full path. -- Returns the full path.
@@ -639,7 +639,7 @@ hlsInternalServerBinaries ver mghcVer = do
let regex = makeRegexOpts compExtended execBlank ([s|^haskell-language-server-.*$|] :: ByteString) let regex = makeRegexOpts compExtended execBlank ([s|^haskell-language-server-.*$|] :: ByteString)
(Just bdir) <- fmap headMay $ liftIO $ expandFilePath [Left (dir </> "lib"), Right regex, Left "bin"] (Just bdir) <- fmap headMay $ liftIO $ expandFilePath [Left (dir </> "lib"), Right regex, Left "bin"]
fmap (bdir </>) . filter (\f -> maybe True (\gv -> ("-" <> T.unpack (prettyVer gv)) `isSuffixOf` f) mghcVer) fmap (bdir </>) . filter (\f -> maybe True (\gv -> ("-" <> T.unpack (prettyVer gv)) `isSuffixOf` f) mghcVer)
<$> liftIO (listDirectory bdir) <$> liftIO (listDirectoryFiles bdir)
-- | Get all libraries for a hls version from the ~/.ghcup/hls/<ver>/lib/haskell-language-server-<ver>/lib/<ghc-ver>/ -- | Get all libraries for a hls version from the ~/.ghcup/hls/<ver>/lib/haskell-language-server-<ver>/lib/<ghc-ver>/
-- directory, if any. -- directory, if any.
@@ -652,7 +652,7 @@ hlsInternalServerLibs ver ghcVer = do
dir <- fromGHCupPath <$> ghcupHLSDir ver dir <- fromGHCupPath <$> ghcupHLSDir ver
let regex = makeRegexOpts compExtended execBlank ([s|^haskell-language-server-.*$|] :: ByteString) let regex = makeRegexOpts compExtended execBlank ([s|^haskell-language-server-.*$|] :: ByteString)
(Just bdir) <- fmap headMay $ liftIO $ expandFilePath [Left (dir </> "lib"), Right regex, Left ("lib" </> T.unpack (prettyVer ghcVer))] (Just bdir) <- fmap headMay $ liftIO $ expandFilePath [Left (dir </> "lib"), Right regex, Left ("lib" </> T.unpack (prettyVer ghcVer))]
fmap (bdir </>) <$> liftIO (listDirectory bdir) fmap (bdir </>) <$> liftIO (listDirectoryFiles bdir)
-- | Get the wrapper binary for an hls version, if any. -- | Get the wrapper binary for an hls version, if any.
@@ -936,7 +936,7 @@ ghcToolFiles ver = do
whenM (fmap not $ ghcInstalled ver) whenM (fmap not $ ghcInstalled ver)
(throwE (NotInstalled GHC ver)) (throwE (NotInstalled GHC ver))
files <- liftIO (listDirectory bindir >>= filterM (doesFileExist . (bindir </>))) files <- liftIO (listDirectoryFiles bindir >>= filterM (doesFileExist . (bindir </>)))
pure (getUniqueTools . groupToolFiles . fmap (dropSuffix exeExt) $ files) pure (getUniqueTools . groupToolFiles . fmap (dropSuffix exeExt) $ files)
where where

View File

@@ -42,6 +42,9 @@ module GHCup.Utils.Dirs
, removeDirectoryRecursive , removeDirectoryRecursive
, removePathForcibly , removePathForcibly
, listDirectoryFiles
, listDirectoryDirs
-- System.Directory re-exports -- System.Directory re-exports
, createDirectory , createDirectory
, createDirectoryIfMissing , createDirectoryIfMissing
@@ -130,7 +133,7 @@ import Data.Maybe
import Data.Versions import Data.Versions
import GHC.IO.Exception ( IOErrorType(NoSuchThing) ) import GHC.IO.Exception ( IOErrorType(NoSuchThing) )
import Haskus.Utils.Variant.Excepts import Haskus.Utils.Variant.Excepts
import Optics import Optics hiding ( uncons )
import Safe import Safe
import System.Directory hiding ( removeDirectory import System.Directory hiding ( removeDirectory
, removeDirectoryRecursive , removeDirectoryRecursive
@@ -529,6 +532,29 @@ cleanupTrash = do
) $ liftIO $ removePathForcibly (recycleDir `appendGHCupPath` fp)) ) $ liftIO $ removePathForcibly (recycleDir `appendGHCupPath` fp))
-- | List *actual files* in a directory, ignoring empty files and a couple
-- of blacklisted files, such as '.DS_Store' on mac.
listDirectoryFiles :: FilePath -> IO [FilePath]
listDirectoryFiles fp = do
listDirectory fp >>= filterM (doesFileExist . (fp </>)) <&> filter (\fp' -> not (isHidden fp') && not (isBlacklisted fp'))
-- | List *actual directories* in a directory, ignoring empty directories and a couple
-- of blacklisted files, such as '.DS_Store' on mac.
listDirectoryDirs :: FilePath -> IO [FilePath]
listDirectoryDirs fp = do
listDirectory fp >>= filterM (doesDirectoryExist . (fp </>)) <&> filter (\fp' -> not (isHidden fp') && not (isBlacklisted fp'))
isHidden :: FilePath -> Bool
isHidden fp'
| isWindows = False
| Just ('.', _) <- uncons fp' = True
| otherwise = False
isBlacklisted :: FilePath -> Bool
{- HLINT ignore "Use ==" -}
isBlacklisted fp' = fp' `elem` [".DS_Store"]
-- System.Directory re-exports with GHCupPath -- System.Directory re-exports with GHCupPath

View File

@@ -195,8 +195,8 @@
"dlUri": "https:g" "dlUri": "https:g"
}, },
"viTags": [ "viTags": [
"base-6.5.1", "base-3.2.2",
"base-2.2.5", "Prerelease",
"𪔊\u0007\u0015" "𪔊\u0007\u0015"
], ],
"viTestDL": { "viTestDL": {
@@ -271,7 +271,7 @@
"viPreCompile": "thzbtjc", "viPreCompile": "thzbtjc",
"viSourceDL": null, "viSourceDL": null,
"viTags": [ "viTags": [
"LatestPrerelease", "old",
"old" "old"
], ],
"viTestDL": { "viTestDL": {
@@ -993,8 +993,8 @@
"Latest", "Latest",
"Recommended", "Recommended",
"Prerelease", "Prerelease",
"base-6.3.2", "base-2.3.5",
"base-6.3.1" "\u0005EL"
], ],
"viTestDL": null "viTestDL": null
}, },
@@ -1140,9 +1140,9 @@
"viSourceDL": null, "viSourceDL": null,
"viTags": [ "viTags": [
"Latest", "Latest",
"LatestPrerelease", "base-2.1.2",
"base-5.6.5", "base-5.2.1",
"LatestPrerelease" "old"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": -5, "dlCSize": -5,
@@ -1584,13 +1584,13 @@
"dlUri": "https:l" "dlUri": "https:l"
}, },
"viTags": [ "viTags": [
"LatestPrerelease", "base-1.1.6",
"Latest", "Latest",
"old", "old",
"base-4.2.4", "base-4.6.2",
"􀜶l􀻈𠹟󿴠F", "􀜶l􀻈𠹟󿴠F",
"old", "old",
"LatestPrerelease" "Recommended"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": 0, "dlCSize": 0,
@@ -1897,7 +1897,7 @@
"old", "old",
"Latest", "Latest",
"Recommended", "Recommended",
"base-1.3.3" "Prerelease"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": 5, "dlCSize": 5,
@@ -2348,10 +2348,10 @@
"dlUri": "http:" "dlUri": "http:"
}, },
"viTags": [ "viTags": [
"base-5.5.1", "t\u001e\u001aB8",
"old", "old",
"", "",
"LatestPrerelease" "old"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": -4, "dlCSize": -4,
@@ -3337,9 +3337,9 @@
}, },
"viTags": [ "viTags": [
"Prerelease", "Prerelease",
"old", "base-5.6.1",
"*𭡕󼅇󰢑3i", "base-3.3.3",
"base-5.1.4", "base-3.2.1",
"Latest", "Latest",
":ᄻ[" ":ᄻ["
], ],
@@ -3767,9 +3767,9 @@
}, },
"viTags": [ "viTags": [
"Prerelease", "Prerelease",
"base-2.2.4", "base-2.4.6",
"\u0008", "base-4.1.3",
"LatestPrerelease" "base-4.4.6"
], ],
"viTestDL": null "viTestDL": null
}, },
@@ -3901,8 +3901,8 @@
}, },
"viTags": [ "viTags": [
"Latest", "Latest",
"base-3.3.5", "Latest",
"LatestPrerelease", "base-3.1.4",
"Recommended", "Recommended",
"Prerelease", "Prerelease",
"old", "old",
@@ -4030,8 +4030,8 @@
"Recommended", "Recommended",
"Prerelease", "Prerelease",
"Recommended", "Recommended",
"base-2.4.6", "Latest",
"LatestPrerelease" "old"
], ],
"viTestDL": null "viTestDL": null
}, },
@@ -4212,7 +4212,7 @@
"viSourceDL": null, "viSourceDL": null,
"viTags": [ "viTags": [
"X\u001d^Y󶹬", "X\u001d^Y󶹬",
"base-3.5.1" "base-2.3.5"
], ],
"viTestDL": null "viTestDL": null
}, },
@@ -4497,10 +4497,10 @@
"viTags": [ "viTags": [
"old", "old",
"Latest", "Latest",
"oj&,m", "base-5.6.4",
"\u0019\u0007", "\u0019\u0007",
"Recommended", "Recommended",
"LatestPrerelease" "Latest"
], ],
"viTestDL": null "viTestDL": null
} }
@@ -4718,12 +4718,12 @@
"dlUri": "http:k" "dlUri": "http:k"
}, },
"viTags": [ "viTags": [
"old", "base-5.3.4",
"Recommended", "Recommended",
"Recommended", "Recommended",
"base-3.5.1", "base-4.3.5",
"LatestPrerelease", "Latest",
"base-3.3.3" "󲨆Rs;h~"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": -3, "dlCSize": -3,
@@ -4928,12 +4928,12 @@
"viPreCompile": null, "viPreCompile": null,
"viSourceDL": null, "viSourceDL": null,
"viTags": [ "viTags": [
"LatestPrerelease", "base-1.5.5",
"Latest", "Latest",
"Latest", "Latest",
"old", "old",
"Latest", "Latest",
"LatestPrerelease", "base-3.6.4",
"old" "old"
], ],
"viTestDL": { "viTestDL": {
@@ -5027,12 +5027,12 @@
}, },
"viTags": [ "viTags": [
"Latest", "Latest",
"old", "base-3.6.5",
"base-1.6.1", "base-3.4.1",
"𬰗𗛞Q#", "𬰗𗛞Q#",
"", "",
"Prerelease", "Prerelease",
"base-6.6.2" "base-5.1.4"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": 6, "dlCSize": 6,
@@ -5368,12 +5368,12 @@
"dlUri": "http:rjevxi" "dlUri": "http:rjevxi"
}, },
"viTags": [ "viTags": [
"󿿁U:3\u000fd", "base-1.6.1",
"S󶱩󳷐I🢐", "S󶱩󳷐I🢐",
"old", "old",
"󼗛𤔄\u001a~F", "󼗛𤔄\u001a~F",
"Latest", "Latest",
"LatestPrerelease" "base-4.5.4"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": null, "dlCSize": null,
@@ -5697,10 +5697,10 @@
"dlUri": "http:viiv" "dlUri": "http:viiv"
}, },
"viTags": [ "viTags": [
"base-1.5.6", "base-3.1.6",
"Prerelease", "Prerelease",
"Recommended", "Recommended",
"base-1.3.2" ")\u0005\u0015"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": 5, "dlCSize": 5,
@@ -7482,7 +7482,7 @@
"Recommended", "Recommended",
"old", "old",
"old", "old",
"(>" "Latest"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": null, "dlCSize": null,
@@ -8175,11 +8175,11 @@
"dlUri": "http:ndqpk" "dlUri": "http:ndqpk"
}, },
"viTags": [ "viTags": [
"base-2.1.6", "\"􁫳5\u0006F",
"Recommended", "Recommended",
"Prerelease", "Prerelease",
"LatestPrerelease",
"old", "old",
"base-3.3.1",
"Recommended" "Recommended"
], ],
"viTestDL": null "viTestDL": null
@@ -8199,10 +8199,10 @@
"dlUri": "https:gqhlp" "dlUri": "https:gqhlp"
}, },
"viTags": [ "viTags": [
"old", "base-4.3.4",
"Recommended", "Recommended",
"LatestPrerelease", "old",
"base-6.5.6" "base-4.1.4"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": null, "dlCSize": null,
@@ -8400,7 +8400,7 @@
"\u0001", "\u0001",
"Prerelease", "Prerelease",
"Prerelease", "Prerelease",
"1Aⳃ", "base-3.6.3",
"Latest" "Latest"
], ],
"viTestDL": { "viTestDL": {
@@ -8427,13 +8427,13 @@
"dlUri": "http:pvmi" "dlUri": "http:pvmi"
}, },
"viTags": [ "viTags": [
"LatestPrerelease", "old",
"LatestPrerelease", "old",
"LatestPrerelease", "Latest",
"old", "old",
")", ")",
"Recommended", "Recommended",
"LatestPrerelease" "old"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": -2, "dlCSize": -2,
@@ -8941,9 +8941,9 @@
"dlUri": "http:oth" "dlUri": "http:oth"
}, },
"viTags": [ "viTags": [
"􄖛\u001c\u001f", "base-4.1.5",
"フ􍋦", "フ􍋦",
"LatestPrerelease" "base-1.4.5"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": -5, "dlCSize": -5,
@@ -10152,9 +10152,9 @@
"viPreCompile": "deajwn", "viPreCompile": "deajwn",
"viSourceDL": null, "viSourceDL": null,
"viTags": [ "viTags": [
"base-1.4.3", "base-6.4.5",
"LatestPrerelease", "base-5.1.1",
"LatestPrerelease", "base-4.4.6",
"Latest", "Latest",
"Latest", "Latest",
"Prerelease", "Prerelease",
@@ -10479,11 +10479,11 @@
"viPreCompile": "", "viPreCompile": "",
"viSourceDL": null, "viSourceDL": null,
"viTags": [ "viTags": [
"󻦧s", "Prerelease",
"Recommended", "Recommended",
"old", "old",
"N\u001b", "N\u001b",
"LatestPrerelease", "base-5.5.2",
"", "",
"Recommended" "Recommended"
], ],
@@ -10716,8 +10716,8 @@
"viSourceDL": null, "viSourceDL": null,
"viTags": [ "viTags": [
"Recommended", "Recommended",
"base-4.3.2", "base-3.6.1",
"base-2.3.4", "base-4.3.3",
"Recommended", "Recommended",
"Latest" "Latest"
], ],
@@ -11178,8 +11178,8 @@
"viTags": [ "viTags": [
"Prerelease", "Prerelease",
"Latest", "Latest",
"5𨥶$𬰇", "base-5.3.2",
"base-3.1.6" "[3憥􋉞"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": 1, "dlCSize": 1,
@@ -11698,7 +11698,7 @@
"viTags": [ "viTags": [
"𥭏}\u000e", "𥭏}\u000e",
"\u0007/", "\u0007/",
"LatestPrerelease", "base-6.5.3",
"Latest" "Latest"
], ],
"viTestDL": { "viTestDL": {
@@ -13992,7 +13992,7 @@
}, },
"viTags": [ "viTags": [
"Prerelease", "Prerelease",
"base-7.5.2", "base-4.6.2",
"3g7", "3g7",
"Recommended" "Recommended"
], ],
@@ -14463,10 +14463,10 @@
}, },
"viTags": [ "viTags": [
"Recommended", "Recommended",
"LatestPrerelease", "base-3.4.3",
"base-1.2.2", "base-4.3.5",
"Latest", "Latest",
"LatestPrerelease" "base-5.4.2"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": null, "dlCSize": null,
@@ -14650,8 +14650,8 @@
}, },
"viTags": [ "viTags": [
"Latest", "Latest",
"base-5.6.2", "",
"old" "base-3.5.6"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": -1, "dlCSize": -1,
@@ -14735,11 +14735,11 @@
"dlUri": "http:koxgqu" "dlUri": "http:koxgqu"
}, },
"viTags": [ "viTags": [
"base-4.4.6", "base-6.3.3",
"B\u0004", "base-2.4.2",
"old", "Latest",
"LatestPrerelease", "base-3.1.6",
"base-4.5.5", "",
"Latest" "Latest"
], ],
"viTestDL": { "viTestDL": {
@@ -15054,12 +15054,12 @@
"dlUri": "http:s" "dlUri": "http:s"
}, },
"viTags": [ "viTags": [
"9􀦐or𰉒", "Latest",
"old", "base-5.1.1",
"base-2.4.4", "𫠼",
"Recommended", "Recommended",
"OHk(\u0007󹌞", "OHk(\u0007󹌞",
"LatestPrerelease" "old"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": 1, "dlCSize": 1,
@@ -15251,10 +15251,10 @@
"viTags": [ "viTags": [
"Latest", "Latest",
"Latest", "Latest",
"old", "Latest",
"𮧬", "𮧬",
"old", "old",
"LatestPrerelease", "old",
"" ""
], ],
"viTestDL": { "viTestDL": {
@@ -15615,11 +15615,11 @@
"dlUri": "https:oat" "dlUri": "https:oat"
}, },
"viTags": [ "viTags": [
"", "base-6.6.4",
"old", "Recommended",
"Recommended", "Recommended",
"old", "old",
"base-6.3.4" "Prerelease"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": null, "dlCSize": null,
@@ -15904,13 +15904,13 @@
"dlUri": "https:rwxmrn" "dlUri": "https:rwxmrn"
}, },
"viTags": [ "viTags": [
"old", "base-7.2.1",
"Prerelease", "Prerelease",
"base-2.5.3", "X",
"Latest", "Latest",
"base-5.3.3", "z 7\u0008N\u000e",
"old", "old",
"base-7.2.1" "󱕠\u0006g"
], ],
"viTestDL": { "viTestDL": {
"dlCSize": 5, "dlCSize": 5,