#! /usr/bin/env runhaskell module Main where import System.Directory import Control.Monad import Data.List import System.FilePath import Distribution.Text import Distribution.Version import Data.Maybe import qualified Data.Map as M main = do files <- getDirectoryContents "." >>= filterM doesFileExist let pkgs = map splitFilename $ filter (isSuffixOf ".pkg.tar.xz") files let pkgmap = makeMap pkgs let mpkgs = M.filter ((> 1) . length) pkgmap mapM_ printToRemove $ M.elems mpkgs data ArchPkg = ArchPkg { apFileName :: FilePath , apPackage :: String , apVersion :: Maybe Version , apRelease :: Int , apArch :: String } deriving (Eq, Show) splitFilename fn = ArchPkg { apFileName = fn, apPackage = reverse pkg, apVersion = simpleParse $ reverse ver, apRelease = read $ reverse rel, apArch = reverse arch } where revfnnoext = reverse $ (iterate dropExtension fn) !! 3 (arch, (_:r1)) = break (== '-') revfnnoext (rel, (_:r2)) = break (== '-') r1 (ver, (_:r3)) = break (== '-') r2 pkg = r3 makeMap pkgs = mm M.empty pkgs where mm m [] = m mm m (pkg:rest) = mm (M.insertWith' (++) (apPackage pkg) [pkg] m) rest cmpAP a b = let verCmp = compare (apVersion a) (apVersion b) relCmp = compare (apRelease a) (apRelease b) in if verCmp /= EQ then verCmp else relCmp printToRemove ps = mapM_ (putStrLn . apFileName) (tail $ reverse $ sortBy cmpAP ps) -- vim: set ft=haskell :