-- | Convert a Debianization into a list of files that can then be
-- written out.
{-# LANGUAGE FlexibleContexts, FlexibleInstances, OverloadedStrings, ScopedTypeVariables, TupleSections #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Debian.Debianize.Files
    ( debianizationFileMap
    ) where


import Control.Lens
import Control.Monad.Fail (MonadFail)
import Control.Monad.Trans (lift)
import Control.Monad.Writer (execWriterT, tell, WriterT)
import Data.Char (isSpace)
import Data.List as List (dropWhile, dropWhileEnd, map)
import Data.Map as Map (fromListWithKey, insertWith, map, Map, mapKeys, toList)
import Data.Maybe (fromMaybe)
import Data.Monoid ((<>))
import Data.Set as Set (fold, member, toList)
import Data.Text as Text (dropWhile, dropWhileEnd, intercalate, lines, null, pack, strip, Text, unlines, unpack)
import Debian.Control (Control'(Control, unControl), Field'(Field), Paragraph'(Paragraph))
import Debian.Control.Common ()
import qualified Debian.Debianize.DebInfo as D (Atom(Install, InstallDir, Link), atomSet, changelog, compat, control, copyright, installInit, intermediateFiles, logrotateStanza, postInst, postRm, preInst, preRm, rulesFragments, rulesHead, rulesIncludes, rulesSettings, sourceFormat, watch)
import Debian.Debianize.Monad (DebianT)
import Debian.Debianize.Prelude (escapeDebianWildcards, showDeps')
import qualified Debian.Debianize.BinaryDebDescription as B (architecture, BinaryDebDescription, binaryPriority, multiArch, binarySection, breaks, builtUsing, conflicts, depends, description, essential, package, PackageRelations, preDepends, provides, recommends, relations, replaces, suggests)
import Debian.Debianize.CopyrightDescription (CopyrightDescription)
import qualified Debian.Debianize.SourceDebDescription as S (binaryPackages, buildConflicts, buildConflictsIndep, buildDepends, buildDependsIndep, dmUploadAllowed, homepage, maintainer, priority, section, source, SourceDebDescription, standardsVersion, uploaders, vcsFields, VersionControlSpec(VCSArch, VCSBrowser, VCSBzr, VCSCvs, VCSDarcs, VCSGit, VCSHg, VCSMtn, VCSSvn), xDescription, XField(XField), XFieldDest(B, C, S), xFields)
import Debian.Policy (maintainerOfLastResort)
import Debian.Pretty (PP(..), ppShow, prettyText, ppText, ppPrint)
import Debian.Relation (BinPkgName(BinPkgName), Relations)
import Distribution.PackageDescription (PackageDescription)
import Prelude hiding (dropWhile, init, log, unlines, writeFile)
import System.FilePath ((</>))
import Text.PrettyPrint.HughesPJClass (empty, text)
import Distribution.Pretty (Pretty(pretty))

type FilesT m = WriterT [(FilePath, Text)] (DebianT m)

instance Pretty (PP Bool) where
    pretty :: PP Bool -> Doc
pretty = String -> Doc
text (String -> Doc) -> (PP Bool -> String) -> PP Bool -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String
forall a. Show a => a -> String
show (Bool -> String) -> (PP Bool -> Bool) -> PP Bool -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PP Bool -> Bool
forall a. PP a -> a
unPP

-- | Turn the Debianization into a list of files, making sure the text
-- associated with each path is unique.  Assumes that
-- finalizeDebianization has already been called.  (Yes, I'm
-- considering building one into the other, but it is handy to look at
-- the Debianization produced by finalizeDebianization in the unit
-- tests.)

debianizationFileMap :: (MonadFail m) => DebianT m (Map FilePath Text)
debianizationFileMap :: DebianT m (Map String Text)
debianizationFileMap =
    ([(String, Text)] -> Map String Text)
-> DebianT m [(String, Text)] -> DebianT m (Map String Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((String -> Text -> Text -> Text)
-> [(String, Text)] -> Map String Text
forall k a. Ord k => (k -> a -> a -> a) -> [(k, a)] -> Map k a
Map.fromListWithKey (\ String
k Text
a Text
b -> String -> Text
forall a. HasCallStack => String -> a
error (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ String
"Multiple values for " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
k String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
":\n  " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
forall a. Show a => a -> String
show Text
a String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
forall a. Show a => a -> String
show Text
b)) (DebianT m [(String, Text)] -> DebianT m (Map String Text))
-> DebianT m [(String, Text)] -> DebianT m (Map String Text)
forall a b. (a -> b) -> a -> b
$ WriterT [(String, Text)] (DebianT m) ()
-> DebianT m [(String, Text)]
forall (m :: * -> *) w a. Monad m => WriterT w m a -> m w
execWriterT (WriterT [(String, Text)] (DebianT m) ()
 -> DebianT m [(String, Text)])
-> WriterT [(String, Text)] (DebianT m) ()
-> DebianT m [(String, Text)]
forall a b. (a -> b) -> a -> b
$
    do -- here <- liftIO getCurrentDirectory
       [(String, Text)] -> WriterT [(String, Text)] (DebianT m) ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([(String, Text)] -> WriterT [(String, Text)] (DebianT m) ())
-> WriterT [(String, Text)] (DebianT m) [(String, Text)]
-> WriterT [(String, Text)] (DebianT m) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< WriterT [(String, Text)] (DebianT m) [(String, Text)]
forall (m :: * -> *). Monad m => FilesT m [(String, Text)]
control
       [(String, Text)] -> WriterT [(String, Text)] (DebianT m) ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([(String, Text)] -> WriterT [(String, Text)] (DebianT m) ())
-> WriterT [(String, Text)] (DebianT m) [(String, Text)]
-> WriterT [(String, Text)] (DebianT m) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< WriterT [(String, Text)] (DebianT m) [(String, Text)]
forall (m :: * -> *). Monad m => FilesT m [(String, Text)]
changelog
       [(String, Text)] -> WriterT [(String, Text)] (DebianT m) ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([(String, Text)] -> WriterT [(String, Text)] (DebianT m) ())
-> WriterT [(String, Text)] (DebianT m) [(String, Text)]
-> WriterT [(String, Text)] (DebianT m) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< WriterT [(String, Text)] (DebianT m) [(String, Text)]
forall (m :: * -> *). MonadFail m => FilesT m [(String, Text)]
rules
       [(String, Text)] -> WriterT [(String, Text)] (DebianT m) ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([(String, Text)] -> WriterT [(String, Text)] (DebianT m) ())
-> WriterT [(String, Text)] (DebianT m) [(String, Text)]
-> WriterT [(String, Text)] (DebianT m) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< WriterT [(String, Text)] (DebianT m) [(String, Text)]
forall (m :: * -> *). Monad m => FilesT m [(String, Text)]
compat
       [(String, Text)] -> WriterT [(String, Text)] (DebianT m) ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([(String, Text)] -> WriterT [(String, Text)] (DebianT m) ())
-> WriterT [(String, Text)] (DebianT m) [(String, Text)]
-> WriterT [(String, Text)] (DebianT m) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< WriterT [(String, Text)] (DebianT m) [(String, Text)]
forall (m :: * -> *). Monad m => FilesT m [(String, Text)]
copyright
       [(String, Text)] -> WriterT [(String, Text)] (DebianT m) ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([(String, Text)] -> WriterT [(String, Text)] (DebianT m) ())
-> WriterT [(String, Text)] (DebianT m) [(String, Text)]
-> WriterT [(String, Text)] (DebianT m) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< WriterT [(String, Text)] (DebianT m) [(String, Text)]
forall (m :: * -> *). Monad m => FilesT m [(String, Text)]
sourceFormatFiles
       [(String, Text)] -> WriterT [(String, Text)] (DebianT m) ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([(String, Text)] -> WriterT [(String, Text)] (DebianT m) ())
-> WriterT [(String, Text)] (DebianT m) [(String, Text)]
-> WriterT [(String, Text)] (DebianT m) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< WriterT [(String, Text)] (DebianT m) [(String, Text)]
forall (m :: * -> *). Monad m => FilesT m [(String, Text)]
watchFile
       [(String, Text)] -> WriterT [(String, Text)] (DebianT m) ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([(String, Text)] -> WriterT [(String, Text)] (DebianT m) ())
-> WriterT [(String, Text)] (DebianT m) [(String, Text)]
-> WriterT [(String, Text)] (DebianT m) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< WriterT [(String, Text)] (DebianT m) [(String, Text)]
forall (m :: * -> *). Monad m => FilesT m [(String, Text)]
installs
       [(String, Text)] -> WriterT [(String, Text)] (DebianT m) ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([(String, Text)] -> WriterT [(String, Text)] (DebianT m) ())
-> WriterT [(String, Text)] (DebianT m) [(String, Text)]
-> WriterT [(String, Text)] (DebianT m) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< WriterT [(String, Text)] (DebianT m) [(String, Text)]
forall (m :: * -> *). Monad m => FilesT m [(String, Text)]
dirs
       [(String, Text)] -> WriterT [(String, Text)] (DebianT m) ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([(String, Text)] -> WriterT [(String, Text)] (DebianT m) ())
-> WriterT [(String, Text)] (DebianT m) [(String, Text)]
-> WriterT [(String, Text)] (DebianT m) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< WriterT [(String, Text)] (DebianT m) [(String, Text)]
forall (m :: * -> *). Monad m => FilesT m [(String, Text)]
init
       [(String, Text)] -> WriterT [(String, Text)] (DebianT m) ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([(String, Text)] -> WriterT [(String, Text)] (DebianT m) ())
-> WriterT [(String, Text)] (DebianT m) [(String, Text)]
-> WriterT [(String, Text)] (DebianT m) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< WriterT [(String, Text)] (DebianT m) [(String, Text)]
forall (m :: * -> *). Monad m => FilesT m [(String, Text)]
logrotate
       [(String, Text)] -> WriterT [(String, Text)] (DebianT m) ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([(String, Text)] -> WriterT [(String, Text)] (DebianT m) ())
-> WriterT [(String, Text)] (DebianT m) [(String, Text)]
-> WriterT [(String, Text)] (DebianT m) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< WriterT [(String, Text)] (DebianT m) [(String, Text)]
forall (m :: * -> *). Monad m => FilesT m [(String, Text)]
links
       [(String, Text)] -> WriterT [(String, Text)] (DebianT m) ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([(String, Text)] -> WriterT [(String, Text)] (DebianT m) ())
-> WriterT [(String, Text)] (DebianT m) [(String, Text)]
-> WriterT [(String, Text)] (DebianT m) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< WriterT [(String, Text)] (DebianT m) [(String, Text)]
forall (m :: * -> *). Monad m => FilesT m [(String, Text)]
postinstFiles
       [(String, Text)] -> WriterT [(String, Text)] (DebianT m) ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([(String, Text)] -> WriterT [(String, Text)] (DebianT m) ())
-> WriterT [(String, Text)] (DebianT m) [(String, Text)]
-> WriterT [(String, Text)] (DebianT m) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< WriterT [(String, Text)] (DebianT m) [(String, Text)]
forall (m :: * -> *). Monad m => FilesT m [(String, Text)]
postrmFiles
       [(String, Text)] -> WriterT [(String, Text)] (DebianT m) ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([(String, Text)] -> WriterT [(String, Text)] (DebianT m) ())
-> WriterT [(String, Text)] (DebianT m) [(String, Text)]
-> WriterT [(String, Text)] (DebianT m) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< WriterT [(String, Text)] (DebianT m) [(String, Text)]
forall (m :: * -> *). Monad m => FilesT m [(String, Text)]
preinstFiles
       [(String, Text)] -> WriterT [(String, Text)] (DebianT m) ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([(String, Text)] -> WriterT [(String, Text)] (DebianT m) ())
-> WriterT [(String, Text)] (DebianT m) [(String, Text)]
-> WriterT [(String, Text)] (DebianT m) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< WriterT [(String, Text)] (DebianT m) [(String, Text)]
forall (m :: * -> *). Monad m => FilesT m [(String, Text)]
prermFiles
       [(String, Text)] -> WriterT [(String, Text)] (DebianT m) ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([(String, Text)] -> WriterT [(String, Text)] (DebianT m) ())
-> WriterT [(String, Text)] (DebianT m) [(String, Text)]
-> WriterT [(String, Text)] (DebianT m) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< WriterT [(String, Text)] (DebianT m) [(String, Text)]
forall (m :: * -> *). Monad m => FilesT m [(String, Text)]
intermediates

sourceFormatFiles :: (Monad m) => FilesT m [(FilePath, Text)]
sourceFormatFiles :: FilesT m [(String, Text)]
sourceFormatFiles = do
    SourceFormat
fmt <- DebianT m SourceFormat
-> WriterT [(String, Text)] (DebianT m) SourceFormat
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DebianT m SourceFormat
 -> WriterT [(String, Text)] (DebianT m) SourceFormat)
-> DebianT m SourceFormat
-> WriterT [(String, Text)] (DebianT m) SourceFormat
forall a b. (a -> b) -> a -> b
$ Getting SourceFormat DebInfo SourceFormat -> DebianT m SourceFormat
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting SourceFormat DebInfo SourceFormat
Lens' DebInfo SourceFormat
D.sourceFormat
    [(String, Text)] -> FilesT m [(String, Text)]
forall (m :: * -> *) a. Monad m => a -> m a
return ([(String, Text)] -> FilesT m [(String, Text)])
-> [(String, Text)] -> FilesT m [(String, Text)]
forall a b. (a -> b) -> a -> b
$ [(String
"debian/source/format", String -> Text
pack (String -> Text)
-> (SourceFormat -> String) -> SourceFormat -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SourceFormat -> String
forall a. Pretty (PP a) => a -> String
ppShow (SourceFormat -> Text) -> SourceFormat -> Text
forall a b. (a -> b) -> a -> b
$ SourceFormat
fmt)]

watchFile :: (Monad m) => FilesT m [(FilePath, Text)]
watchFile :: FilesT m [(String, Text)]
watchFile = [(String, Text)]
-> (Text -> [(String, Text)]) -> Maybe Text -> [(String, Text)]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (\ Text
x -> [(String
"debian/watch", Text
x)]) (Maybe Text -> [(String, Text)])
-> WriterT [(String, Text)] (DebianT m) (Maybe Text)
-> FilesT m [(String, Text)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (DebianT m (Maybe Text)
-> WriterT [(String, Text)] (DebianT m) (Maybe Text)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DebianT m (Maybe Text)
 -> WriterT [(String, Text)] (DebianT m) (Maybe Text))
-> DebianT m (Maybe Text)
-> WriterT [(String, Text)] (DebianT m) (Maybe Text)
forall a b. (a -> b) -> a -> b
$ Getting (Maybe Text) DebInfo (Maybe Text) -> DebianT m (Maybe Text)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (Maybe Text) DebInfo (Maybe Text)
Lens' DebInfo (Maybe Text)
D.watch)

intermediates :: (Monad m) => FilesT m [(FilePath, Text)]
intermediates :: FilesT m [(String, Text)]
intermediates = Set (String, Text) -> [(String, Text)]
forall a. Set a -> [a]
Set.toList (Set (String, Text) -> [(String, Text)])
-> WriterT [(String, Text)] (DebianT m) (Set (String, Text))
-> FilesT m [(String, Text)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (DebianT m (Set (String, Text))
-> WriterT [(String, Text)] (DebianT m) (Set (String, Text))
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DebianT m (Set (String, Text))
 -> WriterT [(String, Text)] (DebianT m) (Set (String, Text)))
-> DebianT m (Set (String, Text))
-> WriterT [(String, Text)] (DebianT m) (Set (String, Text))
forall a b. (a -> b) -> a -> b
$ Getting (Set (String, Text)) DebInfo (Set (String, Text))
-> DebianT m (Set (String, Text))
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (Set (String, Text)) DebInfo (Set (String, Text))
Lens' DebInfo (Set (String, Text))
D.intermediateFiles)

installs :: (Monad m) => FilesT m [(FilePath, Text)]
installs :: FilesT m [(String, Text)]
installs =
    (Map String Text -> [(String, Text)]
forall k a. Map k a -> [(k, a)]
Map.toList (Map String Text -> [(String, Text)])
-> (Set Atom -> Map String Text) -> Set Atom -> [(String, Text)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Text] -> Text) -> Map String [Text] -> Map String Text
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map [Text] -> Text
unlines (Map String [Text] -> Map String Text)
-> (Set Atom -> Map String [Text]) -> Set Atom -> Map String Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Atom -> Map String [Text] -> Map String [Text])
-> Map String [Text] -> Set Atom -> Map String [Text]
forall a b. (a -> b -> b) -> b -> Set a -> b
Set.fold Atom -> Map String [Text] -> Map String [Text]
doAtom Map String [Text]
forall a. Monoid a => a
mempty) (Set Atom -> [(String, Text)])
-> WriterT [(String, Text)] (DebianT m) (Set Atom)
-> FilesT m [(String, Text)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (DebianT m (Set Atom)
-> WriterT [(String, Text)] (DebianT m) (Set Atom)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DebianT m (Set Atom)
 -> WriterT [(String, Text)] (DebianT m) (Set Atom))
-> DebianT m (Set Atom)
-> WriterT [(String, Text)] (DebianT m) (Set Atom)
forall a b. (a -> b) -> a -> b
$ Getting (Set Atom) DebInfo (Set Atom) -> DebianT m (Set Atom)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (Getting (Set Atom) DebInfo (Set Atom)
Lens' DebInfo (Set Atom)
D.atomSet))
    where
      doAtom :: Atom -> Map String [Text] -> Map String [Text]
doAtom (D.Install BinPkgName
b String
frm String
dst) Map String [Text]
mp = ([Text] -> [Text] -> [Text])
-> String -> [Text] -> Map String [Text] -> Map String [Text]
forall k a. Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a
Map.insertWith [Text] -> [Text] -> [Text]
forall a. [a] -> [a] -> [a]
(++) (BinPkgName -> String
forall a. Pretty (PP a) => a -> String
pathf BinPkgName
b) [String -> Text
pack (String -> String
escapeDebianWildcards String
frm String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
dst)] Map String [Text]
mp
      doAtom Atom
_ Map String [Text]
mp = Map String [Text]
mp
      pathf :: a -> String
pathf a
name = String
"debian" String -> String -> String
</> Doc -> String
forall a. Show a => a -> String
show (a -> Doc
forall a. Pretty (PP a) => a -> Doc
ppPrint a
name) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
".install"

dirs :: (Monad m) => FilesT m [(FilePath, Text)]
dirs :: FilesT m [(String, Text)]
dirs =
    (Map String Text -> [(String, Text)]
forall k a. Map k a -> [(k, a)]
Map.toList (Map String Text -> [(String, Text)])
-> (Set Atom -> Map String Text) -> Set Atom -> [(String, Text)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Text] -> Text) -> Map String [Text] -> Map String Text
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map [Text] -> Text
unlines (Map String [Text] -> Map String Text)
-> (Set Atom -> Map String [Text]) -> Set Atom -> Map String Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Atom -> Map String [Text] -> Map String [Text])
-> Map String [Text] -> Set Atom -> Map String [Text]
forall a b. (a -> b -> b) -> b -> Set a -> b
Set.fold Atom -> Map String [Text] -> Map String [Text]
doAtom Map String [Text]
forall a. Monoid a => a
mempty) (Set Atom -> [(String, Text)])
-> WriterT [(String, Text)] (DebianT m) (Set Atom)
-> FilesT m [(String, Text)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (DebianT m (Set Atom)
-> WriterT [(String, Text)] (DebianT m) (Set Atom)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DebianT m (Set Atom)
 -> WriterT [(String, Text)] (DebianT m) (Set Atom))
-> DebianT m (Set Atom)
-> WriterT [(String, Text)] (DebianT m) (Set Atom)
forall a b. (a -> b) -> a -> b
$ Getting (Set Atom) DebInfo (Set Atom) -> DebianT m (Set Atom)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (Set Atom) DebInfo (Set Atom)
Lens' DebInfo (Set Atom)
D.atomSet)
    where
      doAtom :: Atom -> Map String [Text] -> Map String [Text]
