#!/usr/bin/runhaskell import Control.Exception (try) import Control.Monad (when) import Distribution.Simple import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(buildDir)) import Distribution.Simple.Program import GHC.IO.Exception (IOException(ioe_type), IOErrorType(InvalidArgument, NoSuchThing)) import System.Posix.Files (readSymbolicLink, createSymbolicLink) import System.Process import System.Directory import System.Exit main = ensureSymbolicLink "../debian-haskell" "debian-haskell" >> defaultMainWithHooks simpleUserHooks { preSDist = \ a b -> copyFile "debian/changelog" "changelog" >> preSDist simpleUserHooks a b } runTestScript lbi = system (buildDir lbi ++ "/cabal-debian-tests/cabal-debian-tests") >>= \ code -> if code == ExitSuccess then return () else error "unit test failure" -- Do all we can to create or update a symbolic link - remove any -- existing file or directory and verify the link contents. ensureSymbolicLink :: FilePath -> FilePath -> IO () ensureSymbolicLink destination location = do result <- try (readSymbolicLink location) case result of Right destination' | destination' == destination -> return () Right _ -> removeAndRepeat Left e -> case ioe_type e of InvalidArgument -> removeAndRepeat NoSuchThing -> createSymbolicLink destination location _ -> error $ "ensureSymbolicLink " ++ show destination ++ " " ++ show location ++ " -> " ++ show e where removeAndRepeat :: IO () removeAndRepeat = do result <- try remove case (result :: Either IOError ()) of Left e -> error $ "Unable to remove " ++ show location ++ ": " ++ show e Right () -> ensureSymbolicLink destination location remove = do fileExists <- doesFileExist location case fileExists of True -> removeFile location False -> do dirExists <- doesDirectoryExist location case dirExists of True -> removeDirectoryRecursive location False -> return ()