on master help sign in
remove-old-stack-work-libs.hs: use regexp to handle internal libraries
7903620Jens Petersen
etc/diskspace/remove-old-stack-work-libs.hs+11−16
@@ -7,17 +7,15 @@
7-- work/*/unpack-dir/.stack-work/install/x86_64-linux/*/*/lib/x86_64-linux-ghc-*
7-- work/*/unpack-dir/.stack-work/install/x86_64-linux/*/*/lib/x86_64-linux-ghc-*
8
8
9import Data.List
9import Data.List
10−import Data.List.Extra
11import System.Directory
10import System.Directory
12import System.FilePath
11import System.FilePath
12+import Text.Regex.TDFA
13
13
14main = do
14main = do
15 files <- sort <$> listDirectory "."
15 files <- sort <$> listDirectory "."
16 let (dynlibs,libdirs) = partition (".so" `isExtensionOf`) files
16 let (dynlibs,libdirs) = partition (".so" `isExtensionOf`) files
17− pkglibdirs = groupBy samePkgLibDir $
17+ pkglibdirs = groupBy samePkgLibDir libdirs
18− filter (not . ("-internal" `isSuffixOf`)) libdirs
19− pkgdynlibs = groupBy samePkgDynLib $
18+ pkgdynlibs = groupBy samePkgDynLib dynlibs
20− filter (not . ("-internal-" `isInfixOf`)) dynlibs
21 mapM_ (removeOlder removeDirectoryRecursive) pkglibdirs
19 mapM_ (removeOlder removeDirectoryRecursive) pkglibdirs
22 mapM_ (removeOlder removeFile) pkgdynlibs
20 mapM_ (removeOlder removeFile) pkgdynlibs
23 where
21 where
@@ -26,24 +24,21 @@ main = do
26 pkgDirName p =
24 pkgDirName p =
27 if length p < 25
25 if length p < 25
28 then error $ p ++ " too short to be in correct name-version-hash format"
26 then error $ p ++ " too short to be in correct name-version-hash format"
29− else (removeDashSegment . removeHashSegment) p
27+ else extractNameInternal p
30
28
31− removeHashSegment p =
29+ extractNameInternal :: String -> String
32− let dashes = elemIndices '-' p in
30+ extractNameInternal p =
33− if length dashes < 2
31+ let (name,_,internal) = p =~ "-[0-9.]+-[0-9A-Za-z]{20,22}" :: (String, String, String)
34− then error $ p ++ " not in name-version-hash format"
32+ in name ++ internal
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 (/= '-')
40
33
41 samePkgDynLib d1 d2 = pkgDynName d1 == pkgDynName d2
34 samePkgDynLib d1 d2 = pkgDynName d1 == pkgDynName d2
42 where
35 where
43 pkgDynName p =
36 pkgDynName p =
44 if length p < 42
37 if length p < 42
45 then error $ p ++ " too short to be libHSname-version-hash-ghc*.so format"
38 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 (/= '-')
47
42
48 removeOlder remover files = do
43 removeOlder remover files = do
49 -- keep 2 latest builds
44 -- keep 2 latest builds