doAtom (D.InstallDir BinPkgName
b String
dir) Map String [Text]
mp = ([Text] -> [Text] -> [Text])
-> String -> [Text] -> Map String [Text] -> Map String [Text]
forall k a. Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a
Map.insertWith [Text] -> [Text] -> [Text]
forall a. [a] -> [a] -> [a]
(++) (BinPkgName -> String
forall a. Pretty (PP a) => a -> String
pathf BinPkgName
b) [String -> Text
pack String
dir] Map String [Text]
mp
      doAtom Atom
_ Map String [Text]
mp = Map String [Text]
mp
      pathf :: a -> String
pathf a
name = String
"debian" String -> String -> String
</> Doc -> String
forall a. Show a => a -> String
show (a -> Doc
forall a. Pretty (PP a) => a -> Doc
ppPrint a
name) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
".dirs"

init :: (Monad m) => FilesT m [(FilePath, Text)]
init :: FilesT m [(String, Text)]
init =
    (Map String Text -> [(String, Text)]
forall k a. Map k a -> [(k, a)]
Map.toList (Map String Text -> [(String, Text)])
-> (Map BinPkgName Text -> Map String Text)
-> Map BinPkgName Text
-> [(String, Text)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (BinPkgName -> String) -> Map BinPkgName Text -> Map String Text
forall k2 k1 a. Ord k2 => (k1 -> k2) -> Map k1 a -> Map k2 a
mapKeys BinPkgName -> String
forall a. Pretty (PP a) => a -> String
pathf) (Map BinPkgName Text -> [(String, Text)])
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text)
-> FilesT m [(String, Text)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (DebianT m (Map BinPkgName Text)
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DebianT m (Map BinPkgName Text)
 -> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text))
