packages feed

debian-build-0.6.0.0: mains/odebuild.hs

import System.Environment (getProgName, getArgs)
import System.FilePath ((</>))
import Control.Monad (void, when)
import Data.List (stripPrefix)

import Debian.Package.Data (Source, Hackage, isBinaryPackage)
import Debian.Package.Build
  (BuildMode (Dep, Indep, Src), buildPackage, debi', pwd,
   defaultConfig, Build, runBuild, liftTrace, dpkgParseControl, modeListFromControl,
   removeBuildDir, findDebianChanges, genSources, removeGhcLibrary)


defualtModes :: [BuildMode]
defualtModes =  [Dep, Indep, Src]

remove' :: Hackage -> Build ()
remove' hkg = liftTrace $ sequence_ [removeGhcLibrary m hkg | m <- defualtModes]

install' :: Build ()
install' =  do
  ps <- findDebianChanges
  let cs = [c | (c, t) <- ps, isBinaryPackage t ]
  liftTrace $ do
    when (null cs) $ fail "No .changes files found!"
    mapM_ (\c -> debi' [c]) cs


help :: IO ()
help =  do
  prog <- getProgName
  let rev  = "[--revision=<debian revision>]"
      opts = "[debuild options]"
  putStr . unlines $ map unwords
    [[prog, "clean"],
     [prog, "source", rev],
     [prog, "build", rev, opts],
     [prog, "install", rev, opts],
     [prog, "reinstall", rev, opts],
     ["-- reinstall (Remove and install) support only for Haskell"],
     ["-- Revision string may use on auto-generating debian directory."]]

clean :: Build ()
clean =  removeBuildDir

source :: Maybe String -> Build ((FilePath, FilePath), Source, Maybe Hackage)
source mayRev = do
  clean
  maybe (fail "Illegal state: genSources") return =<< genSources mayRev

build :: Maybe String -> [String] -> Build (Source, Maybe Hackage)
build mayRev opts = do
  ((_, dir), src, mayH) <- source mayRev
  ctrl <- liftTrace . dpkgParseControl $ dir </> "debian" </> "control"
  liftTrace $ sequence_ [buildPackage dir m opts | m <- modeListFromControl ctrl]
  return (src, mayH)

install :: Maybe String -> [String] -> Build ()
install mayRev args = do
  void $ build mayRev args
  install'

reinstall :: Maybe String -> [String] -> Build ()
reinstall mayRev args = do
  (_src, mayH) <- build mayRev args
  maybe (return ()) remove' mayH
  install'

run :: Build a -> IO a
run b = do
  cur <- pwd
  uncurry (runBuild b cur) defaultConfig

parseArgs :: [String] -> (Maybe String, [String])
parseArgs =  d where
  d aas@(a:as) = case stripPrefix "--revision=" a of
    r@(Just _)  ->  (r, as)
    Nothing     ->  (Nothing, aas)
  d []         =    (Nothing, [])

main :: IO ()
main =  do
  as0 <- getArgs
  case as0 of
    "-h"     : _          ->  help
    "--help" : _          ->  help
    "help"   : _          ->  help
    as2@(c : as1)  ->  do
      let (mayRev, args) = parseArgs as1
      run $ case c of
        "clean"         ->    clean
        "source"        ->    void $ source mayRev
        "build"         ->    void $ build mayRev args
        "install"       ->    install mayRev args
        "reinstall"     ->    reinstall mayRev args
        _               ->    void . uncurry build $ parseArgs as2

    []                  -> run . void $ build Nothing []