cblrepo-0.9.0: src/Main.hs
{-
- Copyright 2011-2013 Per Magnus Therning
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-}
module Main where
import Add
import BuildPkgs
import BumpPkgs
import Sync
import Versions
import ListPkgs
import Updates
import Util.Misc
import Urls
import PkgBuild
import ConvertDB
import Remove
import Paths_cblrepo
import Control.Monad
import Control.Monad.Reader
import Distribution.Text
import System.Directory
import System.FilePath
import Options.Applicative as OA
-- -- {{{1 command line arguments
argAppDir = strOption (long "appdir" <> value "" <> help "application data directory")
argDbFile = strOption (long "db" <> value "cblrepo.db" <> help "package database")
argDryRun = switch (short 'n' <> help "dry run")
cmdAddPkgOpts = CmdAdd
<$> strOption (long "patchdir" <> value "patches" <> help "location of patches (patches)")
<*> many (nullOption (short 'g' <> long "ghc-pkg" <> OA.reader strPairArg <> metavar "PKG,VER" <> help "GHC base package (multiple)"))
<*> many (nullOption (short 'd' <> long "distro-pkg" <> OA.reader strTripleArg <> metavar "PKG,VER,REL" <> help "distro package (multiple)"))
<*> many (strOption (short 'u' <> long "cbl-url" <> metavar "URL" <> help "url of CABAL file (multiple)"))
<*> many (strOption (short 'f' <> long "cbl-file" <> metavar "FILE" <> help "CABAL file (multiple)"))
<*> arguments strPairArg (metavar "PKGNAME,VERSION ...")
cmdAddPkgCmd = command "add" (info (helper <*> cmdAddPkgOpts)
(fullDesc <> progDesc "add a package to the database"))
cmdBumpPkgsOpts = CmdBumpPkgs
<$> switch (long "inclusive" <> help "include the listed packages")
<*> arguments1 Just (metavar "PKGNAME ...")
cmdBumpPkgsCmd = command "bump" (info (helper <*> cmdBumpPkgsOpts)
(fullDesc <> progDesc "bump packages that need it after updating the named packages"))
cmdBuildPkgsOpts = CmdBuildPkgs
<$> arguments1 Just (metavar "PKGNAME ...")
cmdBuildPkgsCmd = command "build" (info (helper <*> cmdBuildPkgsOpts)
(fullDesc <> progDesc "re-order packages into a good build order"))
cmdSyncOpts = CmdSync <$> switch (internal <> hidden)
cmdSyncCmd = command "sync" (info (helper <*> cmdSyncOpts)
(fullDesc <> progDesc "update the index"))
cmdVersionsOpts = CmdVersions
<$> arguments1 Just (metavar "PKGNAME ...")
cmdVersionsCmd = command "versions" (info (helper <*> cmdVersionsOpts)
(fullDesc <> progDesc "list available versions of packages"))
cmdUpdatesOpts = CmdUpdates
<$> switch (short 's' <> help "a shorter output suitable for scripting")
cmdUpdatesCmd = command "updates" (info (helper <*> cmdUpdatesOpts)
(fullDesc <> progDesc "check for available updates"))
cmdListPkgsOpts = CmdListPkgs
<$> switch (short 'g' <> long "ghc" <> help "list ghc packages")
<*> switch (short 'd' <> long "distro" <> help "list distro packages")
<*> switch (long "no-repo" <> help "do not list repo packages")
<*> switch (long "hackage" <> help "list in hackage format")
cmdListPkgsCmd = command "list" (info (helper <*> cmdListPkgsOpts)
(fullDesc <> progDesc "list packages in repo"))
cmdUrlsOpts = CmdUrls
<$> arguments1 strPairArg (metavar "PKGNAME,VERSION ...")
cmdUrlsCmd = command "urls" (info (helper <*> cmdUrlsOpts)
(fullDesc <> progDesc "list urls of CABAL files for the given packages"))
cmdPkgBuildOpts = CmdPkgBuild
<$> strOption (long "patchdir" <> value "patches" <> help "location of patches (patches)")
<*> arguments1 Just (metavar "PKGNAME ...")
cmdPkgBuildCmd = command "pkgbuild" (info (helper <*> cmdPkgBuildOpts)
(fullDesc <> progDesc "create PKGBUILD other files necessary for an Arch package"))
cmdConvertDbOpts = CmdConvertDb
<$> strOption (short 'i' <> long "indb" <> value "cblrepo.db" <> help "old database")
<*> strOption (short 'o' <> long "outdb" <> value "new-cblrepo.db" <> help "new database")
cmdConvertDbCmd = command "convertdb" (info (helper <*> cmdConvertDbOpts)
(fullDesc <> progDesc "convert and old database to the new format"))
cmdRemovePkgOpts = CmdRemovePkg
<$> arguments1 Just (metavar "PKGNAME ...")
cmdRemovePkgCmd = command "rm" (info (helper <*> cmdRemovePkgOpts)
(fullDesc <> progDesc "remove packages"))
argParser = info (helper <*> opts) (fullDesc <> header (progName ++ " v" ++ (display version)) <> progDesc "maintain a datatbase of dependencies of CABAL packages")
where
opts = Opts <$> argAppDir <*> argDbFile <*> argDryRun
<*> subparser (
cmdAddPkgCmd <> cmdBumpPkgsCmd <> cmdBuildPkgsCmd <> cmdSyncCmd <> cmdVersionsCmd <>
cmdUpdatesCmd <> cmdListPkgsCmd <> cmdUrlsCmd <> cmdPkgBuildCmd <> cmdConvertDbCmd <> cmdRemovePkgCmd)
-- {{{1 main
main = do
defAppDir <- getAppUserDataDirectory progName
execParser argParser >>= \ o -> do
let aD = if null (appDir o) then defAppDir else (appDir o)
let o' = o { appDir = aD }
createDirectoryIfMissing True (aD)
case (optsCmd o') of
CmdAdd {} -> runCommand o' add
CmdBuildPkgs {} -> runCommand o' buildPkgs
CmdBumpPkgs {} -> runCommand o' bumpPkgs
CmdSync {} -> runCommand o' sync
CmdVersions {} -> runCommand o' versions
CmdListPkgs {} -> runCommand o' listPkgs
CmdUpdates {} -> runCommand o' updates
CmdUrls {} -> runCommand o' urls
CmdPkgBuild {} -> runCommand o' pkgBuild
CmdConvertDb {} -> runCommand o' convertDb
CmdRemovePkg {} -> runCommand o' remove