-> DebianT m (Map BinPkgName Text)
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text)
forall a b. (a -> b) -> a -> b
$ Getting (Map BinPkgName Text) DebInfo (Map BinPkgName Text)
-> DebianT m (Map BinPkgName Text)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (Map BinPkgName Text) DebInfo (Map BinPkgName Text)
Lens' DebInfo (Map BinPkgName Text)
D.installInit)
    where
      pathf :: a -> String
pathf a
name = String
"debian" String -> String -> String
</> Doc -> String
forall a. Show a => a -> String
show (a -> Doc
forall a. Pretty (PP a) => a -> Doc
ppPrint a
name) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
".init"

-- FIXME - use a map and insertWith, check for multiple entries
logrotate :: (Monad m) => FilesT m [(FilePath, Text)]
logrotate :: FilesT m [(String, Text)]
logrotate =
    (Map String Text -> [(String, Text)]
forall k a. Map k a -> [(k, a)]
Map.toList (Map String Text -> [(String, Text)])
-> (Map BinPkgName (Set Text) -> Map String Text)
-> Map BinPkgName (Set Text)
-> [(String, Text)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Set Text -> Text) -> Map String (Set Text) -> Map String Text
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map (\ Set Text
stanzas -> [Text] -> Text
Text.unlines (Set Text -> [Text]
forall a. Set a -> [a]
Set.toList Set Text
stanzas)) (Map String (Set Text) -> Map String Text)
-> (Map BinPkgName (Set Text) -> Map String (Set Text))
-> Map BinPkgName (Set Text)
-> Map String Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (BinPkgName -> String)
-> Map BinPkgName (Set Text) -> Map String (Set Text)
forall k2 k1 a. Ord k2 => (k1 -> k2) -> Map k1 a -> Map k2 a
mapKeys BinPkgName -> String
forall a. Pretty (PP a) => a -> String
pathf) (Map BinPkgName (Set Text) -> [(String, Text)])
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName (Set Text))
-> FilesT m [(String, Text)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (DebianT m (Map BinPkgName (Set Text))
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName (Set Text))
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DebianT m (Map BinPkgName (Set Text))
 -> WriterT
      [(String, Text)] (DebianT m) (Map BinPkgName (Set Text)))
