{-# OPTIONS_GHC -fno-warn-deprecations #-} {-# OPTIONS_GHC -fno-warn-orphans #-} {-# LANGUAGE TemplateHaskell #-} module Main (main) where import Control.Monad (when) import qualified Data.ByteString.Lazy as BL import Data.List import Data.Aeson import Data.Aeson.TH import Distribution.ModuleName (ModuleName) import Distribution.Package import Distribution.PackageDescription import Distribution.PackageDescription.Configuration import Distribution.PackageDescription.Parse (readPackageDescription) import Distribution.Verbosity import Distribution.Version import Distribution.License import Distribution.Compiler import Language.Haskell.Extension import System.Environment import System.Directory import System.FilePath.Find as SFF import System.IO deriveJSON id ''PackageDescription deriveJSON id ''PackageIdentifier deriveJSON id ''PackageName deriveJSON id ''Version deriveJSON id ''SourceRepo deriveJSON id ''RepoKind deriveJSON id ''RepoType deriveJSON id ''BuildType deriveJSON id ''Library deriveJSON id ''Executable deriveJSON id ''TestSuite deriveJSON id ''License deriveJSON id ''CompilerFlavor deriveJSON id ''TestSuiteInterface deriveJSON id ''BuildInfo deriveJSON id ''ModuleName deriveJSON id ''Dependency deriveJSON id ''Language deriveJSON id ''Extension deriveJSON id ''TestType deriveJSON id ''VersionRange createVersion :: [Int] -> String createVersion a = intercalate "." . map show $ a cabal2JSON :: FilePath -> IO () cabal2JSON cabal = do gdesc <- readPackageDescription normal cabal let desc = flattenPackageDescription gdesc PackageName str = pkgName $ package desc Version branch tags = packageVersion $ package desc number = createVersion branch file = str ++ "-version-" ++ number ++ ".json" bs = encode . toJSON $ desc BL.writeFile file bs -- search :: System.FilePath.GlobPattern.GlobPattern -> FilePath -> IO [FilePath] search pat dir = SFF.find always (fileName ~~? pat) dir main :: IO () main = do [dir] <- getArgs files <- search "*.cabal" dir mapM_ cabal2JSON files