{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
module Debian.Deb where
import Control.Monad
import Debian.Control.Common
import System.Directory (canonicalizePath, withCurrentDirectory)
import System.Exit (ExitCode(..))
import System.Process (readProcessWithExitCode)
import System.IO.Temp (withSystemTempDirectory)
fields :: (ControlFunctions a) => FilePath -> IO (Control' a)
fields :: forall a. ControlFunctions a => FilePath -> IO (Control' a)
fields FilePath
debFP =
FilePath -> (FilePath -> IO (Control' a)) -> IO (Control' a)
forall (m :: * -> *) a.
(MonadIO m, MonadMask m) =>
FilePath -> (FilePath -> m a) -> m a
withSystemTempDirectory (FilePath
"fields.XXXXXX") ((FilePath -> IO (Control' a)) -> IO (Control' a))
-> (FilePath -> IO (Control' a)) -> IO (Control' a)
forall a b. (a -> b) -> a -> b
$ \FilePath
tmpdir ->
do debFP <- FilePath -> IO FilePath
canonicalizePath FilePath
debFP
withCurrentDirectory tmpdir $
do (res, out, err) <- readProcessWithExitCode "ar" ["x",debFP,"control.tar.gz"] ""
when (res /= ExitSuccess) (error $ "Dpkg.fields: " ++ show out ++ "\n" ++ show err ++ "\n" ++ show res)
(res, out, err) <- readProcessWithExitCode "tar" ["xzf", "control.tar.gz", "./control"] ""
when (res /= ExitSuccess) (error $ "Dpkg.fields: " ++ show out ++ "\n" ++ show err ++ "\n" ++ show res)
c <- parseControlFromFile "control"
case c of
Left ParseError
e -> FilePath -> IO (Control' a)
forall a. HasCallStack => FilePath -> a
error (ParseError -> FilePath
forall a. Show a => a -> FilePath
show ParseError
e)
(Right Control' a
c) -> Control' a -> IO (Control' a)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Control' a
c