-> DebianT m (Map BinPkgName (Set Text))
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName (Set Text))
forall a b. (a -> b) -> a -> b
$ Getting
  (Map BinPkgName (Set Text)) DebInfo (Map BinPkgName (Set Text))
-> DebianT m (Map BinPkgName (Set Text))
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting
  (Map BinPkgName (Set Text)) DebInfo (Map BinPkgName (Set Text))
Lens' DebInfo (Map BinPkgName (Set Text))
D.logrotateStanza)
    where
      pathf :: a -> String
pathf a
name = String
"debian" String -> String -> String
</> Doc -> String
forall a. Show a => a -> String
show (a -> Doc
forall a. Pretty (PP a) => a -> Doc
ppPrint a
name) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
".logrotate"

-- | Assemble all the links by package and output one file each
links :: (Monad m) => FilesT m [(FilePath, Text)]
links :: FilesT m [(String, Text)]
links =
    (Map String Text -> [(String, Text)]
forall k a. Map k a -> [(k, a)]
Map.toList (Map String Text -> [(String, Text)])
-> (Set Atom -> Map String Text) -> Set Atom -> [(String, Text)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Text] -> Text) -> Map String [Text] -> Map String Text
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map [Text] -> Text
unlines (Map String [Text] -> Map String Text)
-> (Set Atom -> Map String [Text]) -> Set Atom -> Map String Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Atom -> Map String [Text] -> Map String [Text])
-> Map String [Text] -> Set Atom -> Map String [Text]
forall a b. (a -> b -> b) -> b -> Set a -> b
Set.fold Atom -> Map String [Text] -> Map String [Text]
doAtom Map String [Text]
forall a. Monoid a => a
mempty) (Set Atom -> [(String, Text)])
-> WriterT [(String, Text)] (DebianT m) (Set Atom)
-> FilesT m [(String, Text)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (DebianT m (Set Atom)
-> WriterT [(String, Text)] (DebianT m) (Set Atom)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DebianT m (Set Atom)
 -> WriterT [(String, Text)] (DebianT m) (Set Atom))
-> DebianT m (Set Atom)
-> WriterT [(String, Text)] (DebianT m) (Set Atom)
forall a b. (a -> b) -> a -> b
$ Getting (Set Atom) DebInfo (Set Atom) -> DebianT m (Set Atom)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (Set Atom) DebInfo (Set Atom)
Lens' DebInfo (Set Atom)
D.atomSet)
    where
      doAtom :: Atom -> Map String [Text] -> Map String [Text]
doAtom (D.Link BinPkgName
b String
loc String
t) Map String [Text]
mp = ([Text] -> [Text] -> [Text])
-> String -> [Text] -> Map String [Text] -> Map String [Text]
forall k a. Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a
Map.insertWith [Text] -> [Text] -> [Text]
forall a. [a] -> [a] -> [a]
(++) (BinPkgName -> String
forall a. Pretty (PP a) => a -> String
pathf BinPkgName
b) [String -> Text
pack String
loc Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
pack String
t] Map String [Text]
mp
      doAtom Atom
_ Map String [Text]
mp = Map String [Text]
mp
      pathf :: a -> String
pathf a
name = String
"debian" String -> String -> String
</> Doc -> String
forall a. Show a => a -> String
show (a -> Doc
forall a. Pretty (PP a) => a -> Doc
ppPrint a
name) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
".links"

postinstFiles :: (Monad m) => FilesT m [(FilePath, Text)]
postinstFiles :: FilesT m [(String, Text)]
postinstFiles =
     (Map String Text -> [(String, Text)]
forall k a. Map k a -> [(k, a)]
Map.toList (Map String Text -> [(String, Text)])
-> (Map BinPkgName Text -> Map String Text)
-> Map BinPkgName Text
-> [(String, Text)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (BinPkgName -> String) -> Map BinPkgName Text -> Map String Text
forall k2 k1 a. Ord k2 => (k1 -> k2) -> Map k1 a -> Map k2 a
mapKeys BinPkgName -> String
pathf) (Map BinPkgName Text -> [(String, Text)])
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text)
-> FilesT m [(String, Text)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (DebianT m (Map BinPkgName Text)
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DebianT m (Map BinPkgName Text)
 -> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text))
-> DebianT m (Map BinPkgName Text)
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text)
forall a b. (a -> b) -> a -> b
$ Getting (Map BinPkgName Text) DebInfo (Map BinPkgName Text)
-> DebianT m (Map BinPkgName Text)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (Map BinPkgName Text) DebInfo (Map BinPkgName Text)
Lens' DebInfo (Map BinPkgName Text)
D.postInst)
    where
      pathf :: BinPkgName -> String
pathf (BinPkgName String
name) = String
"debian" String -> String -> String
</> String
name String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
".postinst"

postrmFiles :: (Monad m) => FilesT m [(FilePath, Text)]
postrmFiles :: FilesT m [(String, Text)]
postrmFiles =
    (Map String Text -> [(String, Text)]
forall k a. Map k a -> [(k, a)]
Map.toList (Map String Text -> [(String, Text)])
-> (Map BinPkgName Text -> Map String Text)
-> Map BinPkgName Text
-> [(String, Text)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (BinPkgName -> String) -> Map BinPkgName Text -> Map String Text
forall k2 k1 a. Ord k2 => (k1 -> k2) -> Map k1 a -> Map k2 a
mapKeys BinPkgName -> String
forall a. Pretty (PP a) => a -> String
pathf) (Map BinPkgName Text -> [(String, Text)])
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text)
-> FilesT m [(String, Text)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (DebianT m (Map BinPkgName Text)
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DebianT m (Map BinPkgName Text)
 -> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text))
-> DebianT m (Map BinPkgName Text)
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text)
forall a b. (a -> b) -> a -> b
$ Getting (Map BinPkgName Text) DebInfo (Map BinPkgName Text)
-> DebianT m (Map BinPkgName Text)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (Map BinPkgName Text) DebInfo (Map BinPkgName Text)
Lens' DebInfo (Map BinPkgName Text)
D.postRm)
    where
      pathf :: a -> String
pathf a
name = String
"debian" String -> String -> String
</> Doc -> String
forall a. Show a => a -> String
show (a -> Doc
forall a. Pretty (PP a) => a -> Doc
ppPrint a
name) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
".postrm"

preinstFiles :: (Monad m) => FilesT m [(FilePath, Text)]
preinstFiles :: FilesT m [(String, Text)]
preinstFiles =
    (Map String Text -> [(String, Text)]
forall k a. Map k a -> [(k, a)]
Map.toList (Map String Text -> [(String, Text)])
-> (Map BinPkgName Text -> Map String Text)
-> Map BinPkgName Text
-> [(String, Text)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (BinPkgName -> String) -> Map BinPkgName Text -> Map String Text
forall k2 k1 a. Ord k2 => (k1 -> k2) -> Map k1 a -> Map k2 a
mapKeys BinPkgName -> String
forall a. Pretty (PP a) => a -> String
pathf) (Map BinPkgName Text -> [(String, Text)])
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text)
-> FilesT m [(String, Text)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (DebianT m (Map BinPkgName Text)
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DebianT m (Map BinPkgName Text)
 -> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text))
-> DebianT m (Map BinPkgName Text)
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text)
forall a b. (a -> b) -> a -> b
$ Getting (Map BinPkgName Text) DebInfo (Map BinPkgName Text)
-> DebianT m (Map BinPkgName Text)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (Map BinPkgName Text) DebInfo (Map BinPkgName Text)
Lens' DebInfo (Map BinPkgName Text)
D.preInst)
    where
      pathf :: a -> String
pathf a
name = String
"debian" String -> String -> String
</> Doc -> String
forall a. Show a => a -> String
show (a -> Doc
forall a. Pretty (PP a) => a -> Doc
ppPrint a
name) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
".preinst"

