@@ -7,17 +7,15 @@
77-- work/*/unpack-dir/.stack-work/install/x86_64-linux/*/*/lib/x86_64-linux-ghc-*
88
99import Data.List
10−import Data.List.Extra
1110import System.Directory
1211import System.FilePath
12+import Text.Regex.TDFA
1313
1414main = do
1515 files <- sort <$> listDirectory "."
1616 let (dynlibs,libdirs) = partition (".so" `isExtensionOf`) files
17− pkglibdirs = groupBy samePkgLibDir $
18− filter (not . ("-internal" `isSuffixOf`)) libdirs
19− pkgdynlibs = groupBy samePkgDynLib $
20− filter (not . ("-internal-" `isInfixOf`)) dynlibs
17+ pkglibdirs = groupBy samePkgLibDir libdirs
18+ pkgdynlibs = groupBy samePkgDynLib dynlibs
2119 mapM_ (removeOlder removeDirectoryRecursive) pkglibdirs
2220 mapM_ (removeOlder removeFile) pkgdynlibs
2321 where
@@ -26,24 +24,21 @@ main = do
2624 pkgDirName p =
2725 if length p < 25
2826 then error $ p ++ " too short to be in correct name-version-hash format"
29− else (removeDashSegment . removeHashSegment) p
27+ else extractNameInternal p
3028
31− removeHashSegment p =
32− let dashes = elemIndices '-' p in
33− if length dashes < 2
34− then error $ p ++ " not in name-version-hash format"
35− else let final = last dashes in
36− if length p - final `elem` [23,22,21] then take final p
37− else error $ p ++ " has incorrect hash length"
38−
39− removeDashSegment = init . dropWhileEnd (/= '-')
29+ extractNameInternal :: String -> String
30+ extractNameInternal p =
31+ let (name,_,internal) = p =~ "-[0-9.]+-[0-9A-Za-z]{20,22}" :: (String, String, String)
32+ in name ++ internal
4033
4134 samePkgDynLib d1 d2 = pkgDynName d1 == pkgDynName d2
4235 where
4336 pkgDynName p =
4437 if length p < 42
4538 then error $ p ++ " too short to be libHSname-version-hash-ghc*.so format"
46− else (removeDashSegment . removeHashSegment . removeDashSegment) p
39+ else (extractNameInternal . removeDashSegment) p
40+
41+ removeDashSegment = dropWhileEnd (/= '-')
4742
4843 removeOlder remover files = do
4944 -- keep 2 latest builds