prermFiles :: (Monad m) => FilesT m [(FilePath, Text)]
prermFiles :: FilesT m [(String, Text)]
prermFiles =
    (Map String Text -> [(String, Text)]
forall k a. Map k a -> [(k, a)]
Map.toList (Map String Text -> [(String, Text)])
-> (Map BinPkgName Text -> Map String Text)
-> Map BinPkgName Text
-> [(String, Text)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (BinPkgName -> String) -> Map BinPkgName Text -> Map String Text
forall k2 k1 a. Ord k2 => (k1 -> k2) -> Map k1 a -> Map k2 a
mapKeys BinPkgName -> String
forall a. Pretty (PP a) => a -> String
pathf) (Map BinPkgName Text -> [(String, Text)])
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text)
-> FilesT m [(String, Text)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (DebianT m (Map BinPkgName Text)
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DebianT m (Map BinPkgName Text)
 -> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text))
-> DebianT m (Map BinPkgName Text)
-> WriterT [(String, Text)] (DebianT m) (Map BinPkgName Text)
forall a b. (a -> b) -> a -> b
$ Getting (Map BinPkgName Text) DebInfo (Map BinPkgName Text)
-> DebianT m (Map BinPkgName Text)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (Map BinPkgName Text) DebInfo (Map BinPkgName Text)
Lens' DebInfo (Map BinPkgName Text)
D.preRm)
    where
      pathf :: a -> String
pathf a
name = String
"debian" String -> String -> String
</> Doc -> String
forall a. Show a => a -> String
show (a -> Doc
forall a. Pretty (PP a) => a -> Doc
ppPrint a
name) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
".prerm"

rules :: (MonadFail m) => FilesT m [(FilePath, Text)]
rules :: FilesT m [(String, Text)]
rules =
    do Just Text
rh <- DebianT m (Maybe Text)
-> WriterT [(String, Text)] (DebianT m) (Maybe Text)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (Getting (Maybe Text) DebInfo (Maybe Text) -> DebianT m (Maybe Text)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (Getting (Maybe Text) DebInfo (Maybe Text)
Lens' DebInfo (Maybe Text)
D.rulesHead))
       Text
rassignments <- DebianT m [Text] -> WriterT [(String, Text)] (DebianT m) [Text]
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (Getting [Text] DebInfo [Text] -> DebianT m [Text]
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (Getting [Text] DebInfo [Text]
Lens' DebInfo [Text]
D.rulesSettings)) WriterT [(String, Text)] (DebianT m) [Text]
-> ([Text] -> WriterT [(String, Text)] (DebianT m) Text)
-> WriterT [(String, Text)] (DebianT m) Text
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Text -> WriterT [(String, Text)] (DebianT m) Text
forall (m :: * -> *) a. Monad m => a -> m a
return (Text -> WriterT [(String, Text)] (DebianT m) Text)
-> ([Text] -> Text)
-> [Text]
-> WriterT [(String, Text)] (DebianT m) Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text] -> Text
intercalate Text
"\n"
       Text
rincludes <- DebianT m [Text] -> WriterT [(String, Text)] (DebianT m) [Text]
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (Getting [Text] DebInfo [Text] -> DebianT m [Text]
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (Getting [Text] DebInfo [Text]
Lens' DebInfo [Text]
D.rulesIncludes)) WriterT [(String, Text)] (DebianT m) [Text]
-> ([Text] -> WriterT [(String, Text)] (DebianT m) Text)
-> WriterT [(String, Text)] (DebianT m) Text
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Text -> WriterT [(String, Text)] (DebianT m) Text
forall (m :: * -> *) a. Monad m => a -> m a
return (Text -> WriterT [(String, Text)] (DebianT m) Text)
-> ([Text] -> Text)
-> [Text]
-> WriterT [(String, Text)] (DebianT m) Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text] -> Text
intercalate Text
"\n"
       [Text]
rl <- ([Text] -> [Text]
forall a. [a] -> [a]
reverse ([Text] -> [Text]) -> (Set Text -> [Text]) -> Set Text -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Set Text -> [Text]
forall a. Set a -> [a]
Set.toList) (Set Text -> [Text])
-> WriterT [(String, Text)] (DebianT m) (Set Text)
-> WriterT [(String, Text)] (DebianT m) [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> DebianT m (Set Text)
-> WriterT [(String, Text)] (DebianT m) (Set Text)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (Getting (Set Text) DebInfo (Set Text) -> DebianT m (Set Text)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (Getting (Set Text) DebInfo (Set Text)
Lens' DebInfo (Set Text)
D.rulesFragments))
       [(String, Text)] -> FilesT m [(String, Text)]
forall (m :: * -> *) a. Monad m => a -> m a
return [(String
"debian/rules", Text -> [Text] -> Text
intercalate Text
"\n\n" ((Text -> Bool) -> [Text] -> [Text]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (Text -> Bool) -> Text -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Bool
Text.null) ((Text -> Text) -> [Text] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
List.map Text -> Text
strip (Text
rh Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: Text
rassignments Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: Text
rincludes Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: [Text]
rl))) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"\n")]

changelog :: (Monad m) => FilesT m [(FilePath, Text)]
changelog :: FilesT m [(String, Text)]
changelog =
    do Maybe ChangeLog
log <- DebianT m (Maybe ChangeLog)
-> WriterT [(String, Text)] (DebianT m) (Maybe ChangeLog)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DebianT m (Maybe ChangeLog)
 -> WriterT [(String, Text)] (DebianT m) (Maybe ChangeLog))
-> DebianT m (Maybe ChangeLog)
-> WriterT [(String, Text)] (DebianT m) (Maybe ChangeLog)
forall a b. (a -> b) -> a -> b
$ Getting (Maybe ChangeLog) DebInfo (Maybe ChangeLog)
-> DebianT m (Maybe ChangeLog)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (Maybe ChangeLog) DebInfo (Maybe ChangeLog)
Lens' DebInfo (Maybe ChangeLog)
D.changelog
       [(String, Text)] -> FilesT m [(String, Text)]
forall (m :: * -> *) a. Monad m => a -> m a
return [(String
"debian/changelog", String -> Text
pack (Doc -> String
forall a. Show a => a -> String
show (ChangeLog -> Doc
forall a. Pretty (PP a) => a -> Doc
ppPrint (ChangeLog -> Maybe ChangeLog -> ChangeLog
forall a. a -> Maybe a -> a
fromMaybe (String -> ChangeLog
forall a. HasCallStack => String -> a
error String
"No changelog in debianization") Maybe ChangeLog
log))))]

control :: (Monad m) => FilesT m [(FilePath, Text)]
control :: FilesT m [(String, Text)]
control =
    do SourceDebDescription
d <- DebianT m SourceDebDescription
-> WriterT [(String, Text)] (DebianT m) SourceDebDescription
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DebianT m SourceDebDescription
 -> WriterT [(String, Text)] (DebianT m) SourceDebDescription)
-> DebianT m SourceDebDescription
-> WriterT [(String, Text)] (DebianT m) SourceDebDescription
forall a b. (a -> b) -> a -> b
$ Getting SourceDebDescription DebInfo SourceDebDescription
-> DebianT m SourceDebDescription
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting SourceDebDescription DebInfo SourceDebDescription
Lens' DebInfo SourceDebDescription
D.control
       [(String, Text)] -> FilesT m [(String, Text)]
forall (m :: * -> *) a. Monad m => a -> m a
return [(String
"debian/control", Control' String -> Text
forall a. Pretty a => a -> Text
prettyText (SourceDebDescription -> Control' String
controlFile SourceDebDescription
d))]

compat :: (Monad m) => FilesT m [(FilePath, Text)]
compat :: FilesT m [(String, Text)]
compat =
    do Maybe Int
t <- DebianT m (Maybe Int)
-> WriterT [(String, Text)] (DebianT m) (Maybe Int)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DebianT m (Maybe Int)
 -> WriterT [(String, Text)] (DebianT m) (Maybe Int))
-> DebianT m (Maybe Int)
-> WriterT [(String, Text)] (DebianT m) (Maybe Int)
forall a b. (a -> b) -> a -> b
$ Getting (Maybe Int) DebInfo (Maybe Int) -> DebianT m (Maybe Int)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (Maybe Int) DebInfo (Maybe Int)
Lens' DebInfo (Maybe Int)
D.compat
       [(String, Text)] -> FilesT m [(String, Text)]
forall (m :: * -> *) a. Monad m => a -> m a
return [(String
"debian/compat", String -> Text
pack (Int -> String
forall a. Show a => a -> String
show (Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe (String -> Int
forall a. HasCallStack => String -> a
error String
"Missing DebCompat atom - is debhelper installed?") (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ Maybe Int
t) String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"\n"))]

copyright :: (Monad m) => FilesT m [(FilePath, Text)]
copyright :: FilesT m [(String, Text)]
copyright =
    do Maybe CopyrightDescription
copyrt <- DebianT m (Maybe CopyrightDescription)
-> WriterT
     [(String, Text)] (DebianT m) (Maybe CopyrightDescription)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DebianT m (Maybe CopyrightDescription)
 -> WriterT
      [(String, Text)] (DebianT m) (Maybe CopyrightDescription))
-> DebianT m (Maybe CopyrightDescription)
-> WriterT
     [(String, Text)] (DebianT m) (Maybe CopyrightDescription)
forall a b. (a -> b) -> a -> b
$ Getting
  (Maybe CopyrightDescription) DebInfo (Maybe CopyrightDescription)
-> DebianT m (Maybe CopyrightDescription)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use (Getting
  (Maybe CopyrightDescription) DebInfo (Maybe CopyrightDescription)
Lens' DebInfo (Maybe CopyrightDescription)
D.copyright)
       [(String, Text)] -> FilesT m [(String, Text)]
forall (m :: * -> *) a. Monad m => a -> m a
return ([(String, Text)] -> FilesT m [(String, Text)])
-> [(String, Text)] -> FilesT m [(String, Text)]
forall a b. (a -> b) -> a -> b
$ [(String, Text)]
-> (CopyrightDescription -> [(String, Text)])
-> Maybe CopyrightDescription
-> [(String, Text)]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (\ CopyrightDescription
x -> [(String
"debian/copyright", CopyrightDescription -> Text
forall a. Pretty a => a -> Text
prettyText CopyrightDescription
x)]) Maybe CopyrightDescription
copyrt

instance Pretty (PP (PackageDescription -> IO CopyrightDescription)) where
    pretty :: PP (PackageDescription -> IO CopyrightDescription) -> Doc
pretty PP (PackageDescription -> IO CopyrightDescription)
_ = String -> Doc
text String
"<function>"

controlFile :: S.SourceDebDescription -> Control' String
controlFile :: SourceDebDescription -> Control' String
controlFile SourceDebDescription
src =
    Control :: forall a. [Paragraph' a] -> Control' a
Control
    { unControl :: [Paragraph' String]
unControl =
          ([Field' String] -> Paragraph' String
forall a. [Field' a] -> Paragraph' a
Paragraph
           ([(String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
"Source", String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Doc -> String
forall a. Show a => a -> String
show (Doc -> String)
-> (SourceDebDescription -> Doc) -> SourceDebDescription -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> (SrcPkgName -> Doc) -> Maybe SrcPkgName -> Doc
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Doc
empty SrcPkgName -> Doc
forall a. Pretty (PP a) => a -> Doc
ppPrint (Maybe SrcPkgName -> Doc)
-> (SourceDebDescription -> Maybe SrcPkgName)
-> SourceDebDescription
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Getting (Maybe SrcPkgName) SourceDebDescription (Maybe SrcPkgName)
-> SourceDebDescription -> Maybe SrcPkgName
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting (Maybe SrcPkgName) SourceDebDescription (Maybe SrcPkgName)
Lens' SourceDebDescription (Maybe SrcPkgName)
S.source (SourceDebDescription -> String) -> SourceDebDescription -> String
forall a b. (a -> b) -> a -> b
$ SourceDebDescription
src)),
             (String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
"Maintainer", String
" " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> (NameAddr -> String
forall a. Pretty (PP a) => a -> String
ppShow (NameAddr -> String)
-> (SourceDebDescription -> NameAddr)
-> SourceDebDescription
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> NameAddr)
-> (NameAddr -> NameAddr) -> Either String NameAddr -> NameAddr
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (NameAddr -> String -> NameAddr
forall a b. a -> b -> a
const NameAddr
maintainerOfLastResort) NameAddr -> NameAddr
forall a. a -> a
id (Either String NameAddr -> NameAddr)
-> (SourceDebDescription -> Either String NameAddr)
-> SourceDebDescription
-> NameAddr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Getting
  (Either String NameAddr)
  SourceDebDescription
  (Either String NameAddr)
-> SourceDebDescription -> Either String NameAddr
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting
  (Either String NameAddr)
  SourceDebDescription
  (Either String NameAddr)
Lens' SourceDebDescription (Either String NameAddr)
S.maintainer (SourceDebDescription -> String) -> SourceDebDescription -> String
forall a b. (a -> b) -> a -> b
$ SourceDebDescription
src))] [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            String -> [NameAddr] -> [Field' String]
forall a. Pretty (PP [a]) => String -> [a] -> [Field' String]
lField String
"Uploaders" (Getting [NameAddr] SourceDebDescription [NameAddr]
-> SourceDebDescription -> [NameAddr]
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting [NameAddr] SourceDebDescription [NameAddr]
Lens' SourceDebDescription [NameAddr]
S.uploaders SourceDebDescription
src) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            (case Getting Bool SourceDebDescription Bool
-> SourceDebDescription -> Bool
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Bool SourceDebDescription Bool
Lens' SourceDebDescription Bool
S.dmUploadAllowed SourceDebDescription
src of Bool
True -> [(String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
"DM-Upload-Allowed", String
" yes")]; Bool
False -> []) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            String -> Maybe PackagePriority -> [Field' String]
forall a. Pretty (PP a) => String -> Maybe a -> [Field' String]
mField String
"Priority" (Getting
  (Maybe PackagePriority)
  SourceDebDescription
  (Maybe PackagePriority)
-> SourceDebDescription -> Maybe PackagePriority
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting
  (Maybe PackagePriority)
  SourceDebDescription
  (Maybe PackagePriority)
Lens' SourceDebDescription (Maybe PackagePriority)
S.priority SourceDebDescription
src) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            String -> Maybe Section -> [Field' String]
forall a. Pretty (PP a) => String -> Maybe a -> [Field' String]
mField String
"Section" (Getting (Maybe Section) SourceDebDescription (Maybe Section)
-> SourceDebDescription -> Maybe Section
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting (Maybe Section) SourceDebDescription (Maybe Section)
Lens' SourceDebDescription (Maybe Section)
S.section SourceDebDescription
src) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            String -> Relations -> [Field' String]
depField String
"Build-Depends" (Getting Relations SourceDebDescription Relations
-> SourceDebDescription -> Relations
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Relations SourceDebDescription Relations
Lens' SourceDebDescription Relations
S.buildDepends SourceDebDescription
src) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            String -> Relations -> [Field' String]
depField String
"Build-Depends-Indep" (Getting Relations SourceDebDescription Relations
-> SourceDebDescription -> Relations
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Relations SourceDebDescription Relations
Lens' SourceDebDescription Relations
S.buildDependsIndep SourceDebDescription
src) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            String -> Relations -> [Field' String]
depField String
"Build-Conflicts" (Getting Relations SourceDebDescription Relations
-> SourceDebDescription -> Relations
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Relations SourceDebDescription Relations
Lens' SourceDebDescription Relations
S.buildConflicts SourceDebDescription
src) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            String -> Relations -> [Field' String]
depField String
"Build-Conflicts-Indep" (Getting Relations SourceDebDescription Relations
-> SourceDebDescription -> Relations
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Relations SourceDebDescription Relations
Lens' SourceDebDescription Relations
S.buildConflictsIndep SourceDebDescription
src) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            String -> Maybe StandardsVersion -> [Field' String]
forall a. Pretty (PP a) => String -> Maybe a -> [Field' String]
mField String
"Standards-Version" (Getting
  (Maybe StandardsVersion)
  SourceDebDescription
  (Maybe StandardsVersion)
-> SourceDebDescription -> Maybe StandardsVersion
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting
  (Maybe StandardsVersion)
  SourceDebDescription
  (Maybe StandardsVersion)
Lens' SourceDebDescription (Maybe StandardsVersion)
S.standardsVersion SourceDebDescription
src) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            String -> Maybe Text -> [Field' String]
forall a. Pretty (PP a) => String -> Maybe a -> [Field' String]
mField String
"Homepage" (Getting (Maybe Text) SourceDebDescription (Maybe Text)
-> SourceDebDescription -> Maybe Text
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting (Maybe Text) SourceDebDescription (Maybe Text)
Lens' SourceDebDescription (Maybe Text)
S.homepage SourceDebDescription
src) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            (VersionControlSpec -> Field' String)
-> [VersionControlSpec] -> [Field' String]
forall a b. (a -> b) -> [a] -> [b]
List.map VersionControlSpec -> Field' String
vcsField (Set VersionControlSpec -> [VersionControlSpec]
forall a. Set a -> [a]
Set.toList (Getting
  (Set VersionControlSpec)
  SourceDebDescription
  (Set VersionControlSpec)
-> SourceDebDescription -> Set VersionControlSpec
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting
  (Set VersionControlSpec)
  SourceDebDescription
  (Set VersionControlSpec)
Lens' SourceDebDescription (Set VersionControlSpec)
S.vcsFields SourceDebDescription
src)) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            (XField -> Field' String) -> [XField] -> [Field' String]
forall a b. (a -> b) -> [a] -> [b]
List.map XField -> Field' String
xField (Set XField -> [XField]
forall a. Set a -> [a]
Set.toList (Getting (Set XField) SourceDebDescription (Set XField)
-> SourceDebDescription -> Set XField
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting (Set XField) SourceDebDescription (Set XField)
Lens' SourceDebDescription (Set XField)
S.xFields SourceDebDescription
src)) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            String -> Maybe Text -> [Field' String]
forall a. Pretty (PP a) => String -> Maybe a -> [Field' String]
mField String
"X-Description" (Getting (Maybe Text) SourceDebDescription (Maybe Text)
-> SourceDebDescription -> Maybe Text
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting (Maybe Text) SourceDebDescription (Maybe Text)
Lens' SourceDebDescription (Maybe Text)
S.xDescription SourceDebDescription
src)) Paragraph' String -> [Paragraph' String] -> [Paragraph' String]
forall a. a -> [a] -> [a]
:
           (BinaryDebDescription -> Paragraph' String)
-> [BinaryDebDescription] -> [Paragraph' String]
forall a b. (a -> b) -> [a] -> [b]
List.map BinaryDebDescription -> Paragraph' String
binary (Getting
  [BinaryDebDescription] SourceDebDescription [BinaryDebDescription]
-> SourceDebDescription -> [BinaryDebDescription]
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting
  [BinaryDebDescription] SourceDebDescription [BinaryDebDescription]
Lens' SourceDebDescription [BinaryDebDescription]
S.binaryPackages SourceDebDescription
src))
    }
    where
      binary :: B.BinaryDebDescription -> Paragraph' String
      binary :: BinaryDebDescription -> Paragraph' String
binary BinaryDebDescription
bin =
          [Field' String] -> Paragraph' String
forall a. [Field' a] -> Paragraph' a
Paragraph
           ([(String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
"Package", String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Doc -> String
forall a. Show a => a -> String
show (Doc -> String)
-> (BinaryDebDescription -> Doc) -> BinaryDebDescription -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BinPkgName -> Doc
forall a. Pretty (PP a) => a -> Doc
ppPrint (BinPkgName -> Doc)
-> (BinaryDebDescription -> BinPkgName)
-> BinaryDebDescription
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Getting BinPkgName BinaryDebDescription BinPkgName
-> BinaryDebDescription -> BinPkgName
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting BinPkgName BinaryDebDescription BinPkgName
Lens' BinaryDebDescription BinPkgName
B.package (BinaryDebDescription -> String) -> BinaryDebDescription -> String
forall a b. (a -> b) -> a -> b
$ BinaryDebDescription
bin)),
             (String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
"Architecture", String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Doc -> String
forall a. Show a => a -> String
show (Doc -> String)
-> (BinaryDebDescription -> Doc) -> BinaryDebDescription -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc
-> (PackageArchitectures -> Doc)
-> Maybe PackageArchitectures
-> Doc
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Doc
empty PackageArchitectures -> Doc
forall a. Pretty (PP a) => a -> Doc
ppPrint (Maybe PackageArchitectures -> Doc)
-> (BinaryDebDescription -> Maybe PackageArchitectures)
-> BinaryDebDescription
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Getting
  (Maybe PackageArchitectures)
  BinaryDebDescription
  (Maybe PackageArchitectures)
-> BinaryDebDescription -> Maybe PackageArchitectures
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting
  (Maybe PackageArchitectures)
  BinaryDebDescription
  (Maybe PackageArchitectures)
Lens' BinaryDebDescription (Maybe PackageArchitectures)
B.architecture (BinaryDebDescription -> String) -> BinaryDebDescription -> String
forall a b. (a -> b) -> a -> b
$ BinaryDebDescription
bin))] [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            String -> Maybe MultiArch -> [Field' String]
forall a. Pretty (PP a) => String -> Maybe a -> [Field' String]
mField String
"Multi-Arch" (Getting (Maybe MultiArch) BinaryDebDescription (Maybe MultiArch)
-> BinaryDebDescription -> Maybe MultiArch
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting (Maybe MultiArch) BinaryDebDescription (Maybe MultiArch)
Lens' BinaryDebDescription (Maybe MultiArch)
B.multiArch BinaryDebDescription
bin) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            String -> Maybe Section -> [Field' String]
forall a. Pretty (PP a) => String -> Maybe a -> [Field' String]
mField String
"Section" (Getting (Maybe Section) BinaryDebDescription (Maybe Section)
-> BinaryDebDescription -> Maybe Section
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting (Maybe Section) BinaryDebDescription (Maybe Section)
Lens' BinaryDebDescription (Maybe Section)
B.binarySection BinaryDebDescription
bin) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            String -> Maybe PackagePriority -> [Field' String]
forall a. Pretty (PP a) => String -> Maybe a -> [Field' String]
mField String
"Priority" (Getting
  (Maybe PackagePriority)
  BinaryDebDescription
  (Maybe PackagePriority)
-> BinaryDebDescription -> Maybe PackagePriority
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting
  (Maybe PackagePriority)
  BinaryDebDescription
  (Maybe PackagePriority)
Lens' BinaryDebDescription (Maybe PackagePriority)
B.binaryPriority BinaryDebDescription
bin) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            String -> Maybe Bool -> [Field' String]
forall a. Pretty (PP a) => String -> Maybe a -> [Field' String]
mField String
"Essential" (Getting (Maybe Bool) BinaryDebDescription (Maybe Bool)
-> BinaryDebDescription -> Maybe Bool
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting (Maybe Bool) BinaryDebDescription (Maybe Bool)
Lens' BinaryDebDescription (Maybe Bool)
B.essential BinaryDebDescription
bin) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            PackageRelations -> [Field' String]
relFields (Getting PackageRelations BinaryDebDescription PackageRelations
-> BinaryDebDescription -> PackageRelations
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting PackageRelations BinaryDebDescription PackageRelations
Lens' BinaryDebDescription PackageRelations
B.relations BinaryDebDescription
bin) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
            [(String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
"Description", String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Text -> String
unpack (Text -> String)
-> (BinaryDebDescription -> Text) -> BinaryDebDescription -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text
ensureDescription (Text -> Text)
-> (BinaryDebDescription -> Text) -> BinaryDebDescription -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
forall a. Monoid a => a
mempty (Maybe Text -> Text)
-> (BinaryDebDescription -> Maybe Text)
-> BinaryDebDescription
-> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Getting (Maybe Text) BinaryDebDescription (Maybe Text)
-> BinaryDebDescription -> Maybe Text
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting (Maybe Text) BinaryDebDescription (Maybe Text)
Lens' BinaryDebDescription (Maybe Text)
B.description (BinaryDebDescription -> String) -> BinaryDebDescription -> String
forall a b. (a -> b) -> a -> b
$ BinaryDebDescription
bin))])
          where
            ensureDescription :: Text -> Text
ensureDescription Text
t =
                case (Text -> Bool) -> [Text] -> [Text]
forall a. (a -> Bool) -> [a] -> [a]
List.dropWhileEnd Text -> Bool
Text.null ((Text -> Bool) -> [Text] -> [Text]
forall a. (a -> Bool) -> [a] -> [a]
List.dropWhile Text -> Bool
Text.null ((Text -> Text) -> [Text] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
List.map ((Char -> Bool) -> Text -> Text
Text.dropWhileEnd Char -> Bool
isSpace) (Text -> [Text]
Text.lines Text
t))) of
                  [] -> Text
"WARNING: No description available for package " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> BinPkgName -> Text
forall a. Pretty (PP a) => a -> Text
ppText (Getting BinPkgName BinaryDebDescription BinPkgName
-> BinaryDebDescription -> BinPkgName
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting BinPkgName BinaryDebDescription BinPkgName
Lens' BinaryDebDescription BinPkgName
B.package BinaryDebDescription
bin)
                  (Text
short : [Text]
long) ->
                      Text -> [Text] -> Text
Text.intercalate Text
"\n"
                        ((if Text -> Bool
Text.null ((Char -> Bool) -> Text -> Text
Text.dropWhile Char -> Bool
isSpace Text
short) then (Text
"WARNING: No short description available for package " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> BinPkgName -> Text
forall a. Pretty (PP a) => a -> Text
ppText (Getting BinPkgName BinaryDebDescription BinPkgName
-> BinaryDebDescription -> BinPkgName
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting BinPkgName BinaryDebDescription BinPkgName
Lens' BinaryDebDescription BinPkgName
B.package BinaryDebDescription
bin)) else Text
short) Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: [Text]
long)
      mField :: String -> Maybe a -> [Field' String]
mField String
tag = [Field' String]
-> (a -> [Field' String]) -> Maybe a -> [Field' String]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (\ a
x -> [(String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
tag, String
" " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> (Doc -> String
forall a. Show a => a -> String
show (Doc -> String) -> (a -> Doc) -> a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Doc
forall a. Pretty (PP a) => a -> Doc
ppPrint (a -> String) -> a -> String
forall a b. (a -> b) -> a -> b
$ a
x))])
      lField :: String -> [a] -> [Field' String]
lField String
_ [] = []
      lField String
tag [a]
xs = [(String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
tag, String
" " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> (Doc -> String
forall a. Show a => a -> String
show (Doc -> String) -> ([a] -> Doc) -> [a] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> Doc
forall a. Pretty (PP a) => a -> Doc
ppPrint ([a] -> String) -> [a] -> String
forall a b. (a -> b) -> a -> b
$ [a]
xs))]
      vcsField :: VersionControlSpec -> Field' String
vcsField (S.VCSBrowser Text
t) = (String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
"Vcs-Browser", String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
unpack Text
t)
      vcsField (S.VCSArch Text
t) = (String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
"Vcs-Arch", String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
unpack Text
t)
      vcsField (S.VCSBzr Text
t) = (String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
"Vcs-Bzr", String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
unpack Text
t)
      vcsField (S.VCSCvs Text
t) = (String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
"Vcs-Cvs", String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
unpack Text
t)
      vcsField (S.VCSDarcs Text
t) = (String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
"Vcs-Darcs", String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
unpack Text
t)
      vcsField (S.VCSGit Text
t) = (String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
"Vcs-Git", String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
unpack Text
t)
      vcsField (S.VCSHg Text
t) = (String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
"Vcs-Hg", String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
unpack Text
t)
      vcsField (S.VCSMtn Text
t) = (String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
"Vcs-Mtn", String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
unpack Text
t)
      vcsField (S.VCSSvn Text
t) = (String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
"Vcs-Svn", String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
unpack Text
t)
      xField :: XField -> Field' String
xField (S.XField Set XFieldDest
dests Text
tag Text
t) = (String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (Text -> String
unpack (Text
"X" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Set XFieldDest -> Text
forall p. (IsString p, Semigroup p) => Set XFieldDest -> p
showDests Set XFieldDest
dests Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"-" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
tag), Text -> String
unpack (Text
" " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
t))
      showDests :: Set XFieldDest -> p
showDests Set XFieldDest
s = if XFieldDest -> Set XFieldDest -> Bool
forall a. Ord a => a -> Set a -> Bool
member XFieldDest
S.B Set XFieldDest
s then p
"B" else p
"" p -> p -> p
forall a. Semigroup a => a -> a -> a
<>
                    if XFieldDest -> Set XFieldDest -> Bool
forall a. Ord a => a -> Set a -> Bool
member XFieldDest
S.S Set XFieldDest
s then p
"S" else p
"" p -> p -> p
forall a. Semigroup a => a -> a -> a
<>
                    if XFieldDest -> Set XFieldDest -> Bool
forall a. Ord a => a -> Set a -> Bool
member XFieldDest
S.C Set XFieldDest
s then p
"C" else p
""

relFields :: B.PackageRelations -> [Field' [Char]]
relFields :: PackageRelations -> [Field' String]
relFields PackageRelations
rels =
    String -> Relations -> [Field' String]
depField String
"Depends" (Getting Relations PackageRelations Relations
-> PackageRelations -> Relations
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Relations PackageRelations Relations
Lens' PackageRelations Relations
B.depends PackageRelations
rels) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
    String -> Relations -> [Field' String]
depField String
"Recommends" (Getting Relations PackageRelations Relations
-> PackageRelations -> Relations
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Relations PackageRelations Relations
Lens' PackageRelations Relations
B.recommends PackageRelations
rels) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
    String -> Relations -> [Field' String]
depField String
"Suggests" (Getting Relations PackageRelations Relations
-> PackageRelations -> Relations
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Relations PackageRelations Relations
Lens' PackageRelations Relations
B.suggests PackageRelations
rels) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
    String -> Relations -> [Field' String]
depField String
"Pre-Depends" (Getting Relations PackageRelations Relations
-> PackageRelations -> Relations
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Relations PackageRelations Relations
Lens' PackageRelations Relations
B.preDepends PackageRelations
rels) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
    String -> Relations -> [Field' String]
depField String
"Breaks" (Getting Relations PackageRelations Relations
-> PackageRelations -> Relations
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Relations PackageRelations Relations
Lens' PackageRelations Relations
B.breaks PackageRelations
rels) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
    String -> Relations -> [Field' String]
depField String
"Conflicts" (Getting Relations PackageRelations Relations
-> PackageRelations -> Relations
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Relations PackageRelations Relations
Lens' PackageRelations Relations
B.conflicts PackageRelations
rels) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
    String -> Relations -> [Field' String]
depField String
"Provides" (Getting Relations PackageRelations Relations
-> PackageRelations -> Relations
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Relations PackageRelations Relations
Lens' PackageRelations Relations
B.provides PackageRelations
rels) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
    String -> Relations -> [Field' String]
depField String
"Replaces" (Getting Relations PackageRelations Relations
-> PackageRelations -> Relations
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Relations PackageRelations Relations
Lens' PackageRelations Relations
B.replaces PackageRelations
rels) [Field' String] -> [Field' String] -> [Field' String]
forall a. [a] -> [a] -> [a]
++
    String -> Relations -> [Field' String]
depField String
"Built-Using" (Getting Relations PackageRelations Relations
-> PackageRelations -> Relations
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Relations PackageRelations Relations
Lens' PackageRelations Relations
B.builtUsing PackageRelations
rels)

depField :: [Char] -> Relations -> [Field' [Char]]
depField :: String -> Relations -> [Field' String]
depField String
tag Relations
rels = case Relations
rels of [] -> []; Relations
_ -> [(String, String) -> Field' String
forall a. (a, a) -> Field' a
Field (String
tag, String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Relations -> String
showDeps' Relations
rels)]