packages feed

cabal-debian 4.31.7 → 4.31.9

raw patch · 47 files changed

+91/−5762 lines, 47 filesdep −HaXmldep −ListLikedep −bytestringdep ~Cabaldep ~basePVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies removed: HaXml, ListLike, bytestring, bzlib, network, old-locale, process-extras, regex-compat, template-haskell, time, zlib

Dependency ranges changed: Cabal, base

API changes (from Hackage documentation)

- Debian.Apt.Dependencies: CSP :: PackageNameMap a -> Relations -> (a -> Relations) -> (a -> Relations) -> (a -> (BinPkgName, DebianVersion)) -> CSP a
- Debian.Apt.Dependencies: Complete :: Status
- Debian.Apt.Dependencies: MissingDep :: Relation -> Status
- Debian.Apt.Dependencies: Remaining :: AndRelation -> Status
- Debian.Apt.Dependencies: [conflicts] :: CSP a -> a -> Relations
- Debian.Apt.Dependencies: [depFunction] :: CSP a -> (a -> Relations)
- Debian.Apt.Dependencies: [packageVersion] :: CSP a -> a -> (BinPkgName, DebianVersion)
- Debian.Apt.Dependencies: [pnm] :: CSP a -> PackageNameMap a
- Debian.Apt.Dependencies: [relations] :: CSP a -> Relations
- Debian.Apt.Dependencies: bj :: CSP p -> Tree (State p, ConflictSet) -> Tree (State p, ConflictSet)
- Debian.Apt.Dependencies: bt :: Labeler a
- Debian.Apt.Dependencies: combine :: CSP p -> [(State p, ConflictSet)] -> [ConflictSet] -> ConflictSet
- Debian.Apt.Dependencies: complete :: State a -> Bool
- Debian.Apt.Dependencies: conflict :: CSP p -> p -> p -> Bool
- Debian.Apt.Dependencies: conflict' :: (BinPkgName, DebianVersion) -> Relation -> Bool
- Debian.Apt.Dependencies: controlCSP :: Control -> Relations -> (Paragraph -> Relations) -> CSP Paragraph
- Debian.Apt.Dependencies: data CSP a
- Debian.Apt.Dependencies: data Status
- Debian.Apt.Dependencies: depF :: Paragraph -> Relations
- Debian.Apt.Dependencies: distrTree :: (a -> [b]) -> b -> Tree a -> Tree b
- Debian.Apt.Dependencies: earliestInconsistency :: CSP a -> State a -> Maybe ((BinPkgName, DebianVersion), (BinPkgName, DebianVersion))
- Debian.Apt.Dependencies: foldTree :: (a -> [b] -> b) -> Tree a -> b
- Debian.Apt.Dependencies: gutsyPackages :: [Char]
- Debian.Apt.Dependencies: inhTree :: (b -> a -> b) -> b -> Tree a -> Tree b
- Debian.Apt.Dependencies: initTree :: (a -> [a]) -> a -> Tree a
- Debian.Apt.Dependencies: instance GHC.Classes.Eq Debian.Apt.Dependencies.Status
- Debian.Apt.Dependencies: isConflict :: ConflictSet -> Bool
- Debian.Apt.Dependencies: label :: Tree a -> a
- Debian.Apt.Dependencies: leaves :: Tree a -> [a]
- Debian.Apt.Dependencies: mapTree :: (a -> b) -> Tree a -> Tree b
- Debian.Apt.Dependencies: mkSearchTree :: CSP a -> Tree (State a)
- Debian.Apt.Dependencies: mkTree :: a -> [Tree a] -> Tree a
- Debian.Apt.Dependencies: packageVersionParagraph :: Paragraph -> (BinPkgName, DebianVersion)
- Debian.Apt.Dependencies: prune :: (a -> Bool) -> Tree a -> Tree a
- Debian.Apt.Dependencies: search :: Labeler a -> CSP a -> [State a]
- Debian.Apt.Dependencies: sidPackages :: [Char]
- Debian.Apt.Dependencies: solutions :: Tree (State a, ConflictSet) -> [State a]
- Debian.Apt.Dependencies: test :: FilePath -> String -> Labeler Paragraph -> IO ()
- Debian.Apt.Dependencies: testCSP :: FilePath -> (Paragraph -> Relations) -> String -> (CSP Paragraph -> IO a) -> IO a
- Debian.Apt.Dependencies: type ConflictSet = ([(BinPkgName, DebianVersion)], [Relation])
- Debian.Apt.Dependencies: type Labeler a = CSP a -> Tree (State a) -> Tree (State a, ConflictSet)
- Debian.Apt.Dependencies: type State a = (Status, [a])
- Debian.Apt.Dependencies: unionCS :: [ConflictSet] -> ConflictSet
- Debian.Apt.Dependencies: zipTreesWith :: (a -> b -> c) -> Tree a -> Tree b -> Tree c
- Debian.Apt.Index: BZ2 :: Compression
- Debian.Apt.Index: CheckSums :: Maybe String -> Maybe String -> Maybe String -> CheckSums
- Debian.Apt.Index: GZ :: Compression
- Debian.Apt.Index: Uncompressed :: Compression
- Debian.Apt.Index: [md5sum] :: CheckSums -> Maybe String
- Debian.Apt.Index: [sha1] :: CheckSums -> Maybe String
- Debian.Apt.Index: [sha256] :: CheckSums -> Maybe String
- Debian.Apt.Index: controlFromIndex :: Compression -> FilePath -> ByteString -> Either ParseError (Control' Text)
- Debian.Apt.Index: controlFromIndex' :: Compression -> FilePath -> IO (Either ParseError (Control' Text))
- Debian.Apt.Index: data CheckSums
- Debian.Apt.Index: data Compression
- Debian.Apt.Index: findContentsFiles :: (FilePath -> Bool) -> FilePath -> IO [FilePath]
- Debian.Apt.Index: findIndexes :: FilePath -> String -> [FileTuple] -> IO [(FileTuple, Compression)]
- Debian.Apt.Index: indexesInRelease :: (FilePath -> Bool) -> Control' Text -> [(CheckSums, Integer, FilePath)]
- Debian.Apt.Index: instance GHC.Classes.Eq Debian.Apt.Index.CheckSums
- Debian.Apt.Index: instance GHC.Classes.Eq Debian.Apt.Index.Compression
- Debian.Apt.Index: instance GHC.Classes.Ord Debian.Apt.Index.Compression
- Debian.Apt.Index: instance GHC.Enum.Bounded Debian.Apt.Index.Compression
- Debian.Apt.Index: instance GHC.Enum.Enum Debian.Apt.Index.Compression
- Debian.Apt.Index: instance GHC.Read.Read Debian.Apt.Index.CheckSums
- Debian.Apt.Index: instance GHC.Read.Read Debian.Apt.Index.Compression
- Debian.Apt.Index: instance GHC.Show.Show Debian.Apt.Index.CheckSums
- Debian.Apt.Index: instance GHC.Show.Show Debian.Apt.Index.Compression
- Debian.Apt.Index: tupleFromFilePath :: FilePath -> FilePath -> IO (Maybe FileTuple)
- Debian.Apt.Index: type Fetcher = URI -> FilePath -> Maybe UTCTime -> IO Bool
- Debian.Apt.Index: type FileTuple = (CheckSums, Size, FilePath)
- Debian.Apt.Index: type Size = Integer
- Debian.Apt.Index: update :: Fetcher -> FilePath -> String -> [DebSource] -> IO [Maybe (FilePath, Compression)]
- Debian.Apt.Methods: AuthorizationCredentials :: Site -> User -> Password -> Command
- Debian.Apt.Methods: AuthorizationRequired :: Site -> Status
- Debian.Apt.Methods: Capabilities :: String -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Status
- Debian.Apt.Methods: Configuration :: [ConfigItem] -> Command
- Debian.Apt.Methods: FetchCallbacks :: (Message -> IO ()) -> (URI -> Message -> IO ()) -> (URI -> Maybe Integer -> Maybe UTCTime -> Maybe Integer -> IO ()) -> (URI -> Maybe Integer -> Maybe UTCTime -> Maybe Integer -> Maybe FilePath -> Hashes -> Bool -> IO ()) -> (URI -> Message -> IO ()) -> (Message -> IO ()) -> (Site -> IO (Maybe (User, Password))) -> (Media -> Drive -> IO ()) -> (String -> IO ()) -> FetchCallbacks
- Debian.Apt.Methods: GeneralFailure :: Message -> Status
- Debian.Apt.Methods: LogMsg :: Message -> Status
- Debian.Apt.Methods: MediaChanged :: Media -> (Maybe Bool) -> Command
- Debian.Apt.Methods: MediaFailure :: Media -> Drive -> Status
- Debian.Apt.Methods: Status :: URI -> Message -> Status
- Debian.Apt.Methods: URIAcquire :: URI -> FilePath -> (Maybe UTCTime) -> Command
- Debian.Apt.Methods: URIDone :: URI -> Maybe Integer -> Maybe UTCTime -> Maybe Integer -> Maybe FilePath -> Hashes -> Bool -> Status
- Debian.Apt.Methods: URIFailure :: URI -> Message -> Status
- Debian.Apt.Methods: URIStart :: URI -> Maybe Integer -> Maybe UTCTime -> Maybe Integer -> Status
- Debian.Apt.Methods: [authorizationRequiredCB] :: FetchCallbacks -> Site -> IO (Maybe (User, Password))
- Debian.Apt.Methods: [debugCB] :: FetchCallbacks -> String -> IO ()
- Debian.Apt.Methods: [filename] :: Status -> Maybe FilePath
- Debian.Apt.Methods: [generalFailureCB] :: FetchCallbacks -> Message -> IO ()
- Debian.Apt.Methods: [hashes] :: Status -> Hashes
- Debian.Apt.Methods: [imsHit] :: Status -> Bool
- Debian.Apt.Methods: [lastModified] :: Status -> Maybe UTCTime
- Debian.Apt.Methods: [localOnly] :: Status -> Bool
- Debian.Apt.Methods: [logCB] :: FetchCallbacks -> Message -> IO ()
- Debian.Apt.Methods: [mediaFailureCB] :: FetchCallbacks -> Media -> Drive -> IO ()
- Debian.Apt.Methods: [message] :: Status -> Message
- Debian.Apt.Methods: [needsCleanup] :: Status -> Bool
- Debian.Apt.Methods: [pipeline] :: Status -> Bool
- Debian.Apt.Methods: [preScan] :: Status -> Bool
- Debian.Apt.Methods: [resumePoint] :: Status -> Maybe Integer
- Debian.Apt.Methods: [sendConfig] :: Status -> Bool
- Debian.Apt.Methods: [singleInstance] :: Status -> Bool
- Debian.Apt.Methods: [size] :: Status -> Maybe Integer
- Debian.Apt.Methods: [statusCB] :: FetchCallbacks -> URI -> Message -> IO ()
- Debian.Apt.Methods: [uriDoneCB] :: FetchCallbacks -> URI -> Maybe Integer -> Maybe UTCTime -> Maybe Integer -> Maybe FilePath -> Hashes -> Bool -> IO ()
- Debian.Apt.Methods: [uriFailureCB] :: FetchCallbacks -> URI -> Message -> IO ()
- Debian.Apt.Methods: [uriStartCB] :: FetchCallbacks -> URI -> Maybe Integer -> Maybe UTCTime -> Maybe Integer -> IO ()
- Debian.Apt.Methods: [uri] :: Status -> URI
- Debian.Apt.Methods: [version] :: Status -> String
- Debian.Apt.Methods: cliFetchCallbacks :: FetchCallbacks
- Debian.Apt.Methods: closeMethod :: MethodHandle -> IO ExitCode
- Debian.Apt.Methods: data Command
- Debian.Apt.Methods: data FetchCallbacks
- Debian.Apt.Methods: data Status
- Debian.Apt.Methods: emptyFetchCallbacks :: FetchCallbacks
- Debian.Apt.Methods: fetch :: FetchCallbacks -> [ConfigItem] -> URI -> FilePath -> Maybe UTCTime -> IO Bool
- Debian.Apt.Methods: getLastModified :: FilePath -> IO (Maybe UTCTime)
- Debian.Apt.Methods: instance GHC.Classes.Eq Debian.Apt.Methods.Command
- Debian.Apt.Methods: instance GHC.Classes.Eq Debian.Apt.Methods.Hashes
- Debian.Apt.Methods: instance GHC.Classes.Eq Debian.Apt.Methods.Status
- Debian.Apt.Methods: instance GHC.Show.Show Debian.Apt.Methods.Command
- Debian.Apt.Methods: instance GHC.Show.Show Debian.Apt.Methods.Hashes
- Debian.Apt.Methods: instance GHC.Show.Show Debian.Apt.Methods.Status
- Debian.Apt.Methods: openMethod :: FilePath -> IO MethodHandle
- Debian.Apt.Methods: recvStatus :: MethodHandle -> IO Status
- Debian.Apt.Methods: sendCommand :: MethodHandle -> Command -> IO ()
- Debian.Apt.Methods: simpleFetch :: [ConfigItem] -> URI -> FilePath -> Maybe UTCTime -> IO Bool
- Debian.Apt.Methods: type ConfigItem = (String, String)
- Debian.Apt.Methods: type Drive = String
- Debian.Apt.Methods: type Header = (String, String)
- Debian.Apt.Methods: type Media = String
- Debian.Apt.Methods: type Message = String
- Debian.Apt.Methods: type Password = String
- Debian.Apt.Methods: type Site = String
- Debian.Apt.Methods: type User = String
- Debian.Apt.Methods: whichMethodPath :: URI -> IO (Maybe FilePath)
- Debian.Apt.Methods: withMethodPath :: FilePath -> (MethodHandle -> IO a) -> IO a
- Debian.Apt.Methods: withMethodURI :: URI -> (MethodHandle -> IO a) -> IO a
- Debian.Apt.Package: addProvides :: (p -> [BinPkgName]) -> [p] -> PackageNameMap p -> PackageNameMap p
- Debian.Apt.Package: findProvides :: (p -> [BinPkgName]) -> [p] -> [(BinPkgName, p)]
- Debian.Apt.Package: lookupPackageByRel :: PackageNameMap a -> (a -> (BinPkgName, DebianVersion)) -> Relation -> [a]
- Debian.Apt.Package: packageNameMap :: (a -> BinPkgName) -> [a] -> PackageNameMap a
- Debian.Apt.Package: type PackageNameMap a = Map BinPkgName [a]
- Debian.Arch: All :: Arch
- Debian.Arch: ArchCPU :: String -> ArchCPU
- Debian.Arch: ArchCPUAny :: ArchCPU
- Debian.Arch: ArchOS :: String -> ArchOS
- Debian.Arch: ArchOSAny :: ArchOS
- Debian.Arch: Binary :: ArchOS -> ArchCPU -> Arch
- Debian.Arch: Source :: Arch
- Debian.Arch: data Arch
- Debian.Arch: data ArchCPU
- Debian.Arch: data ArchOS
- Debian.Arch: instance Data.Data.Data Debian.Arch.Arch
- Debian.Arch: instance Data.Data.Data Debian.Arch.ArchCPU
- Debian.Arch: instance Data.Data.Data Debian.Arch.ArchOS
- Debian.Arch: instance GHC.Classes.Eq Debian.Arch.Arch
- Debian.Arch: instance GHC.Classes.Eq Debian.Arch.ArchCPU
- Debian.Arch: instance GHC.Classes.Eq Debian.Arch.ArchOS
- Debian.Arch: instance GHC.Classes.Ord Debian.Arch.Arch
- Debian.Arch: instance GHC.Classes.Ord Debian.Arch.ArchCPU
- Debian.Arch: instance GHC.Classes.Ord Debian.Arch.ArchOS
- Debian.Arch: instance GHC.Read.Read Debian.Arch.Arch
- Debian.Arch: instance GHC.Read.Read Debian.Arch.ArchCPU
- Debian.Arch: instance GHC.Read.Read Debian.Arch.ArchOS
- Debian.Arch: instance GHC.Show.Show Debian.Arch.Arch
- Debian.Arch: instance GHC.Show.Show Debian.Arch.ArchCPU
- Debian.Arch: instance GHC.Show.Show Debian.Arch.ArchOS
- Debian.Arch: parseArch :: String -> Arch
- Debian.Arch: prettyArch :: Arch -> Doc
- Debian.Changes: ChangeLog :: [ChangeLogEntry] -> ChangeLog
- Debian.Changes: ChangedFileSpec :: String -> String -> String -> FileOffset -> SubSection -> String -> FilePath -> ChangedFileSpec
- Debian.Changes: Changes :: FilePath -> String -> DebianVersion -> ReleaseName -> Arch -> Paragraph' Text -> ChangeLogEntry -> [ChangedFileSpec] -> ChangesFile
- Debian.Changes: Entry :: String -> DebianVersion -> [ReleaseName] -> String -> String -> String -> String -> ChangeLogEntry
- Debian.Changes: WhiteSpace :: String -> ChangeLogEntry
- Debian.Changes: [changeArch] :: ChangesFile -> Arch
- Debian.Changes: [changeDir] :: ChangesFile -> FilePath
- Debian.Changes: [changeEntry] :: ChangesFile -> ChangeLogEntry
- Debian.Changes: [changeFiles] :: ChangesFile -> [ChangedFileSpec]
- Debian.Changes: [changeInfo] :: ChangesFile -> Paragraph' Text
- Debian.Changes: [changePackage] :: ChangesFile -> String
- Debian.Changes: [changeRelease] :: ChangesFile -> ReleaseName
- Debian.Changes: [changeVersion] :: ChangesFile -> DebianVersion
- Debian.Changes: [changedFileMD5sum] :: ChangedFileSpec -> String
- Debian.Changes: [changedFileName] :: ChangedFileSpec -> FilePath
- Debian.Changes: [changedFilePriority] :: ChangedFileSpec -> String
- Debian.Changes: [changedFileSHA1sum] :: ChangedFileSpec -> String
- Debian.Changes: [changedFileSHA256sum] :: ChangedFileSpec -> String
- Debian.Changes: [changedFileSection] :: ChangedFileSpec -> SubSection
- Debian.Changes: [changedFileSize] :: ChangedFileSpec -> FileOffset
- Debian.Changes: [logComments] :: ChangeLogEntry -> String
- Debian.Changes: [logDate] :: ChangeLogEntry -> String
- Debian.Changes: [logDists] :: ChangeLogEntry -> [ReleaseName]
- Debian.Changes: [logPackage] :: ChangeLogEntry -> String
- Debian.Changes: [logUrgency] :: ChangeLogEntry -> String
- Debian.Changes: [logVersion] :: ChangeLogEntry -> DebianVersion
- Debian.Changes: [logWho] :: ChangeLogEntry -> String
- Debian.Changes: changesFileName :: ChangesFile -> String
- Debian.Changes: data ChangeLogEntry
- Debian.Changes: data ChangedFileSpec
- Debian.Changes: data ChangesFile
- Debian.Changes: instance GHC.Classes.Eq Debian.Changes.ChangeLog
- Debian.Changes: instance GHC.Classes.Eq Debian.Changes.ChangeLogEntry
- Debian.Changes: instance GHC.Classes.Eq Debian.Changes.ChangedFileSpec
- Debian.Changes: instance GHC.Classes.Eq Debian.Changes.ChangesFile
- Debian.Changes: instance GHC.Read.Read Debian.Changes.ChangeLog
- Debian.Changes: instance GHC.Read.Read Debian.Changes.ChangeLogEntry
- Debian.Changes: instance GHC.Read.Read Debian.Changes.ChangedFileSpec
- Debian.Changes: instance GHC.Read.Read Debian.Changes.ChangesFile
- Debian.Changes: instance GHC.Show.Show Debian.Changes.ChangeLog
- Debian.Changes: instance GHC.Show.Show Debian.Changes.ChangeLogEntry
- Debian.Changes: instance GHC.Show.Show Debian.Changes.ChangedFileSpec
- Debian.Changes: instance GHC.Show.Show Debian.Changes.ChangesFile
- Debian.Changes: instance Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP Debian.Changes.ChangeLog)
- Debian.Changes: instance Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP Debian.Changes.ChangeLogEntry)
- Debian.Changes: instance Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP Debian.Changes.ChangedFileSpec)
- Debian.Changes: instance Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP Debian.Changes.ChangesFile)
- Debian.Changes: instance Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP [Debian.Changes.ChangeLogEntry])
- Debian.Changes: newtype ChangeLog
- Debian.Changes: parseChangeLog :: String -> ChangeLog
- Debian.Changes: parseChanges :: Text -> Maybe ChangeLogEntry
- Debian.Changes: parseEntries :: String -> [Either [String] ChangeLogEntry]
- Debian.Changes: parseEntry :: String -> Either [String] (ChangeLogEntry, String)
- Debian.Control: Comment :: a -> Field' a
- Debian.Control: Control :: [Paragraph' a] -> Control' a
- Debian.Control: Field :: (a, a) -> Field' a
- Debian.Control: IOError :: [Loc] -> IOError -> ControlFileError
- Debian.Control: MissingField :: [Loc] -> String -> ControlFileError
- Debian.Control: NoBinaryParagraphs :: [Loc] -> ControlFileError
- Debian.Control: NoParagraphs :: [Loc] -> ControlFileError
- Debian.Control: Paragraph :: [Field' a] -> Paragraph' a
- Debian.Control: ParseControlError :: [Loc] -> ParseError -> ControlFileError
- Debian.Control: ParseRelationsError :: [Loc] -> ParseError -> ControlFileError
- Debian.Control: [field] :: ControlFileError -> String
- Debian.Control: [ioError] :: ControlFileError -> IOError
- Debian.Control: [locs] :: ControlFileError -> [Loc]
- Debian.Control: [parseError] :: ControlFileError -> ParseError
- Debian.Control: [unControl] :: Control' a -> [Paragraph' a]
- Debian.Control: appendFields :: [Field' a] -> Paragraph' a -> Paragraph' a
- Debian.Control: asString :: ControlFunctions a => a -> String
- Debian.Control: class ControlFunctions a
- Debian.Control: class HasDebianControl a
- Debian.Control: data ControlFileError
- Debian.Control: data Field' a
- Debian.Control: debianBinaryPackageNames :: HasDebianControl a => a -> [BinPkgName]
- Debian.Control: debianBinaryParagraphs :: HasDebianControl a => a -> [Paragraph' Text]
- Debian.Control: debianBuildDeps :: HasDebianControl a => a -> Maybe Relations
- Debian.Control: debianBuildDepsIndep :: HasDebianControl a => a -> Maybe Relations
- Debian.Control: debianControl :: HasDebianControl a => a -> DebianControl
- Debian.Control: debianPackageNames :: HasDebianControl a => a -> (SrcPkgName, [BinPkgName])
- Debian.Control: debianPackageParagraphs :: HasDebianControl a => a -> (Paragraph' Text, [Paragraph' Text])
- Debian.Control: debianRelations :: HasDebianControl a => String -> a -> Either ControlFileError (Maybe Relations)
- Debian.Control: debianSourcePackageName :: HasDebianControl a => a -> SrcPkgName
- Debian.Control: debianSourceParagraph :: HasDebianControl a => a -> Paragraph' Text
- Debian.Control: fieldValue :: (ControlFunctions a) => String -> Paragraph' a -> Maybe a
- Debian.Control: formatControl :: Control' Text -> [Text]
- Debian.Control: formatField :: Field' Text -> Text
- Debian.Control: formatParagraph :: Paragraph' Text -> Text
- Debian.Control: lookupP :: ControlFunctions a => String -> (Paragraph' a) -> Maybe (Field' a)
- Debian.Control: mergeControls :: [Control' a] -> Control' a
- Debian.Control: modifyField :: (Eq a) => a -> (a -> a) -> Paragraph' a -> Paragraph' a
- Debian.Control: newtype Control' a
- Debian.Control: newtype Paragraph' a
- Debian.Control: pControl :: ControlParser Control
- Debian.Control: packField :: Field' String -> Field' Text
- Debian.Control: packParagraph :: Paragraph -> Paragraph
- Debian.Control: parseControl :: ControlFunctions a => String -> a -> (Either ParseError (Control' a))
- Debian.Control: parseControlFromFile :: ControlFunctions a => FilePath -> IO (Either ParseError (Control' a))
- Debian.Control: parseControlFromHandle :: ControlFunctions a => String -> Handle -> IO (Either ParseError (Control' a))
- Debian.Control: parseDebianControlFromFile :: FilePath -> IO (Either ControlFileError DebianControl)
- Debian.Control: prependFields :: [Field' a] -> Paragraph' a -> Paragraph' a
- Debian.Control: protectFieldText :: ControlFunctions a => a -> a
- Debian.Control: raiseFields :: (Eq a) => (a -> Bool) -> Paragraph' a -> Paragraph' a
- Debian.Control: removeField :: (Eq a) => a -> Paragraph' a -> Paragraph' a
- Debian.Control: renameField :: (Eq a) => a -> a -> Paragraph' a -> Paragraph' a
- Debian.Control: stripWS :: ControlFunctions a => a -> a
- Debian.Control: type Control = Control' String
- Debian.Control: type ControlParser a = CharParser () a
- Debian.Control: type Field = Field' String
- Debian.Control: type Paragraph = Paragraph' String
- Debian.Control: unsafeDebianControl :: Control' Text -> DebianControl
- Debian.Control: validateDebianControl :: MonadCatch m => Control' Text -> m (Either ControlFileError DebianControl)
- Debian.Control.ByteString: Comment :: a -> Field' a
- Debian.Control.ByteString: Control :: [Paragraph' a] -> Control' a
- Debian.Control.ByteString: Field :: (a, a) -> Field' a
- Debian.Control.ByteString: Paragraph :: [Field' a] -> Paragraph' a
- Debian.Control.ByteString: [unControl] :: Control' a -> [Paragraph' a]
- Debian.Control.ByteString: appendFields :: [Field' a] -> Paragraph' a -> Paragraph' a
- Debian.Control.ByteString: asString :: ControlFunctions a => a -> String
- Debian.Control.ByteString: class ControlFunctions a
- Debian.Control.ByteString: data Field' a
- Debian.Control.ByteString: fieldValue :: (ControlFunctions a) => String -> Paragraph' a -> Maybe a
- Debian.Control.ByteString: instance Debian.Control.Common.ControlFunctions Data.ByteString.Internal.ByteString
- Debian.Control.ByteString: instance GHC.Base.Alternative (Debian.Control.ByteString.Parser state)
- Debian.Control.ByteString: instance GHC.Base.Applicative (Debian.Control.ByteString.Parser state)
- Debian.Control.ByteString: instance GHC.Base.Functor (Debian.Control.ByteString.Parser state)
- Debian.Control.ByteString: instance GHC.Base.Monad (Debian.Control.ByteString.Parser state)
- Debian.Control.ByteString: instance GHC.Base.MonadPlus (Debian.Control.ByteString.Parser state)
- Debian.Control.ByteString: instance GHC.Show.Show a => GHC.Show.Show (Debian.Control.ByteString.Result a)
- Debian.Control.ByteString: lookupP :: ControlFunctions a => String -> (Paragraph' a) -> Maybe (Field' a)
- Debian.Control.ByteString: mergeControls :: [Control' a] -> Control' a
- Debian.Control.ByteString: modifyField :: (Eq a) => a -> (a -> a) -> Paragraph' a -> Paragraph' a
- Debian.Control.ByteString: newtype Control' a
- Debian.Control.ByteString: newtype Paragraph' a
- Debian.Control.ByteString: parseControl :: ControlFunctions a => String -> a -> (Either ParseError (Control' a))
- Debian.Control.ByteString: parseControlFromFile :: ControlFunctions a => FilePath -> IO (Either ParseError (Control' a))
- Debian.Control.ByteString: parseControlFromHandle :: ControlFunctions a => String -> Handle -> IO (Either ParseError (Control' a))
- Debian.Control.ByteString: prependFields :: [Field' a] -> Paragraph' a -> Paragraph' a
- Debian.Control.ByteString: protectFieldText :: ControlFunctions a => a -> a
- Debian.Control.ByteString: raiseFields :: (Eq a) => (a -> Bool) -> Paragraph' a -> Paragraph' a
- Debian.Control.ByteString: removeField :: (Eq a) => a -> Paragraph' a -> Paragraph' a
- Debian.Control.ByteString: renameField :: (Eq a) => a -> a -> Paragraph' a -> Paragraph' a
- Debian.Control.ByteString: stripWS :: ControlFunctions a => a -> a
- Debian.Control.ByteString: type Control = Control' ByteString
- Debian.Control.ByteString: type Field = Field' ByteString
- Debian.Control.ByteString: type Paragraph = Paragraph' ByteString
- Debian.Control.Common: Comment :: a -> Field' a
- Debian.Control.Common: Control :: [Paragraph' a] -> Control' a
- Debian.Control.Common: Field :: (a, a) -> Field' a
- Debian.Control.Common: Paragraph :: [Field' a] -> Paragraph' a
- Debian.Control.Common: [unControl] :: Control' a -> [Paragraph' a]
- Debian.Control.Common: appendFields :: [Field' a] -> Paragraph' a -> Paragraph' a
- Debian.Control.Common: asString :: ControlFunctions a => a -> String
- Debian.Control.Common: class ControlFunctions a
- Debian.Control.Common: data Field' a
- Debian.Control.Common: fieldValue :: (ControlFunctions a) => String -> Paragraph' a -> Maybe a
- Debian.Control.Common: instance (Debian.Control.Common.ControlFunctions a, Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP a)) => Text.PrettyPrint.HughesPJClass.Pretty (Debian.Control.Common.Control' a)
- Debian.Control.Common: instance (Debian.Control.Common.ControlFunctions a, Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP a)) => Text.PrettyPrint.HughesPJClass.Pretty (Debian.Control.Common.Field' a)
- Debian.Control.Common: instance (Debian.Control.Common.ControlFunctions a, Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP a)) => Text.PrettyPrint.HughesPJClass.Pretty (Debian.Control.Common.Paragraph' a)
- Debian.Control.Common: instance GHC.Classes.Eq a => GHC.Classes.Eq (Debian.Control.Common.Control' a)
- Debian.Control.Common: instance GHC.Classes.Eq a => GHC.Classes.Eq (Debian.Control.Common.Field' a)
- Debian.Control.Common: instance GHC.Classes.Eq a => GHC.Classes.Eq (Debian.Control.Common.Paragraph' a)
- Debian.Control.Common: instance GHC.Classes.Ord a => GHC.Classes.Ord (Debian.Control.Common.Control' a)
- Debian.Control.Common: instance GHC.Classes.Ord a => GHC.Classes.Ord (Debian.Control.Common.Field' a)
- Debian.Control.Common: instance GHC.Classes.Ord a => GHC.Classes.Ord (Debian.Control.Common.Paragraph' a)
- Debian.Control.Common: instance GHC.Read.Read a => GHC.Read.Read (Debian.Control.Common.Control' a)
- Debian.Control.Common: instance GHC.Read.Read a => GHC.Read.Read (Debian.Control.Common.Field' a)
- Debian.Control.Common: instance GHC.Read.Read a => GHC.Read.Read (Debian.Control.Common.Paragraph' a)
- Debian.Control.Common: instance GHC.Show.Show a => GHC.Show.Show (Debian.Control.Common.Control' a)
- Debian.Control.Common: instance GHC.Show.Show a => GHC.Show.Show (Debian.Control.Common.Field' a)
- Debian.Control.Common: instance GHC.Show.Show a => GHC.Show.Show (Debian.Control.Common.Paragraph' a)
- Debian.Control.Common: lookupP :: ControlFunctions a => String -> (Paragraph' a) -> Maybe (Field' a)
- Debian.Control.Common: md5sumField :: (ControlFunctions a) => Paragraph' a -> Maybe a
- Debian.Control.Common: mergeControls :: [Control' a] -> Control' a
- Debian.Control.Common: modifyField :: (Eq a) => a -> (a -> a) -> Paragraph' a -> Paragraph' a
- Debian.Control.Common: newtype Control' a
- Debian.Control.Common: newtype Paragraph' a
- Debian.Control.Common: parseControl :: ControlFunctions a => String -> a -> (Either ParseError (Control' a))
- Debian.Control.Common: parseControlFromCmd :: ControlFunctions a => String -> IO (Either String (Control' a))
- Debian.Control.Common: parseControlFromFile :: ControlFunctions a => FilePath -> IO (Either ParseError (Control' a))
- Debian.Control.Common: parseControlFromHandle :: ControlFunctions a => String -> Handle -> IO (Either ParseError (Control' a))
- Debian.Control.Common: prependFields :: [Field' a] -> Paragraph' a -> Paragraph' a
- Debian.Control.Common: protectFieldText :: ControlFunctions a => a -> a
- Debian.Control.Common: protectFieldText' :: (StringLike a, ListLike a Char) => ControlFunctions a => a -> a
- Debian.Control.Common: raiseFields :: (Eq a) => (a -> Bool) -> Paragraph' a -> Paragraph' a
- Debian.Control.Common: removeField :: (Eq a) => a -> Paragraph' a -> Paragraph' a
- Debian.Control.Common: renameField :: (Eq a) => a -> a -> Paragraph' a -> Paragraph' a
- Debian.Control.Common: stripWS :: ControlFunctions a => a -> a
- Debian.Control.Policy: IOError :: [Loc] -> IOError -> ControlFileError
- Debian.Control.Policy: MissingField :: [Loc] -> String -> ControlFileError
- Debian.Control.Policy: NoBinaryParagraphs :: [Loc] -> ControlFileError
- Debian.Control.Policy: NoParagraphs :: [Loc] -> ControlFileError
- Debian.Control.Policy: ParseControlError :: [Loc] -> ParseError -> ControlFileError
- Debian.Control.Policy: ParseRelationsError :: [Loc] -> ParseError -> ControlFileError
- Debian.Control.Policy: [field] :: ControlFileError -> String
- Debian.Control.Policy: [ioError] :: ControlFileError -> IOError
- Debian.Control.Policy: [locs] :: ControlFileError -> [Loc]
- Debian.Control.Policy: [parseError] :: ControlFileError -> ParseError
- Debian.Control.Policy: class HasDebianControl a
- Debian.Control.Policy: data ControlFileError
- Debian.Control.Policy: data DebianControl
- Debian.Control.Policy: debianBinaryPackageNames :: HasDebianControl a => a -> [BinPkgName]
- Debian.Control.Policy: debianBinaryParagraphs :: HasDebianControl a => a -> [Paragraph' Text]
- Debian.Control.Policy: debianBuildDeps :: HasDebianControl a => a -> Maybe Relations
- Debian.Control.Policy: debianBuildDepsIndep :: HasDebianControl a => a -> Maybe Relations
- Debian.Control.Policy: debianControl :: HasDebianControl a => a -> DebianControl
- Debian.Control.Policy: debianPackageNames :: HasDebianControl a => a -> (SrcPkgName, [BinPkgName])
- Debian.Control.Policy: debianPackageParagraphs :: HasDebianControl a => a -> (Paragraph' Text, [Paragraph' Text])
- Debian.Control.Policy: debianRelations :: HasDebianControl a => String -> a -> Either ControlFileError (Maybe Relations)
- Debian.Control.Policy: debianSourcePackageName :: HasDebianControl a => a -> SrcPkgName
- Debian.Control.Policy: debianSourceParagraph :: HasDebianControl a => a -> Paragraph' Text
- Debian.Control.Policy: instance Debian.Control.Policy.HasControl (Debian.Control.Common.Control' Data.Text.Internal.Text)
- Debian.Control.Policy: instance Debian.Control.Policy.HasControl Debian.Control.Policy.DebianControl
- Debian.Control.Policy: instance Debian.Control.Policy.HasDebianControl Debian.Control.Policy.DebianControl
- Debian.Control.Policy: instance GHC.Classes.Eq Debian.Control.Policy.ControlFileError
- Debian.Control.Policy: instance GHC.Exception.Exception Debian.Control.Policy.ControlFileError
- Debian.Control.Policy: instance GHC.Show.Show Debian.Control.Policy.ControlFileError
- Debian.Control.Policy: instance GHC.Show.Show Debian.Control.Policy.DebianControl
- Debian.Control.Policy: parseDebianControl :: MonadCatch m => String -> Text -> m (Either ControlFileError DebianControl)
- Debian.Control.Policy: parseDebianControlFromFile :: FilePath -> IO (Either ControlFileError DebianControl)
- Debian.Control.Policy: unsafeDebianControl :: Control' Text -> DebianControl
- Debian.Control.Policy: validateDebianControl :: MonadCatch m => Control' Text -> m (Either ControlFileError DebianControl)
- Debian.Control.String: Comment :: a -> Field' a
- Debian.Control.String: Control :: [Paragraph' a] -> Control' a
- Debian.Control.String: Field :: (a, a) -> Field' a
- Debian.Control.String: Paragraph :: [Field' a] -> Paragraph' a
- Debian.Control.String: appendFields :: [Field' a] -> Paragraph' a -> Paragraph' a
- Debian.Control.String: asString :: ControlFunctions a => a -> String
- Debian.Control.String: class ControlFunctions a
- Debian.Control.String: data Field' a
- Debian.Control.String: fieldValue :: (ControlFunctions a) => String -> Paragraph' a -> Maybe a
- Debian.Control.String: instance Debian.Control.Common.ControlFunctions GHC.Base.String
- Debian.Control.String: lookupP :: ControlFunctions a => String -> (Paragraph' a) -> Maybe (Field' a)
- Debian.Control.String: mergeControls :: [Control' a] -> Control' a
- Debian.Control.String: modifyField :: (Eq a) => a -> (a -> a) -> Paragraph' a -> Paragraph' a
- Debian.Control.String: newtype Control' a
- Debian.Control.String: newtype Paragraph' a
- Debian.Control.String: pControl :: ControlParser Control
- Debian.Control.String: parseControl :: ControlFunctions a => String -> a -> (Either ParseError (Control' a))
- Debian.Control.String: parseControlFromFile :: ControlFunctions a => FilePath -> IO (Either ParseError (Control' a))
- Debian.Control.String: parseControlFromHandle :: ControlFunctions a => String -> Handle -> IO (Either ParseError (Control' a))
- Debian.Control.String: prependFields :: [Field' a] -> Paragraph' a -> Paragraph' a
- Debian.Control.String: protectFieldText :: ControlFunctions a => a -> a
- Debian.Control.String: raiseFields :: (Eq a) => (a -> Bool) -> Paragraph' a -> Paragraph' a
- Debian.Control.String: removeField :: (Eq a) => a -> Paragraph' a -> Paragraph' a
- Debian.Control.String: renameField :: (Eq a) => a -> a -> Paragraph' a -> Paragraph' a
- Debian.Control.String: stripWS :: ControlFunctions a => a -> a
- Debian.Control.String: type Control = Control' String
- Debian.Control.String: type ControlParser a = CharParser () a
- Debian.Control.String: type Field = Field' String
- Debian.Control.String: type Paragraph = Paragraph' String
- Debian.Control.Text: Comment :: a -> Field' a
- Debian.Control.Text: Control :: [Paragraph' a] -> Control' a
- Debian.Control.Text: Field :: (a, a) -> Field' a
- Debian.Control.Text: Paragraph :: [Field' a] -> Paragraph' a
- Debian.Control.Text: [unControl] :: Control' a -> [Paragraph' a]
- Debian.Control.Text: appendFields :: [Field' a] -> Paragraph' a -> Paragraph' a
- Debian.Control.Text: asString :: ControlFunctions a => a -> String
- Debian.Control.Text: class ControlFunctions a
- Debian.Control.Text: data Field' a
- Debian.Control.Text: decodeControl :: Control -> Control
- Debian.Control.Text: decodeField :: Field' ByteString -> Field' Text
- Debian.Control.Text: decodeParagraph :: Paragraph -> Paragraph
- Debian.Control.Text: fieldValue :: (ControlFunctions a) => String -> Paragraph' a -> Maybe a
- Debian.Control.Text: instance Debian.Control.Common.ControlFunctions Data.Text.Internal.Text
- Debian.Control.Text: lookupP :: ControlFunctions a => String -> (Paragraph' a) -> Maybe (Field' a)
- Debian.Control.Text: mergeControls :: [Control' a] -> Control' a
- Debian.Control.Text: modifyField :: (Eq a) => a -> (a -> a) -> Paragraph' a -> Paragraph' a
- Debian.Control.Text: newtype Control' a
- Debian.Control.Text: newtype Paragraph' a
- Debian.Control.Text: parseControl :: ControlFunctions a => String -> a -> (Either ParseError (Control' a))
- Debian.Control.Text: parseControlFromFile :: ControlFunctions a => FilePath -> IO (Either ParseError (Control' a))
- Debian.Control.Text: parseControlFromHandle :: ControlFunctions a => String -> Handle -> IO (Either ParseError (Control' a))
- Debian.Control.Text: prependFields :: [Field' a] -> Paragraph' a -> Paragraph' a
- Debian.Control.Text: protectFieldText :: ControlFunctions a => a -> a
- Debian.Control.Text: raiseFields :: (Eq a) => (a -> Bool) -> Paragraph' a -> Paragraph' a
- Debian.Control.Text: removeField :: (Eq a) => a -> Paragraph' a -> Paragraph' a
- Debian.Control.Text: renameField :: (Eq a) => a -> a -> Paragraph' a -> Paragraph' a
- Debian.Control.Text: stripWS :: ControlFunctions a => a -> a
- Debian.Control.Text: type Control = Control' Text
- Debian.Control.Text: type Field = Field' Text
- Debian.Control.Text: type Paragraph = Paragraph' Text
- Debian.Deb: fields :: (ControlFunctions a) => FilePath -> IO (Control' a)
- Debian.Extra.Files: withTemporaryFile :: MonadIO m => (FilePath -> m a) -> String -> m a
- Debian.GenBuildDeps: BuildableInfo :: [ReadyTarget a] -> [a] -> BuildableInfo a
- Debian.GenBuildDeps: CycleInfo :: [(a, a)] -> BuildableInfo a
- Debian.GenBuildDeps: DepInfo :: SrcPkgName -> Relations -> [BinPkgName] -> Set BinPkgName -> Set BinPkgName -> DepInfo
- Debian.GenBuildDeps: ReadyTarget :: a -> [a] -> [a] -> ReadyTarget a
- Debian.GenBuildDeps: [allBlocked] :: BuildableInfo a -> [a]
- Debian.GenBuildDeps: [binSet] :: DepInfo -> Set BinPkgName
- Debian.GenBuildDeps: [binaryNames] :: DepInfo -> [BinPkgName]
- Debian.GenBuildDeps: [depPairs] :: BuildableInfo a -> [(a, a)]
- Debian.GenBuildDeps: [depSet] :: DepInfo -> Set BinPkgName
- Debian.GenBuildDeps: [other] :: ReadyTarget a -> [a]
- Debian.GenBuildDeps: [readyTargets] :: BuildableInfo a -> [ReadyTarget a]
- Debian.GenBuildDeps: [ready] :: ReadyTarget a -> a
- Debian.GenBuildDeps: [relations] :: DepInfo -> Relations
- Debian.GenBuildDeps: [sourceName] :: DepInfo -> SrcPkgName
- Debian.GenBuildDeps: [waiting] :: ReadyTarget a -> [a]
- Debian.GenBuildDeps: binaryNames' :: HasDebianControl control => control -> [BinPkgName]
- Debian.GenBuildDeps: buildDependencies :: HasDebianControl control => control -> DepInfo
- Debian.GenBuildDeps: buildable :: (a -> DepInfo) -> [a] -> BuildableInfo a
- Debian.GenBuildDeps: compareSource :: DepInfo -> DepInfo -> Ordering
- Debian.GenBuildDeps: data BuildableInfo a
- Debian.GenBuildDeps: data DepInfo
- Debian.GenBuildDeps: data ReadyTarget a
- Debian.GenBuildDeps: failPackage :: Eq a => (a -> a -> Ordering) -> a -> [a] -> ([a], [a])
- Debian.GenBuildDeps: genDeps :: [FilePath] -> IO [DebianControl]
- Debian.GenBuildDeps: getSourceOrder :: FilePath -> IO [SrcPkgName]
- Debian.GenBuildDeps: instance GHC.Classes.Eq Debian.GenBuildDeps.DepInfo
- Debian.GenBuildDeps: instance GHC.Show.Show Debian.GenBuildDeps.DepInfo
- Debian.GenBuildDeps: instance GHC.Show.Show Debian.GenBuildDeps.OldRelaxInfo
- Debian.GenBuildDeps: orderSource :: (a -> a -> Ordering) -> [a] -> [a]
- Debian.GenBuildDeps: relations' :: HasDebianControl control => control -> Relations
- Debian.GenBuildDeps: relaxDeps :: RelaxInfo -> [DepInfo] -> [DepInfo]
- Debian.GenBuildDeps: sourceName' :: HasDebianControl control => control -> SrcPkgName
- Debian.GenBuildDeps: type RelaxInfo = SrcPkgName -> BinPkgName -> Bool
- Debian.Loc: __LOC__ :: Q Exp
- Debian.Loc: mapExn :: (MonadCatch m, Exception e) => m a -> (e -> e) -> m a
- Debian.Pretty: PP :: a -> PP a
- Debian.Pretty: [unPP] :: PP a -> a
- Debian.Pretty: instance GHC.Base.Functor Debian.Pretty.PP
- Debian.Pretty: instance Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP Data.Text.Internal.Text)
- Debian.Pretty: instance Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP GHC.Base.String)
- Debian.Pretty: instance Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP a) => Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP (GHC.Base.Maybe a))
- Debian.Pretty: newtype PP a
- Debian.Pretty: ppPrint :: Pretty (PP a) => a -> Doc
- Debian.Pretty: ppShow :: Pretty (PP a) => a -> String
- Debian.Pretty: ppText :: Pretty (PP a) => a -> Text
- Debian.Pretty: prettyShow :: Pretty a => a -> String
- Debian.Pretty: prettyText :: Pretty a => a -> Text
- Debian.Relation: All :: Arch
- Debian.Relation: ArchCPU :: String -> ArchCPU
- Debian.Relation: ArchCPUAny :: ArchCPU
- Debian.Relation: ArchExcept :: (Set Arch) -> ArchitectureReq
- Debian.Relation: ArchOS :: String -> ArchOS
- Debian.Relation: ArchOSAny :: ArchOS
- Debian.Relation: ArchOnly :: (Set Arch) -> ArchitectureReq
- Debian.Relation: BinPkgName :: String -> BinPkgName
- Debian.Relation: Binary :: ArchOS -> ArchCPU -> Arch
- Debian.Relation: EEQ :: DebianVersion -> VersionReq
- Debian.Relation: GRE :: DebianVersion -> VersionReq
- Debian.Relation: LTE :: DebianVersion -> VersionReq
- Debian.Relation: Rel :: BinPkgName -> (Maybe VersionReq) -> (Maybe ArchitectureReq) -> Relation
- Debian.Relation: SGR :: DebianVersion -> VersionReq
- Debian.Relation: SLT :: DebianVersion -> VersionReq
- Debian.Relation: Source :: Arch
- Debian.Relation: SrcPkgName :: String -> SrcPkgName
- Debian.Relation: [unBinPkgName] :: BinPkgName -> String
- Debian.Relation: [unSrcPkgName] :: SrcPkgName -> String
- Debian.Relation: checkVersionReq :: Maybe VersionReq -> Maybe DebianVersion -> Bool
- Debian.Relation: class ParseRelations a
- Debian.Relation: class Pretty (PP a) => PkgName a
- Debian.Relation: data Arch
- Debian.Relation: data ArchCPU
- Debian.Relation: data ArchOS
- Debian.Relation: data ArchitectureReq
- Debian.Relation: data Relation
- Debian.Relation: data VersionReq
- Debian.Relation: newtype BinPkgName
- Debian.Relation: newtype SrcPkgName
- Debian.Relation: parseRelations :: ParseRelations a => a -> Either ParseError Relations
- Debian.Relation: pkgNameFromString :: PkgName a => String -> a
- Debian.Relation: type AndRelation = [OrRelation]
- Debian.Relation: type OrRelation = [Relation]
- Debian.Relation: type RelParser a = CharParser () a
- Debian.Relation: type Relations = AndRelation
- Debian.Relation.ByteString: ArchExcept :: (Set Arch) -> ArchitectureReq
- Debian.Relation.ByteString: ArchOnly :: (Set Arch) -> ArchitectureReq
- Debian.Relation.ByteString: EEQ :: DebianVersion -> VersionReq
- Debian.Relation.ByteString: GRE :: DebianVersion -> VersionReq
- Debian.Relation.ByteString: LTE :: DebianVersion -> VersionReq
- Debian.Relation.ByteString: Rel :: BinPkgName -> (Maybe VersionReq) -> (Maybe ArchitectureReq) -> Relation
- Debian.Relation.ByteString: SGR :: DebianVersion -> VersionReq
- Debian.Relation.ByteString: SLT :: DebianVersion -> VersionReq
- Debian.Relation.ByteString: checkVersionReq :: Maybe VersionReq -> Maybe DebianVersion -> Bool
- Debian.Relation.ByteString: class ParseRelations a
- Debian.Relation.ByteString: data ArchitectureReq
- Debian.Relation.ByteString: data Relation
- Debian.Relation.ByteString: data VersionReq
- Debian.Relation.ByteString: instance Debian.Relation.Common.ParseRelations Data.ByteString.Internal.ByteString
- Debian.Relation.ByteString: parseRelations :: ParseRelations a => a -> Either ParseError Relations
- Debian.Relation.ByteString: type AndRelation = [OrRelation]
- Debian.Relation.ByteString: type OrRelation = [Relation]
- Debian.Relation.ByteString: type RelParser a = CharParser () a
- Debian.Relation.ByteString: type Relations = AndRelation
- Debian.Relation.Common: ArchExcept :: (Set Arch) -> ArchitectureReq
- Debian.Relation.Common: ArchOnly :: (Set Arch) -> ArchitectureReq
- Debian.Relation.Common: BinPkgName :: String -> BinPkgName
- Debian.Relation.Common: EEQ :: DebianVersion -> VersionReq
- Debian.Relation.Common: GRE :: DebianVersion -> VersionReq
- Debian.Relation.Common: LTE :: DebianVersion -> VersionReq
- Debian.Relation.Common: Rel :: BinPkgName -> (Maybe VersionReq) -> (Maybe ArchitectureReq) -> Relation
- Debian.Relation.Common: SGR :: DebianVersion -> VersionReq
- Debian.Relation.Common: SLT :: DebianVersion -> VersionReq
- Debian.Relation.Common: SrcPkgName :: String -> SrcPkgName
- Debian.Relation.Common: [unBinPkgName] :: BinPkgName -> String
- Debian.Relation.Common: [unSrcPkgName] :: SrcPkgName -> String
- Debian.Relation.Common: checkVersionReq :: Maybe VersionReq -> Maybe DebianVersion -> Bool
- Debian.Relation.Common: class ParseRelations a
- Debian.Relation.Common: class Pretty (PP a) => PkgName a
- Debian.Relation.Common: data ArchitectureReq
- Debian.Relation.Common: data Relation
- Debian.Relation.Common: data VersionReq
- Debian.Relation.Common: instance Data.Data.Data Debian.Relation.Common.BinPkgName
- Debian.Relation.Common: instance Data.Data.Data Debian.Relation.Common.SrcPkgName
- Debian.Relation.Common: instance Debian.Relation.Common.PkgName Debian.Relation.Common.BinPkgName
- Debian.Relation.Common: instance Debian.Relation.Common.PkgName Debian.Relation.Common.SrcPkgName
- Debian.Relation.Common: instance GHC.Classes.Eq Debian.Relation.Common.ArchitectureReq
- Debian.Relation.Common: instance GHC.Classes.Eq Debian.Relation.Common.BinPkgName
- Debian.Relation.Common: instance GHC.Classes.Eq Debian.Relation.Common.Relation
- Debian.Relation.Common: instance GHC.Classes.Eq Debian.Relation.Common.SrcPkgName
- Debian.Relation.Common: instance GHC.Classes.Eq Debian.Relation.Common.VersionReq
- Debian.Relation.Common: instance GHC.Classes.Ord Debian.Relation.Common.ArchitectureReq
- Debian.Relation.Common: instance GHC.Classes.Ord Debian.Relation.Common.BinPkgName
- Debian.Relation.Common: instance GHC.Classes.Ord Debian.Relation.Common.Relation
- Debian.Relation.Common: instance GHC.Classes.Ord Debian.Relation.Common.SrcPkgName
- Debian.Relation.Common: instance GHC.Classes.Ord Debian.Relation.Common.VersionReq
- Debian.Relation.Common: instance GHC.Read.Read Debian.Relation.Common.ArchitectureReq
- Debian.Relation.Common: instance GHC.Read.Read Debian.Relation.Common.BinPkgName
- Debian.Relation.Common: instance GHC.Read.Read Debian.Relation.Common.Relation
- Debian.Relation.Common: instance GHC.Read.Read Debian.Relation.Common.SrcPkgName
- Debian.Relation.Common: instance GHC.Read.Read Debian.Relation.Common.VersionReq
- Debian.Relation.Common: instance GHC.Show.Show Debian.Relation.Common.ArchitectureReq
- Debian.Relation.Common: instance GHC.Show.Show Debian.Relation.Common.BinPkgName
- Debian.Relation.Common: instance GHC.Show.Show Debian.Relation.Common.Relation
- Debian.Relation.Common: instance GHC.Show.Show Debian.Relation.Common.SrcPkgName
- Debian.Relation.Common: instance GHC.Show.Show Debian.Relation.Common.VersionReq
- Debian.Relation.Common: instance Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP Debian.Relation.Common.ArchitectureReq)
- Debian.Relation.Common: instance Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP Debian.Relation.Common.BinPkgName)
- Debian.Relation.Common: instance Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP Debian.Relation.Common.OrRelation)
- Debian.Relation.Common: instance Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP Debian.Relation.Common.Relation)
- Debian.Relation.Common: instance Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP Debian.Relation.Common.Relations)
- Debian.Relation.Common: instance Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP Debian.Relation.Common.SrcPkgName)
- Debian.Relation.Common: instance Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP Debian.Relation.Common.VersionReq)
- Debian.Relation.Common: newtype BinPkgName
- Debian.Relation.Common: newtype SrcPkgName
- Debian.Relation.Common: parseRelations :: ParseRelations a => a -> Either ParseError Relations
- Debian.Relation.Common: pkgNameFromString :: PkgName a => String -> a
- Debian.Relation.Common: prettyArchitectureReq :: ArchitectureReq -> Doc
- Debian.Relation.Common: prettyOrRelation :: [Relation] -> Doc
- Debian.Relation.Common: prettyRelation :: Relation -> Doc
- Debian.Relation.Common: prettyRelations :: [[Relation]] -> Doc
- Debian.Relation.Common: prettyVersionReq :: VersionReq -> Doc
- Debian.Relation.Common: type AndRelation = [OrRelation]
- Debian.Relation.Common: type OrRelation = [Relation]
- Debian.Relation.Common: type Relations = AndRelation
- Debian.Relation.String: ArchExcept :: (Set Arch) -> ArchitectureReq
- Debian.Relation.String: ArchOnly :: (Set Arch) -> ArchitectureReq
- Debian.Relation.String: EEQ :: DebianVersion -> VersionReq
- Debian.Relation.String: GRE :: DebianVersion -> VersionReq
- Debian.Relation.String: LTE :: DebianVersion -> VersionReq
- Debian.Relation.String: Rel :: BinPkgName -> (Maybe VersionReq) -> (Maybe ArchitectureReq) -> Relation
- Debian.Relation.String: SGR :: DebianVersion -> VersionReq
- Debian.Relation.String: SLT :: DebianVersion -> VersionReq
- Debian.Relation.String: checkVersionReq :: Maybe VersionReq -> Maybe DebianVersion -> Bool
- Debian.Relation.String: class ParseRelations a
- Debian.Relation.String: data ArchitectureReq
- Debian.Relation.String: data Relation
- Debian.Relation.String: data VersionReq
- Debian.Relation.String: instance Debian.Relation.Common.ParseRelations GHC.Base.String
- Debian.Relation.String: pRelations :: RelParser Relations
- Debian.Relation.String: parseRelations :: ParseRelations a => a -> Either ParseError Relations
- Debian.Relation.String: type AndRelation = [OrRelation]
- Debian.Relation.String: type OrRelation = [Relation]
- Debian.Relation.String: type RelParser a = CharParser () a
- Debian.Relation.String: type Relations = AndRelation
- Debian.Relation.Text: ArchExcept :: (Set Arch) -> ArchitectureReq
- Debian.Relation.Text: ArchOnly :: (Set Arch) -> ArchitectureReq
- Debian.Relation.Text: EEQ :: DebianVersion -> VersionReq
- Debian.Relation.Text: GRE :: DebianVersion -> VersionReq
- Debian.Relation.Text: LTE :: DebianVersion -> VersionReq
- Debian.Relation.Text: Rel :: BinPkgName -> (Maybe VersionReq) -> (Maybe ArchitectureReq) -> Relation
- Debian.Relation.Text: SGR :: DebianVersion -> VersionReq
- Debian.Relation.Text: SLT :: DebianVersion -> VersionReq
- Debian.Relation.Text: checkVersionReq :: Maybe VersionReq -> Maybe DebianVersion -> Bool
- Debian.Relation.Text: class ParseRelations a
- Debian.Relation.Text: data ArchitectureReq
- Debian.Relation.Text: data Relation
- Debian.Relation.Text: data VersionReq
- Debian.Relation.Text: instance Debian.Relation.Common.ParseRelations Data.Text.Internal.Text
- Debian.Relation.Text: parseRelations :: ParseRelations a => a -> Either ParseError Relations
- Debian.Relation.Text: type AndRelation = [OrRelation]
- Debian.Relation.Text: type OrRelation = [Relation]
- Debian.Relation.Text: type RelParser a = CharParser () a
- Debian.Relation.Text: type Relations = AndRelation
- Debian.Release: ReleaseName :: String -> ReleaseName
- Debian.Release: Section :: String -> Section
- Debian.Release: SubSection :: Section -> String -> SubSection
- Debian.Release: [relName] :: ReleaseName -> String
- Debian.Release: [section] :: SubSection -> Section
- Debian.Release: [subSectionName] :: SubSection -> String
- Debian.Release: data ReleaseName
- Debian.Release: data SubSection
- Debian.Release: instance Data.Data.Data Debian.Release.ReleaseName
- Debian.Release: instance GHC.Classes.Eq Debian.Release.ReleaseName
- Debian.Release: instance GHC.Classes.Eq Debian.Release.Section
- Debian.Release: instance GHC.Classes.Eq Debian.Release.SubSection
- Debian.Release: instance GHC.Classes.Ord Debian.Release.ReleaseName
- Debian.Release: instance GHC.Classes.Ord Debian.Release.Section
- Debian.Release: instance GHC.Classes.Ord Debian.Release.SubSection
- Debian.Release: instance GHC.Read.Read Debian.Release.ReleaseName
- Debian.Release: instance GHC.Read.Read Debian.Release.Section
- Debian.Release: instance GHC.Read.Read Debian.Release.SubSection
- Debian.Release: instance GHC.Show.Show Debian.Release.ReleaseName
- Debian.Release: instance GHC.Show.Show Debian.Release.Section
- Debian.Release: instance GHC.Show.Show Debian.Release.SubSection
- Debian.Release: newtype Section
- Debian.Release: parseReleaseName :: String -> ReleaseName
- Debian.Release: parseSection :: String -> SubSection
- Debian.Release: parseSection' :: String -> Section
- Debian.Release: releaseName' :: ReleaseName -> String
- Debian.Release: sectionName :: SubSection -> String
- Debian.Release: sectionName' :: Section -> String
- Debian.Release: sectionNameOfSubSection :: SubSection -> String
- Debian.Report: extractVersion :: Paragraph -> Maybe DebianVersion
- Debian.Report: makePackageMap :: (Paragraph -> a) -> (a -> a -> a) -> [(FilePath, Compression)] -> IO (Map Text a)
- Debian.Report: packageMap :: (Paragraph -> a) -> (a -> a -> a) -> Control' Text -> Map Text a
- Debian.Report: trumped :: Fetcher -> FilePath -> String -> [DebSource] -> [DebSource] -> IO (Map Text (DebianVersion, DebianVersion))
- Debian.Report: trumpedMap :: Map Text DebianVersion -> Map Text DebianVersion -> Map Text (DebianVersion, DebianVersion)
- Debian.Report: trumpedXML :: Map Text (DebianVersion, DebianVersion) -> CFilter Posn
- Debian.Sources: Deb :: SourceType
- Debian.Sources: DebSource :: SourceType -> URI -> Either String (ReleaseName, [Section]) -> DebSource
- Debian.Sources: DebSrc :: SourceType
- Debian.Sources: [sourceDist] :: DebSource -> Either String (ReleaseName, [Section])
- Debian.Sources: [sourceType] :: DebSource -> SourceType
- Debian.Sources: [sourceUri] :: DebSource -> URI
- Debian.Sources: data DebSource
- Debian.Sources: data SourceType
- Debian.Sources: instance GHC.Classes.Eq Debian.Sources.DebSource
- Debian.Sources: instance GHC.Classes.Eq Debian.Sources.SourceType
- Debian.Sources: instance GHC.Classes.Ord Debian.Sources.DebSource
- Debian.Sources: instance GHC.Classes.Ord Debian.Sources.SourceType
- Debian.Sources: instance GHC.Show.Show Debian.Sources.DebSource
- Debian.Sources: instance GHC.Show.Show Debian.Sources.SourceType
- Debian.Sources: instance Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP [Debian.Sources.DebSource])
- Debian.Sources: instance Text.PrettyPrint.HughesPJClass.Pretty Debian.Sources.DebSource
- Debian.Sources: instance Text.PrettyPrint.HughesPJClass.Pretty Debian.Sources.SourceType
- Debian.Sources: parseSourceLine :: String -> DebSource
- Debian.Sources: parseSourceLine' :: String -> Maybe DebSource
- Debian.Sources: parseSourcesList :: String -> [DebSource]
- Debian.Sources: quoteWords :: String -> [String]
- Debian.Sources: sourceLines :: String -> [String]
- Debian.Sources: stripLine :: String -> String
- Debian.Sources: type SliceName = ReleaseName
- Debian.Time: epochTimeToUTCTime :: EpochTime -> UTCTime
- Debian.Time: formatTimeRFC822 :: (FormatTime t) => t -> String
- Debian.Time: getCurrentLocalRFC822Time :: IO String
- Debian.Time: parseTimeRFC822 :: (ParseTime t) => String -> Maybe t
- Debian.Time: rfc822DateFormat' :: String
- Debian.URI: data URI'
- Debian.URI: dirFromURI :: URI -> IO (Either SomeException [String])
- Debian.URI: fileFromURI :: URI -> IO (Either SomeException ByteString)
- Debian.URI: fileFromURIStrict :: URI -> IO (Either SomeException ByteString)
- Debian.URI: fromURI' :: URI' -> URI
- Debian.URI: instance GHC.Classes.Eq Debian.URI.URI'
- Debian.URI: instance GHC.Classes.Ord Debian.URI.URI'
- Debian.URI: instance GHC.Read.Read Debian.URI.URI'
- Debian.URI: instance GHC.Show.Show Debian.URI.URI'
- Debian.URI: readURI' :: String -> Maybe URI'
- Debian.URI: toURI' :: URI -> URI'
- Debian.URI: uriToString' :: URI -> String
- Debian.UTF8: decode :: ByteString -> Text
- Debian.UTF8: readFile :: FilePath -> IO Text
- Debian.Util.FakeChanges: fakeChanges :: [FilePath] -> IO (FilePath, String)
- Debian.Util.FakeChanges: instance Data.Data.Data Debian.Util.FakeChanges.Error
- Debian.Util.FakeChanges: instance GHC.Classes.Eq Debian.Util.FakeChanges.Error
- Debian.Util.FakeChanges: instance GHC.Read.Read Debian.Util.FakeChanges.Error
- Debian.Util.FakeChanges: instance GHC.Show.Show Debian.Util.FakeChanges.Error
- Debian.Version: buildDebianVersion :: Maybe Int -> String -> Maybe String -> DebianVersion
- Debian.Version: data DebianVersion
- Debian.Version: epoch :: DebianVersion -> Maybe Int
- Debian.Version: evr :: DebianVersion -> (Maybe Int, String, Maybe String)
- Debian.Version: parseDebianVersion :: ParseDebianVersion a => a -> Either ParseError DebianVersion
- Debian.Version: parseDebianVersion' :: ParseDebianVersion string => string -> DebianVersion
- Debian.Version: prettyDebianVersion :: DebianVersion -> Doc
- Debian.Version: revision :: DebianVersion -> Maybe String
- Debian.Version: version :: DebianVersion -> String
- Debian.Version.ByteString: class ParseDebianVersion a
- Debian.Version.ByteString: instance Debian.Version.Common.ParseDebianVersion Data.ByteString.Internal.ByteString
- Debian.Version.ByteString: parseDebianVersion :: ParseDebianVersion a => a -> Either ParseError DebianVersion
- Debian.Version.Common: buildDebianVersion :: Maybe Int -> String -> Maybe String -> DebianVersion
- Debian.Version.Common: class ParseDebianVersion a
- Debian.Version.Common: data DebianVersion
- Debian.Version.Common: epoch :: DebianVersion -> Maybe Int
- Debian.Version.Common: evr :: DebianVersion -> (Maybe Int, String, Maybe String)
- Debian.Version.Common: instance GHC.Classes.Eq Debian.Version.Internal.DebianVersion
- Debian.Version.Common: instance GHC.Classes.Eq Debian.Version.Internal.NonNumeric
- Debian.Version.Common: instance GHC.Classes.Eq Debian.Version.Internal.Numeric
- Debian.Version.Common: instance GHC.Classes.Ord Debian.Version.Internal.DebianVersion
- Debian.Version.Common: instance GHC.Classes.Ord Debian.Version.Internal.NonNumeric
- Debian.Version.Common: instance GHC.Classes.Ord Debian.Version.Internal.Numeric
- Debian.Version.Common: instance GHC.Show.Show Debian.Version.Internal.DebianVersion
- Debian.Version.Common: instance Text.PrettyPrint.HughesPJClass.Pretty (Debian.Pretty.PP Debian.Version.Internal.DebianVersion)
- Debian.Version.Common: parseDV :: CharParser () (Found Int, NonNumeric, Found NonNumeric)
- Debian.Version.Common: parseDebianVersion :: ParseDebianVersion a => a -> Either ParseError DebianVersion
- Debian.Version.Common: parseDebianVersion' :: ParseDebianVersion string => string -> DebianVersion
- Debian.Version.Common: prettyDebianVersion :: DebianVersion -> Doc
- Debian.Version.Common: revision :: DebianVersion -> Maybe String
- Debian.Version.Common: version :: DebianVersion -> String
- Debian.Version.String: class ParseDebianVersion a
- Debian.Version.String: instance Debian.Version.Common.ParseDebianVersion GHC.Base.String
- Debian.Version.String: instance GHC.Read.Read Debian.Version.Internal.DebianVersion
- Debian.Version.String: parseDebianVersion :: ParseDebianVersion a => a -> Either ParseError DebianVersion
- Debian.Version.Text: class ParseDebianVersion a
- Debian.Version.Text: instance Debian.Version.Common.ParseDebianVersion Data.Text.Internal.Text
- Debian.Version.Text: parseDebianVersion :: ParseDebianVersion a => a -> Either ParseError DebianVersion
+ Debian.Debianize.VersionSplits: VersionSplits :: DebBase -> [(Version, DebBase)] -> VersionSplits
+ Debian.Debianize.VersionSplits: [oldestPackage] :: VersionSplits -> DebBase
+ Debian.Debianize.VersionSplits: [splits] :: VersionSplits -> [(Version, DebBase)]

Files

Tests.hs view
@@ -600,9 +600,11 @@ test7 label =     TestLabel label $     TestCase (do dist <- findBuildDir-                 new <- readProcessWithExitCode "runhaskell" ["--ghc-arg=-package-db=" ++ dist ++ "/package.conf.inplace", "debian/Debianize.hs", "--dry-run", "--native"] ""+                 result <- readProcessWithExitCode "runhaskell" ["--ghc-arg=-package-db=" ++ dist ++ "/package.conf.inplace", "debian/Debianize.hs", "--dry-run", "--native"] ""+                 assertEqual label (ExitSuccess, "Ignored debianization file: debian/cabal-debian.1\nIgnored debianization file: debian/cabal-debian.manpages\nDebianization (dry run):\n  No changes\n\n", "") result+{-                  assertBool label (elem new [(ExitSuccess, "Ignored debianization file: debian/cabal-debian.1\nIgnored debianization file: debian/cabal-debian.manpages\nDebianization (dry run):\n  No changes\n\n", ""),-                                             (ExitSuccess, "Ignored debianization file: debian/cabal-debian.manpages\nIgnored debianization file: debian/cabal-debian.1\nDebianization (dry run):\n  No changes\n\n", "")]))+                                             (ExitSuccess, "Ignored debianization file: debian/cabal-debian.manpages\nIgnored debianization file: debian/cabal-debian.1\nDebianization (dry run):\n  No changes\n\n", "")]) -})  test8 :: String -> Test test8 label =
cabal-debian.cabal view
@@ -1,5 +1,5 @@ Name:           cabal-debian-Version:        4.31.7+Version:        4.31.9 Copyright:      Copyright (c) 2007-2014, David Fox, Jeremy Shaw License:        BSD3 License-File:   LICENSE@@ -16,9 +16,8 @@  For documentation of the executable, run  @cabal-debian --help@, for documentation of the library API follow  the link to the @Debian.Debianize@ module below.-Cabal-Version: >= 1.8+Cabal-Version: >= 1.10 Extra-Source-Files:-  changelog   debian/cabal-debian.1   debian/cabal-debian.install   debian/cabal-debian.manpages@@ -150,11 +149,6 @@   Description: enable the unit test executable (disabled by default because it has a lot of wacky dependencies.)   Default: True -flag local-debian-  Description: Link directly to the source of the debian library-  Default: True-  Manual: True- flag pretty-112   Description: prettyclass was merged into pretty-1.1.2   Default: True@@ -164,6 +158,7 @@   location: https://github.com/ddssff/cabal-debian  Library+  Default-Language: Haskell2010   Hs-Source-Dirs: src   GHC-Options: -Wall -O2   Build-Depends:@@ -172,6 +167,7 @@     Cabal >= 1.18,     containers,     data-default,+    debian >= 3.89,     deepseq,     Diff >= 0.3.1,     directory,@@ -231,85 +227,49 @@     Build-Depends: pretty >= 1.1.2   else     Build-Depends: pretty < 1.1.2, prettyclass-  if flag(local-debian)-    Hs-Source-Dirs: debian-haskell-    Build-Depends:-      bytestring,-      bzlib,-      exceptions,-      HaXml,-      ListLike,-      network,-      network-uri,-      old-locale,-      process-extras,-      regex-compat,-      template-haskell,-      time,-      zlib-    Exposed-Modules:-      Debian.Apt.Dependencies,-      Debian.Apt.Index,-      Debian.Apt.Methods,-      Debian.Apt.Package,-      Debian.Arch,-      Debian.Changes,-      Debian.Control,-      Debian.Control.Common,-      Debian.Control.ByteString,-      Debian.Control.Policy,-      Debian.Control.String,-      Debian.Control.Text,-      Debian.Deb,-      Debian.Extra.Files,-      Debian.GenBuildDeps,-      Debian.Loc,-      Debian.Pretty,-      Debian.Relation,-      Debian.Relation.ByteString,-      Debian.Relation.Common,-      Debian.Relation.String,-      Debian.Relation.Text,-      Debian.Release,-      Debian.Sources,-      Debian.Version,-      Debian.Version.ByteString,-      Debian.Version.Common,-      Debian.Version.String,-      Debian.Version.Text,-      Debian.Report,-      Debian.Time,-      Debian.URI,-      Debian.UTF8,-      Debian.Util.FakeChanges-    Other-Modules:-      Debian.Version.Internal-  else-    Build-depends: debian >= 3.89  Executable cabal-debian+  Default-Language: Haskell2010   Hs-Source-Dirs: .   Main-is: CabalDebian.hs   ghc-options: -threaded -Wall -O2-  Build-Depends: base, cabal-debian, Cabal >= 1.18, lens, mtl, pretty, Unixutils >= 1.53+  Build-Depends:+    base,+    cabal-debian,+    Cabal >= 1.18,+    debian >= 3.89,+    lens,+    mtl,+    pretty,+    Unixutils >= 1.53   if flag(pretty-112)     Build-Depends: pretty >= 1.1.2   else     Build-Depends: pretty < 1.1.2, prettyclass-  if !flag(local-debian)-    Build-Depends: debian >= 3.89  Test-Suite cabal-debian-tests+  Default-Language: Haskell2010   if !flag(tests)     Buildable: False   Type: exitcode-stdio-1.0   Hs-Source-Dirs: .   Main-is: Tests.hs   ghc-options: -threaded -Wall -O2-  Build-Depends: base >= 4.8.1.0, cabal-debian, Cabal >= 1.18, containers, Diff >= 0.3.1, directory, filepath, hsemail, HUnit, lens, process, text+  Build-Depends:+    base < 5,+    cabal-debian,+    Cabal >= 1.16,+    containers,+    debian >= 3.89,+    Diff >= 0.3.1,+    directory,+    filepath,+    hsemail,+    HUnit,+    lens,+    process,+    text   if flag(pretty-112)     Build-Depends: pretty >= 1.1.2   else     Build-Depends: pretty < 1.1.2, prettyclass-  if !flag(local-debian)-    Build-Depends: debian >= 3.89
− changelog
@@ -1,1308 +0,0 @@-haskell-cabal-debian (4.31.6) unstable; urgency=low--  * Signature change in Debian.Version.parseDebianVersion-- -- David Fox <dsf@seereason.com>  Tue, 22 Sep 2015 06:56:28 -0700--haskell-cabal-debian (4.31.5) unstable; urgency=low--  * If there is no Setup.hs or Setup.lhs file we cannot build-    debian/hlibrary.setup, therefore we should set DEB_SETUP_BIN_NAME to-    "cabal".-- -- David Fox <dsf@seereason.com>  Thu, 17 Sep 2015 08:21:46 -0700--haskell-cabal-debian (4.31.4) unstable; urgency=low--  * The test suite was failing during the debian package build because-    it assumes the buildDir is in dist/, look for it in dist-ghc/ first.-- -- David Fox <dsf@seereason.com>  Sat, 22 Aug 2015 07:56:04 -0700--haskell-cabal-debian (4.31.3) unstable; urgency=low--  * Fix error message formatting (Joachim Breitner)-  * Fix test suite result code (Joachim Breitner)-- -- David Fox <dsf@seereason.com>  Fri, 21 Aug 2015 17:29:57 -0700--haskell-cabal-debian (4.31.2) unstable; urgency=low--  * Fix some names in Extra-Source-Files and add some missing ones.-- -- David Fox <dsf@seereason.com>  Thu, 20 Aug 2015 16:01:40 -0700--haskell-cabal-debian (4.31.1) unstable; urgency=low--  * Map the cabal library Cabal library to the debian library packages-    libghc-cabal-dev et. al.-- -- David Fox <dsf@seereason.com>  Thu, 20 Aug 2015 15:48:59 -0700--haskell-cabal-debian (4.31) unstable; urgency=low--  * Add some mappings from cabal build tools to debian package names:-    ghc -> ghc, alex -> alex, happy -> happy-  * Support Multi-Arch field in binaries (Joachim Breitner)-  * Implement --roundtrip option (Joachim Breitner)-  * Fixes for changelog entry formatting (Joachim Breitner)-  * Fixes for License field of debian/copyright (Joachim Breitner)-  * Only depend on ghc-doc if the package builds a library-  * New mode of operation --upgrade-  * No -prof and -doc package dependencies for binary and test suite packages-- -- David Fox <dsf@seereason.com>  Thu, 20 Aug 2015 14:31:28 -0700--haskell-cabal-debian (4.30.2) unstable; urgency=low--  * have runDebianizeScript look for source in src/ as well as ./-- -- David Fox <dsf@seereason.com>  Sat, 08 Aug 2015 08:04:02 -0700--haskell-cabal-debian (4.30.1) unstable; urgency=low--  * Make sure apache configuration files end with .conf-- -- David Fox <dsf@seereason.com>  Mon, 29 Jun 2015 10:27:47 -0700--haskell-cabal-debian (4.30) unstable; urgency=low--  * Remove mechanism to pass arguments via the CABALDEBIAN environment-    variable.-  * Make compareDebianization a pure function.-  * Remove MonadIO superclass from some functions-- -- David Fox <dsf@seereason.com>  Thu, 18 Jun 2015 09:12:59 -0700--haskell-cabal-debian (4.29.3) unstable; urgency=low--  * Fix escaping of wildcard characters that are not meaningful in cabal (i.e. square brackets)-  * Fix generation of argument list when running an external debian/Debianization.hs script-    (the whole thing was being repeated.)-  * Make sure the enable tests and run tests options are handled correctly (not sure they were-    wrong, but pretty sure they're now right.)-  * Export Dmitry's performDebianization function instead of debianize in Debian.Debianize.-- -- David Fox <dsf@seereason.com>  Sat, 13 Jun 2015 05:24:03 -0700--haskell-cabal-debian (4.29) unstable; urgency=low--  * Restore the --epoch-map, --cabal-flag, --ghcjs, and --buildenvdir options-  * Export parseProgramArguments' for parsing internally constructed-    argument lists.-- -- David Fox <dsf@seereason.com>  Mon, 08 Jun 2015 06:37:25 -0700--haskell-cabal-debian (4.28) unstable; urgency=low--  * New command line parsing code from Dmitry Bogatov-  * Drop support for old package old package formats-  * Bug fixes and typos, API simplification, more-- -- David Fox <dsf@seereason.com>  Wed, 13 May 2015 06:49:04 -0700--haskell-cabal-debian (4.27.2) unstable; urgency=low--  * Change to the contents of the init.d file created for server packages.-    In Debian.Debianize.Goodies.serverAtoms, insert a line into the init.d-    script to set the datadir environment variable to /usr/share/cabalname-    before startup.-- -- David Fox <dsf@seereason.com>  Wed, 22 Apr 2015 10:25:52 -0700--haskell-cabal-debian (4.27.1) unstable; urgency=low--  * Fix spurious "Just" in debian/copyright file.-- -- David Fox <dsf@seereason.com>  Tue, 21 Apr 2015 07:01:35 -0700--haskell-cabal-debian (4.27) unstable; urgency=low--  * Remove all vestiges of the old data-lens package.  Thanks to-    Dmitry Bogatov for help with this.-- -- David Fox <dsf@seereason.com>  Fri, 17 Apr 2015 15:01:27 -0700--haskell-cabal-debian (4.26) unstable; urgency=low--  * Revamp the way the final debian version number is computed in-    Debian.Debianize.Finalize.debianVersion.-- -- David Fox <dsf@seereason.com>  Sun, 05 Apr 2015 10:49:33 -0700--haskell-cabal-debian (4.25) unstable; urgency=low--  * Make sure /proc is mounted when we run ghc to determine its version-    number.  This is only a concern when running in a build root.-  * Fix whitespace handling bugs in copyright file parser and renderer.-- -- David Fox <dsf@seereason.com>  Sun, 05 Apr 2015 08:14:09 -0700--haskell-cabal-debian (4.24.9) unstable; urgency=low--  * Make debian/Debianize.hs a standard debianization script-  * Make the test executable into a cabal test suite-  * Make ghc-7.10 support official-  * Simplify main in CabalDebian.hs-  * Get rid of old --substvars option-- -- David Fox <dsf@seereason.com>  Wed, 01 Apr 2015 10:00:45 -0700--haskell-cabal-debian (4.24.8) unstable; urgency=low--  * use ghcjs --numeric-ghc-version to set the compilerInfoCompat field-    of CompilerInfo.  This makes cabal file directives like impl(ghc >= 7.9)-    work for ghcjs packages.-- -- David Fox <dsf@seereason.com>  Sun, 29 Mar 2015 12:38:33 -0700--haskell-cabal-debian (4.24.7) unstable; urgency=low--  * Remove the Data.Algorithm.Diff modules, they have moved into Diff-0.3.1-- -- David Fox <dsf@seereason.com>  Tue, 24 Mar 2015 16:51:29 -0700--haskell-cabal-debian (4.24.6) unstable; urgency=low--  * Use build dependency haskell-devscripts >= 0.8 for unofficial, >= 0.9-    for official.-  * Straighten out the test suite options: --no-tests, --no-run-tests-- -- David Fox <dsf@seereason.com>  Mon, 23 Mar 2015 11:31:14 -0700--haskell-cabal-debian (4.24.5) unstable; urgency=low--  * Patch from Dmitry Bogatov for filling in debian/copyright fields-  * Patch from Dmitry Bogatov for debhelper and haskell-devscripts build deps-  * Patch from Dmitry Bogatov for default changelog message-  * Add a --no-run-tests flag to control the nocheck option-  * Compatibility with different GHC versions-- -- David Fox <dsf@seereason.com>  Sat, 21 Mar 2015 10:14:48 -0700--haskell-cabal-debian (4.24.3) unstable; urgency=low--  * Always include the test suite build dependencies in debian/control,-    even if the testEnabled flag is set to False (at the moment it seems-    as if it always is.)-- -- David Fox <dsf@seereason.com>  Mon, 02 Mar 2015 17:33:52 -0800--haskell-cabal-debian (4.24.2) unstable; urgency=low--  * Distinguish between the place we find the data files (dataTop) and the-    place we put then (dataDest)-  * Add a case for the ISC license-- -- David Fox <dsf@seereason.com>  Sun, 22 Feb 2015 15:09:56 -0800--haskell-cabal-debian (4.24.1) unstable; urgency=low--  * Don't assign the name "cabal-ghcjs" to newer Cabal library versions-- -- David Fox <dsf@seereason.com>  Sun, 22 Feb 2015 06:08:28 -0800--haskell-cabal-debian (4.24) unstable; urgency=low--  * Convert from old data-lens package to lens.-  * Implement --allow-debian-self-build-deps-- -- David Fox <dsf@seereason.com>  Sat, 14 Feb 2015 06:15:01 -0800--haskell-cabal-debian (4.23.1) unstable; urgency=low--  * ifdefs for Cabal-1.18, 1.20, and 1.22, ghc-7.6, and 7.8.-- -- David Fox <dsf@seereason.com>  Sun, 08 Feb 2015 23:21:07 -0800--haskell-cabal-debian (4.23) unstable; urgency=low--  * Add DEB_ENABLE_TESTS = yes to rules file when appropriate-  * Add test suite build dependencies when appropriate-  * Add --no-test-suite option-  * Add --allow-debian-self-build-deps-  * Filter out self dependencies in the debian package space, not the-    cabal package space.-  * Fix generation of machine readable debian/copyright files-  * Use the homepage value found in the cabal file-  * Add travis build file-- -- David Fox <dsf@seereason.com>  Fri, 06 Feb 2015 06:25:08 -0800--haskell-cabal-debian (4.22) unstable; urgency=low--  * Big module reorganization for more type safety.-- -- David Fox <dsf@seereason.com>  Tue, 03 Feb 2015 13:22:29 -0800--haskell-cabal-debian (4.21.1) unstable; urgency=low--  * Fix --buildenvdir command line option.-  * Add an option for cabal flags-- -- David Fox <dsf@seereason.com>  Fri, 30 Jan 2015 13:46:08 -0800--haskell-cabal-debian (4.21) unstable; urgency=low--  * Split the enormous Atoms record into three layers - the innermost is-    Flags, which contains information obtained from the command line-    arguments.  Flags is also the argument to the inputCabalization-    function, which inputs a Cabal PackageDescription.  The Flags record-    is embedded in a DebInfo, which holds information related to the-    Debianization only.  The DebInfo and the PackageDescription are used-    to build the old Atoms record.  DebInfo is the state value of the-    DebianT monad, while Atoms is the state value of the CabalT monad.--    The point of all this is to ensure that a PackageDescription exists-    before we start converting the Cabalization to a Debianization.-- -- David Fox <dsf@seereason.com>  Thu, 29 Jan 2015 12:29:52 -0800--haskell-cabal-debian (4.20.2) unstable; urgency=low--  * Do not lowercase the package name when constructing the data file-    destination directory (/usr/share/<packagename>).-- -- David Fox <dsf@seereason.com>  Fri, 16 Jan 2015 05:45:23 -0800--haskell-cabal-debian (4.20.1) unstable; urgency=low--  * Fix a bug in the computation of the debian maintainer field-  * Improve rules file generation-- -- David Fox <dsf@seereason.com>  Wed, 14 Jan 2015 14:38:56 -0800--haskell-cabal-debian (4.20) unstable; urgency=low--  * Add a --source-section option-  * Fix handling of debian maintainer and debian uploaders-  * Improve formatting of debian/rules file-  * Rename function debianization -> debianize-  * Rename function finalizeDebianization' -> finalizeDebianization-  * Rename function getDebianMaintainer -> getCurrentDebianUser-- -- David Fox <dsf@seereason.com>  Fri, 09 Jan 2015 11:49:04 -0800--haskell-cabal-debian (4.19.3) unstable; urgency=low--  * Fix issue #23, so that if you run 'cabal-debian' and then-    'cabal-debian --compare' it says there are no differences.-  * Fix issue #16 - set revision if format is Quilt3.-- -- David Fox <dsf@seereason.com>  Thu, 08 Jan 2015 05:20:32 -0800--haskell-cabal-debian (4.19.2) unstable; urgency=low--  * Use canonical to put the debianization in a standard form before-    trying to compare existing and generated.-  * Fix bug where cabal-debian program processed the command line options-    twice.-  * Avoid using paths that point to ../ in the cabal file (even if-    disabled by a flag), it causes the package to be rejected by hackage.-- -- David Fox <dsf@seereason.com>  Wed, 07 Jan 2015 13:26:33 -0800--haskell-cabal-debian (4.19.1) unstable; urgency=low--  * Support Cabal-1.22-  * Test whether apt-file is installed (from creichert)-  * Conditional compilation for new symbols MPL and BSD2 (from creichert)-- -- David Fox <dsf@seereason.com>  Wed, 07 Jan 2015 12:56:00 -0800--haskell-cabal-debian (4.19) unstable; urgency=low--  * Add remapCabal function here from a private package-  * Remove debianVersionSplits, which has long been replaced by-    debianDefaultAtoms.-- -- David Fox <dsf@seereason.com>  Mon, 08 Dec 2014 10:07:06 -0800--haskell-cabal-debian (4.18) unstable; urgency=low--  * Add types to support machine readable copyright files.-  * Add --debian-base-name option and overrideDebianBaseName lens.-  * Add --omit-prof-version-deps option flag, have --official imply it-- -- David Fox <dsf@seereason.com>  Thu, 27 Nov 2014 07:11:35 -0800--haskell-cabal-debian (4.17.5) unstable; urgency=low--  * Use the prettyclass package and the PP wrappers in the latest-    debian package to do pretty printing.-  * Change default priority to extra-  * Use the new watch file suggested by nomeata-  * Use the control file template suggested in issue #3-- -- David Fox <dsf@seereason.com>  Mon, 15 Sep 2014 13:28:36 -0700--haskell-cabal-debian (4.17.4) unstable; urgency=low--  * Add missing ifdefs to hide the GHCJS constructor when ghcjs-support-    flag is False.-  * Require Cabal < 1.21 when ghcjs-support flag is False.-- -- David Fox <dsf@seereason.com>  Tue, 02 Sep 2014 09:06:20 -0700--haskell-cabal-debian (4.17.3) unstable; urgency=low--  * Moved source repository to github.com.-- -- David Fox <dsf@seereason.com>  Fri, 29 Aug 2014 13:55:26 -0700--haskell-cabal-debian (4.17.2) unstable; urgency=low--  * Fix formatting of the generated debian/*.install files.-- -- David Fox <dsf@seereason.com>  Tue, 19 Aug 2014 16:04:27 -0700--haskell-cabal-debian (4.17.1) unstable; urgency=low--  * Fix install of ghcjs executables - there was an extra subdir.-  * Don't append -ghcjs to default package name.-- -- David Fox <dsf@seereason.com>  Tue, 19 Aug 2014 10:15:46 -0700--haskell-cabal-debian (4.17) unstable; urgency=low--  * Fix bug in architecture dependent build dependency generation - it-    was getting the indep dependencies as well.-  * Support GHCJS executable packages, which are directories with the-    extension .jsexe.-- -- David Fox <dsf@seereason.com>  Mon, 18 Aug 2014 17:31:35 -0700--haskell-cabal-debian (4.16.1) unstable; urgency=low--  * Support for packaging libraries produced by the GHCJS compiler.-  * Generate debianizations that include libraries for multiple compiler-    flavors (not yet suppored in haskell-devscripts and/or Cabal.)-  * Put a DEB_DEFAULT_COMPILER assignment in debian/rules if we can-    infer it from the command line options.-- -- David Fox <dsf@seereason.com>  Sat, 16 Aug 2014 07:56:50 -0700--haskell-cabal-debian (4.15.2) unstable; urgency=low--  * Lowercase the strings in the extraLibs argument of allBuildDepends-    before wrapping them in BinPkgName.  Those types, which come from the-    debian package, should be opaque and do this whenever a BinPkgName (or-    SrcPkgName) is created, because upper case is never ok in Debian-    source or binary package names.  In the meantime I will make this-    requested change.  Thanks to Sven Bartscher for pointing this out.-- -- David Fox <dsf@seereason.com>  Tue, 12 Aug 2014 07:47:17 -0700--haskell-cabal-debian (4.15.1) unstable; urgency=low--  * Add Data and Typeable instances.-- -- David Fox <dsf@seereason.com>  Thu, 17 Jul 2014 11:22:17 -0700--haskell-cabal-debian (4.15) unstable; urgency=low--  * Don't hardcode the compiler name in makefile targets.-- -- David Fox <dsf@seereason.com>  Sat, 12 Jul 2014 12:15:10 -0700--haskell-cabal-debian (4.14) unstable; urgency=low--  * Move the code to map the cabal package named "Cabal" to the debian-    package named "libghc-cabal-*" from the seereason defaults to the-    debian defaults.-- -- David Fox <dsf@seereason.com>  Mon, 07 Jul 2014 08:35:39 -0700--haskell-cabal-debian (4.13) unstable; urgency=low--  * Add a flag for ghcjs support.-- -- David Fox <dsf@seereason.com>  Thu, 03 Jul 2014 12:05:21 -0700--haskell-cabal-debian (4.12) unstable; urgency=low--  * Remove the Top type and argument - use getWorkingDirectory instead.-- -- David Fox <dsf@seereason.com>  Sun, 29 Jun 2014 08:11:01 -0700--haskell-cabal-debian (4.11) unstable; urgency=low--  * Use MonadIO instead of IO for all signatures.  This is so-    we can more easily use cabal debian from a Shelly script.-- -- David Fox <dsf@seereason.com>  Sun, 29 Jun 2014 07:16:45 -0700--haskell-cabal-debian (4.10.1) unstable; urgency=low--  * Fix a tail exception in builtIn.-- -- David Fox <dsf@seereason.com>  Tue, 17 Jun 2014 07:21:22 -0700--haskell-cabal-debian (4.10) unstable; urgency=low--  * Rename knownVersionSplits -> debianVersionSplits and move to-    Debian.Debianize.Details.  (Should that be renamed-    Debian.Debianize.Debian?)-  * Add HC=ghc or HC=ghcjs to header of debian/rules depending on-    the value of the compilerFlavor atom.-- -- David Fox <dsf@seereason.com>  Sat, 14 Jun 2014 10:20:01 -0700--haskell-cabal-debian (4.9) unstable; urgency=low--  * Generate the library package prefix, previously hard coded as libghc-,-    using the CompilerFlavor value, so we get libghcjs-foo-dev when using-    ghcjs.-- -- David Fox <dsf@seereason.com>  Fri, 13 Jun 2014 09:58:13 -0700--haskell-cabal-debian (4.8) unstable; urgency=low--  * Add a --no-hoogle flag to omit the hoogle documentation link.  This-    link doesn't contain the package's version number, so it will conflict-    with other versions of the library (such as those built into ghc.)-- -- David Fox <dsf@seereason.com>  Tue, 10 Jun 2014 10:42:38 -0700--haskell-cabal-debian (4.7.1) unstable; urgency=low--  * Fix the code added in 4.7.-  * Add --recommends and --suggests options, similar to --depends et. al.-- -- David Fox <dsf@seereason.com>  Tue, 03 Jun 2014 07:14:52 -0700--haskell-cabal-debian (4.7) unstable; urgency=low--  * Improve the treatment of dependencies which are built into ghc.  This-    will allow the use of newer libraries than the ones built into ghc,-    provided they are given deb names that are different than the one ghc-    specifically conflicts with.  For example, a newer version of Cabal-    could be used if it was in the deb package libghc-cabal-ghcjs-dev.  To-    change the debian names of libraries we need to use the mapCabal and-    splitCabal functions, as is done in the autobuilder-seereason module-    Debian.AutoBuilder.Details.Atoms.-- -- David Fox <dsf@seereason.com>  Mon, 02 Jun 2014 14:28:59 -0700--haskell-cabal-debian (4.6.2) unstable; urgency=low--  * Move a seereason specific function from here to the-    autobuilder-seereason package.-- -- David Fox <dsf@seereason.com>  Mon, 02 Jun 2014 11:03:13 -0700--haskell-cabal-debian (4.6.1) unstable; urgency=low--  * Don't compute the current ghc version so often.-- -- David Fox <dsf@seereason.com>  Fri, 30 May 2014 13:40:12 -0700--haskell-cabal-debian (4.6) unstable; urgency=low--  * Add a --default-package option to change haskell-packagename-utils to-    some other name.-  * Fix treatment of cabalfile Data-Dir field - it describes where the-    data files are in the source tree, but shouldn't affect where they will-    be installed.-- -- David Fox <dsf@seereason.com>  Thu, 29 May 2014 08:27:54 -0700--haskell-cabal-debian (4.5) unstable; urgency=low--  * Remove the ghcVersion field and lens.-- -- David Fox <dsf@seereason.com>  Mon, 05 May 2014 11:55:53 -0700--haskell-cabal-debian (4.4) unstable; urgency=low--  * Add the copytruncate directive to logrotate files we generate.-    As things were, hslogger would continue writing to the deleted-    log file after it was rotated.-- -- David Fox <dsf@seereason.com>  Sun, 30 Mar 2014 13:05:48 -0700--haskell-cabal-debian (4.3.2) unstable; urgency=low--  * Speed up debianization by computing the ghc version once when-    we enter the DebT monad rather than repeatedly.  It is slow-    because it needs to chroot.-- -- David Fox <dsf@seereason.com>  Fri, 28 Mar 2014 13:03:57 -0700--haskell-cabal-debian (4.3.1) unstable; urgency=low--  * Safer default value for buildEnv - "/" instead of "".  This is-    where we look for the GHC version number.-- -- David Fox <dsf@seereason.com>  Thu, 27 Mar 2014 06:12:28 -0700--haskell-cabal-debian (4.3) unstable; urgency=low--  * Make the default value for buildEnv "/", this makes it normally look-    at the version number of the ghc compiler installed in the root-    environment.-- -- David Fox <dsf@seereason.com>  Mon, 24 Mar 2014 06:01:49 -0700--haskell-cabal-debian (4.2) unstable; urgency=low--  * Get the GHC compiler version from the build environment, which-    now needs to be explicitly set.-- -- David Fox <dsf@seereason.com>  Fri, 07 Mar 2014 10:58:37 -0800--haskell-cabal-debian (4.1.1) unstable; urgency=low--  * Remove build dependency on ansi-wl-pprint.-  * Split module Debian.Debianize.BuildDependencies out of-    Debian.Debianize.Finalize-- -- David Fox <dsf@seereason.com>  Sun, 02 Feb 2014 07:37:03 -0800--haskell-cabal-debian (4.0.6) unstable; urgency=low--  * Ifdef out duplicate instances for Cabal-1.18.0 - thanks to Tom Nielsen.-- -- David Fox <dsf@seereason.com>  Tue, 28 Jan 2014 17:10:48 -0800--haskell-cabal-debian (4.0.5) unstable; urgency=low--  * Changes for debian-3.81 - use the pretty printer in Debian.Pretty-    instead of ansi-wl-pprint.-- -- David Fox <dsf@seereason.com>  Tue, 14 Jan 2014 05:02:59 -0800--haskell-cabal-debian (4.0.4) unstable; urgency=low--  * Restore the test data, the problem I had with long filenames-    is solved by using cabal sdist to create the tarball rather-    than runhaskell Setup sdist.-- -- David Fox <dsf@seereason.com>  Wed, 18 Dec 2013 09:37:34 -0800--haskell-cabal-debian (4.0.3) unstable; urgency=low--  * Include the build dependencies of the executables in the debian-    source deb build dependencies.-- -- David Fox <dsf@seereason.com>  Tue, 10 Dec 2013 14:37:20 -0800--haskell-cabal-debian (4.0.2) unstable; urgency=low--  * Export some lens state operators from Prelude.-- -- David Fox <dsf@seereason.com>  Tue, 10 Dec 2013 05:38:00 -0800--haskell-cabal-debian (4.0.1) unstable; urgency=low--  * Make sure the utilities package gets created even if no name-    has been specified for it - use the name generated in DebianNames.hs.-- -- David Fox <dsf@seereason.com>  Tue, 10 Dec 2013 05:10:11 -0800--haskell-cabal-debian (4.0.0) unstable; urgency=low--  * Massive lens overhaul-- -- David Fox <dsf@seereason.com>  Thu, 05 Dec 2013 12:26:31 -0800--haskell-cabal-debian (3.10.3) unstable; urgency=low--  * Go back to using lens interface directly-  * Collect debianization fact code in Facts/-- -- David Fox <dsf@seereason.com>  Sun, 24 Nov 2013 10:40:02 -0800--haskell-cabal-debian (3.10.2) unstable; urgency=low--  * Make some signatures in Monad.hs clearer-- -- David Fox <dsf@seereason.com>  Wed, 20 Nov 2013 14:26:28 -0800--haskell-cabal-debian (3.10.1) unstable; urgency=low--  * More API changes - want need to get all the clients in sync before-    proceeding.-- -- David Fox <dsf@seereason.com>  Tue, 19 Nov 2013 11:31:16 -0800--haskell-cabal-debian (3.10) unstable; urgency=low--  * Add a monadic interface-- -- David Fox <dsf@seereason.com>  Sat, 16 Nov 2013 10:42:02 -0800--haskell-cabal-debian (3.9) unstable; urgency=low--  * Clean up documentation-  * Allow more than one utility package name, each of which will-    get copies of the data-files and leftover executables.-  * Make the --debianize option a no-op, the behavior is now the-    default.-  * Update the unit tests and build an executable to run them.-  * Copy debian/changelog to top directory at beginning of build-    so hackage will see it.-- -- David Fox <dsf@seereason.com>  Tue, 05 Nov 2013 11:34:48 -0800--haskell-cabal-debian (3.8.3) unstable; urgency=low--  * Add an ifdef for compatibility with GHC-7.4.1.-- -- David Fox <dsf@seereason.com>  Sun, 20 Oct 2013 15:50:47 -0700--haskell-cabal-debian (3.8.2) unstable; urgency=low--  * Actually, copy changelog from debian/changelog before-    building sdist tarball.-- -- David Fox <dsf@seereason.com>  Tue, 15 Oct 2013 06:42:39 -0700--haskell-cabal-debian (3.8.1) unstable; urgency=low--  * Move changelog top top directory so hackage will see it.-- -- David Fox <dsf@seereason.com>  Tue, 15 Oct 2013 06:24:25 -0700--haskell-cabal-debian (3.8) unstable; urgency=low--  * Downcase the package name to build the datadir name in /usr/share,-    this matches the paths in dist/autogen/Paths_packagename.-- -- David Fox <dsf@seereason.com>  Mon, 14 Oct 2013 20:48:39 -0700--haskell-cabal-debian (3.7) unstable; urgency=low--  * Change path to hackage tarball in watch file for hackage2.-- -- David Fox <dsf@seereason.com>  Fri, 04 Oct 2013 09:22:51 -0700--haskell-cabal-debian (3.6) unstable; urgency=low--  * Require haskell-devscripts >= 0.8.19.  This version changes the-    value of datasubdir from /usr/share/packagename-packageversion to-    simply /usr/share/packagename.  This could break some packaging.-- -- David Fox <dsf@seereason.com>  Fri, 06 Sep 2013 16:48:18 -0700--haskell-cabal-debian (3.5) unstable; urgency=low--  * Allow full lists of debian relations to be passed to the --build-dep-    argument, not just a single package name.-- -- David Fox <dsf@seereason.com>  Sun, 01 Sep 2013 07:08:37 -0700--haskell-cabal-debian (3.4.3) unstable; urgency=low--  * Fix the repository location in the cabal file.-- -- David Fox <dsf@seereason.com>  Sat, 31 Aug 2013 07:57:15 -0700--haskell-cabal-debian (3.4.2) unstable; urgency=low--  * Notify user when debhelper isn't installed.-  * Avoid use of partial function read-- -- David Fox <dsf@seereason.com>  Mon, 24 Jun 2013 13:51:51 -0700--haskell-cabal-debian (3.4.1) unstable; urgency=low--  * Remove call to test script in Setup.hs-  * Remove unused dependencies-- -- David Fox <dsf@seereason.com>  Mon, 10 Jun 2013 09:12:38 -0700--haskell-cabal-debian (3.4) unstable; urgency=low--  * Add support for modifying the Provides and Replaces fields.-- -- David Fox <dsf@seereason.com>  Sun, 09 Jun 2013 14:18:39 -0700--haskell-cabal-debian (3.3.2) unstable; urgency=low--  * Changes for debian-3.71-- -- David Fox <dsf@seereason.com>  Sun, 14 Apr 2013 13:32:04 -0700--haskell-cabal-debian (3.3.1) unstable; urgency=low--  * Don't fail during dry run if the existing debianization has no-    copyright file.-- -- David Fox <dsf@seereason.com>  Wed, 13 Mar 2013 10:00:25 -0700--haskell-cabal-debian (3.3) unstable; urgency=low--  * Add Debian.Debianize.Details, with default Atoms values for Debian and-    SeeReason.-- -- David Fox <dsf@seereason.com>  Mon, 11 Mar 2013 11:44:10 -0700--haskell-cabal-debian (3.2.5) unstable; urgency=low--  * Add move the VersionSplits type into a module, and fix the code that-    splits the mapping of cabal to debian names over a version range.-- -- David Fox <dsf@seereason.com>  Tue, 05 Mar 2013 05:17:03 -0800--haskell-cabal-debian (3.2.4) unstable; urgency=low--  * Fix long standing bug in Debian.Debianize.Interspersed.foldTriples.-- -- David Fox <dsf@seereason.com>  Sun, 03 Mar 2013 09:45:14 -0800--haskell-cabal-debian (3.2.3) unstable; urgency=low--  * Clean up mapping from cabal names to debian names.-- -- David Fox <dsf@seereason.com>  Sat, 02 Mar 2013 07:36:16 -0800--haskell-cabal-debian (3.2.2) unstable; urgency=low--  * Remove unused Debian.Debianize.Generic and Triplets modules.-- -- David Fox <dsf@seereason.com>  Fri, 01 Mar 2013 11:14:33 -0800--haskell-cabal-debian (3.2.1) unstable; urgency=low--  * Do not add the options +RTS -IO -RTS to the server options, this-    is a security risk.  Instead, server executables should built with-    -with-rtsopts=-IO.-- -- David Fox <dsf@seereason.com>  Thu, 28 Feb 2013 09:02:39 -0800--haskell-cabal-debian (3.2) unstable; urgency=low--  * Strip executables when installing (well, at least some.  There-    may be more work to do here.)-  * Change the build dependency type from BinPkgName to Relation, so we-    can specify version dependencies (though as yet not or relations.)-- -- David Fox <dsf@seereason.com>  Tue, 26 Feb 2013 07:17:30 -0800--haskell-cabal-debian (3.1.1) unstable; urgency=low--  * Fix the code in the init file that checks for and sources a-    file in /etc/default.-- -- David Fox <dsf@seereason.com>  Mon, 25 Feb 2013 14:46:02 -0800--haskell-cabal-debian (3.1) unstable; urgency=low--  * Create a Top type to represent the top directory of a debianization-  * Change the signature of Debian.Debianize.debianization so it notices-    command line arguments and environment arguments.-- -- David Fox <dsf@seereason.com>  Fri, 22 Feb 2013 13:28:30 -0800--haskell-cabal-debian (3.0.7) unstable; urgency=low--  * Fix to copyright/license code-  * have the init script load /etc/default/packagename if available-  * Add an alternative function to showCommandForUser (called showCommand)-    that uses double quotes instead of single quotes so you can reference-    shell variables.-- -- David Fox <dsf@seereason.com>  Wed, 20 Feb 2013 09:29:11 -0800--haskell-cabal-debian (3.0.6) unstable; urgency=low--  * When packaging a web site or server, don't add code to the postinst-    to start a server, it gets generated by debhelper.-  * Add the changelog and the Debianize.hs file to extra-source-files.-  * Add HTTP=1 to the list of known epoch mappings.-- -- David Fox <dsf@seereason.com>  Thu, 14 Feb 2013 14:41:17 -0800--haskell-cabal-debian (3.0.5) unstable; urgency=low--  * Compatibility with ghc-7.4-- -- David Fox <dsf@seereason.com>  Wed, 13 Feb 2013 10:48:19 -0800--haskell-cabal-debian (3.0.4) unstable; urgency=low--  * Add dependency on debian-policy, so we can compute the latest-    standards-version.-  * Documentation improvements-  * Test case improvements-  * Error message improvements-- -- David Fox <dsf@seereason.com>  Sun, 10 Feb 2013 11:03:55 -0800--haskell-cabal-debian (3.0.3) unstable; urgency=low--  * Due to a typo, the noDocumentationLibrary lens was turning off-    profiling rather than documentation.-- -- David Fox <dsf@seereason.com>  Fri, 08 Feb 2013 17:14:09 -0800--haskell-cabal-debian (3.0.2) unstable; urgency=low--  * Fix argument and exception handling in cabal-debian-  * Make Standards-Version field non-mandatory-  * Make sure every binary deb paragraph has a non-empty description-- -- David Fox <dsf@seereason.com>  Thu, 07 Feb 2013 10:03:25 -0800--haskell-cabal-debian (3.0.1) unstable; urgency=low--  * Don't build Debian version numbers with revision (Just "").-  * Output the descriptions of the binary packages.-- -- David Fox <dsf@seereason.com>  Tue, 05 Feb 2013 14:48:33 -0800--haskell-cabal-debian (3.0) unstable; urgency=low--  * Moved the Distribution.Debian modules to Debian.Cabal and-    Debian.Debianize.-  * Refactored the debianize function for easier testing-  * Added test cases.-  * Add a Debianization type that intends to fully describe a debian-    package, with functions to read, build, modify, and write a-    Debianization.-- -- David Fox <dsf@seereason.com>  Wed, 26 Dec 2012 05:45:35 -0800--haskell-cabal-debian (2.6.3) unstable; urgency=low--  * Fix pretty printing of Relations (i.e. dependency lists.)  There-    is an instance for printing lists in ansi-wl-pprint which prevents-    us from writing customized Pretty instances for type aliases like-    Relations, AndRelation, and OrRelation.-- -- David Fox <dsf@seereason.com>  Fri, 04 Jan 2013 09:30:48 -0800--haskell-cabal-debian (2.6.2) unstable; urgency=low--  * Fix a bug constructing the destination pathnames that was dropping-    files that were supposed to be installed into packages.-- -- David Fox <dsf@seereason.com>  Thu, 20 Dec 2012 06:49:25 -0800--haskell-cabal-debian (2.6.1) unstable; urgency=low--  * Remove the modifyAtoms field from the Flags record, we want to-    be able to create instances like Read and Show for this type.-    The modifyAtoms function is now passed separately to debianize.-  * The flags field of Server was renamed serverFlags because the-    newly exported Config record has a flags field.-- -- David Fox <dsf@seereason.com>  Wed, 19 Dec 2012 09:45:22 -0800--haskell-cabal-debian (2.5.10) unstable; urgency=low--  * Filter cabal self dependencies out before generating-    Build-Depends-Indep, just as we added code to filter them out-    of Build-Depends in version 2.5.7.-- -- David Fox <dsf@seereason.com>  Tue, 18 Dec 2012 13:23:39 -0800--haskell-cabal-debian (2.5.9) unstable; urgency=low--  * Always add +RTS -IO -RTS to server flags.-- -- David Fox <dsf@seereason.com>  Sun, 16 Dec 2012 10:40:52 -0800--haskell-cabal-debian (2.5.8) unstable; urgency=low--  * Add a builtin list for ghc-7.6.1.-- -- David Fox <dsf@seereason.com>  Sat, 15 Dec 2012 07:04:49 -0800--haskell-cabal-debian (2.5.7) unstable; urgency=low--  * Filter out cabal self-dependencies before building the debian-    dependencies.  In cabal a self dependency means you need the library-    to build an executable, while in debian it means you need an older-    version installed to build the current version.-- -- David Fox <dsf@seereason.com>  Thu, 29 Nov 2012 08:42:30 -0800--haskell-cabal-debian (2.5.6) unstable; urgency=low--  * Don't add --base-uri and --http-port arguments automatically, they can be-    computed by calling the oldClckwrksFlags function and adding the value to-    the flags field.  Clckwrks-0.3 no longer needs the --base-uri argument.-- -- David Fox <dsf@seereason.com>  Tue, 27 Nov 2012 13:34:31 -0800--haskell-cabal-debian (2.5.5) unstable; urgency=low--  * Have the debianize function return False if there is no debian/Debianize.hs file,-    but throw an exception if running it failed, so we notice bad debianization code.-- -- David Fox <dsf@seereason.com>  Tue, 27 Nov 2012 07:34:51 -0800--haskell-cabal-debian (2.5.4) unstable; urgency=low--  * Insert "SetEnv proxy-sendcl 1" line into Apache config.-- -- David Fox <dsf@seereason.com>  Tue, 20 Nov 2012 13:43:54 -0800--haskell-cabal-debian (2.5.3) unstable; urgency=low--  * Remove extra copy of binary from the executable debs-  * Add a sourcePackageName field to Flags, and a --source-package-name-    command line option.-- -- David Fox <dsf@seereason.com>  Sat, 17 Nov 2012 00:16:21 -0800--haskell-cabal-debian (2.5.2) unstable; urgency=low--  * Fix the path to where the DHInstallTo and DHInstallCabalExecTo-    DebAtoms put their files.-- -- David Fox <dsf@seereason.com>  Fri, 16 Nov 2012 18:11:45 -0800--haskell-cabal-debian (2.5.1) unstable; urgency=low--  * Add a destName field to Executable so we can give installed-    executables a different name than they had in the build.-- -- David Fox <dsf@seereason.com>  Fri, 16 Nov 2012 15:37:16 -0800--haskell-cabal-debian (2.5) unstable; urgency=low--  * Add a debName field to the Executable record, before the deb-    package name had to equal the executable name.-- -- David Fox <dsf@seereason.com>  Fri, 16 Nov 2012 12:32:39 -0800--haskell-cabal-debian (2.4.2) unstable; urgency=low--  * Move location of cabal install files from dist/build/install to-    debian/cabalInstall, the dist directory was getting wiped at bad-    moments.-  * Split the autobuilder function autobuilderDebianize into two-    new functions in cabal-debian: runDebianize and callDebianize.-  * Custom debianization code now goes in debian/Debianize.hs rather than-    in setup, so we can distinguish it failing from it not existing more-    easily.-- -- David Fox <dsf@seereason.com>  Thu, 15 Nov 2012 11:00:08 -0800--haskell-cabal-debian (2.4.1) unstable; urgency=low--  * We need to verify that debian/compat was created after running the-    debianize function, because ghc still exits with ExitSuccess-- -- David Fox <dsf@seereason.com>  Thu, 15 Nov 2012 06:34:02 -0800--haskell-cabal-debian (2.4.0) unstable; urgency=low--  * You can run a function in Setup.hs other than main using ghc -e, so we-    will use this trick to run the debianize function directly rather than-    running main.-  * Eliminate the autobuilderDebianize function.-- -- David Fox <dsf@seereason.com>  Thu, 15 Nov 2012 04:05:49 -0800--haskell-cabal-debian (2.3.4) unstable; urgency=low--  * Fix the builddir used when running the cabal-debian standalone-    executable - it was dist-cabal/build, so the resulting debianization-    had files in places where cabal didn't expect them.-- -- David Fox <dsf@seereason.com>  Tue, 13 Nov 2012 06:20:51 -0800--haskell-cabal-debian (2.3.3) unstable; urgency=low--  * Eliminate class MonadBuild and the BuildT monad.-- -- David Fox <dsf@seereason.com>  Sun, 11 Nov 2012 17:46:31 -0800--haskell-cabal-debian (2.3.2) unstable; urgency=low--  * Fix exception that was keeping changelogs from being preserved.-- -- David Fox <dsf@seereason.com>  Sat, 10 Nov 2012 10:07:50 -0800--haskell-cabal-debian (2.3.1) unstable; urgency=low--  * Fix the extension of the debhelper links files-  * Add a general mechanism for installing a file into a deb when-    we have the file's text in a String (rather than in a file.)-- -- David Fox <dsf@seereason.com>  Sat, 10 Nov 2012 07:35:09 -0800--haskell-cabal-debian (2.3) unstable; urgency=low--  * Add MonadBuild.-- -- David Fox <dsf@seereason.com>  Fri, 09 Nov 2012 12:21:14 -0800--haskell-cabal-debian (2.2.1) unstable; urgency=low--  * Add a modifyAtoms function to Flags that is applied to final list of-    DebAtom before writing the debianization.-  * Add DHApacheSite and DHInstallCabalExec atoms so atoms don't depend on-    the build directory-  * Add #DEBHELPER# and exit 0 to default web server postinst.-- -- David Fox <dsf@seereason.com>  Fri, 09 Nov 2012 10:25:32 -0800--haskell-cabal-debian (2.2.0) unstable; urgency=low--  * Append a trailing slash to the --base-uri argument passed to the-    server.  This is required by Web.Routes.Site.runSite.-- -- David Fox <dsf@seereason.com>  Thu, 08 Nov 2012 04:40:08 -0800--haskell-cabal-debian (2.1.4) unstable; urgency=low--  * Merge the Executable and Script constructors of the Executable type-  * Add a destDir field to Executable to specify the destination.-- -- David Fox <dsf@seereason.com>  Tue, 06 Nov 2012 13:24:25 -0800--haskell-cabal-debian (2.1.3) unstable; urgency=low--  * Don't append a slash to the base-uri.-  * Construct the name of the data directory in /usr/share from the cabal-    package name rather than the debian source package name.-  * Add a --self-depend flag to include a build dependency on this library-    in all generated debianizations.-- -- David Fox <dsf@seereason.com>  Tue, 06 Nov 2012 07:07:57 -0800--haskell-cabal-debian (2.1.2) unstable; urgency=low--  * Output the server support files.-- -- David Fox <dsf@seereason.com>  Tue, 06 Nov 2012 06:37:18 -0800--haskell-cabal-debian (2.1.1) unstable; urgency=low--  * Restore code that checks for version number match when validating-    a debianization.  The autobuilder can now pass the version number-    to cabal-debian, so it should match.-- -- David Fox <dsf@seereason.com>  Mon, 05 Nov 2012 17:42:32 -0800--haskell-cabal-debian (2.1.0) unstable; urgency=low--  * Enable processing of Script, Server and WebSite executables.-- -- David Fox <dsf@seereason.com>  Mon, 05 Nov 2012 12:45:42 -0800--haskell-cabal-debian (2.0.9) unstable; urgency=low--  * Add a Library section, export all the modules.-- -- David Fox <dsf@seereason.com>  Mon, 05 Nov 2012 06:41:25 -0800--haskell-cabal-debian (2.0.8) unstable; urgency=low--  * Bypass abandoned versions.-- -- David Fox <dsf@seereason.com>  Sat, 03 Nov 2012 06:13:27 -0700--haskell-cabal-debian (1.26) unstable; urgency=low--  * Don't try to update the existing debianization, except for the-    changelog where we retain entries that look older than the one-    we generate.-  * Use .install files instead of adding rules to debian/rules-  * Add --depends and --conflicts options-- -- David Fox <dsf@seereason.com>  Thu, 25 Oct 2012 12:03:49 -0700--haskell-cabal-debian (1.25) unstable; urgency=low--  * If the --disable-haddock flag is given omit the doc package from the-    control file.-  * The tarball that was uploaded to Hackage as version 1.24 had a (buggy)-    change which was not pushed to darcs.  This resolves that confusion.-- -- David Fox <dsf@seereason.com>  Sat, 16 Jun 2012 14:42:12 -0700--haskell-cabal-debian (1.24) unstable; urgency=low--  * No wonder it doesn't build on hackage - none of the source-    modules were shipped.-- -- David Fox <dsf@seereason.com>  Thu, 14 Jun 2012 08:19:19 -0700--haskell-cabal-debian (1.23) unstable; urgency=low--  * Add a --quilt option to switch from native to quilt format.-    Without this option the file debian/source/format will contain-    '3.0 (native)', with it '3.0 (quilt)'.-- -- David Fox <dsf@seereason.com>  Fri, 01 Jun 2012 05:53:36 -0700--haskell-cabal-debian (1.22) unstable; urgency=low--  * Bump version to make sure all changes are uploaded.-- -- David Fox <dsf@seereason.com>  Wed, 23 May 2012 19:54:17 -0700--haskell-cabal-debian (1.21) unstable; urgency=low--  * fix conversion of wildcards into intersected ranges-- -- David Fox <dsf@seereason.com>  Wed, 23 May 2012 19:51:34 -0700--haskell-cabal-debian (1.20) unstable; urgency=low--  * Fix generation of debian library dependencies from the Extra-Libraries-    field of the cabal file.-- -- David Fox <dsf@seereason.com>  Wed, 23 May 2012 19:50:39 -0700--haskell-cabal-debian (1.19) unstable; urgency=low--  * Handle cabal equals dependencies.-- -- David Fox <dsf@seereason.com>  Tue, 20 Mar 2012 14:34:58 -0700--haskell-cabal-debian (1.18) unstable; urgency=low--  * High level of confidence this time.  Interesting new Interspersed-    class, and an implementation of invertVersionRanges which should be-    forwarded to the Cabal folks.-  * Removes dependency on logic-classes-- -- David Fox <dsf@seereason.com>  Tue, 20 Mar 2012 08:17:25 -0700--haskell-cabal-debian (1.17) unstable; urgency=low--  * Restore code to downcase cabal package name before using it as the-    base of the debian package name.-- -- David Fox <dsf@seereason.com>  Sun, 18 Mar 2012 15:32:04 -0700--haskell-cabal-debian (1.16) unstable; urgency=low--  * Remove code that implements a special case for the debian name of the-    haskell-src-exts package.-- -- David Fox <dsf@seereason.com>  Sun, 18 Mar 2012 14:11:21 -0700--haskell-cabal-debian (1.15) unstable; urgency=low--  * Yet another stab at fixing the code for converting cabal dependencies-    to debian dependencies, with support for splitting version ranges of-    cabal files among different debian packages.-- -- David Fox <dsf@seereason.com>  Fri, 16 Mar 2012 17:59:28 -0700--haskell-cabal-debian (1.14) unstable; urgency=low--  * Don't try to strip data files-  * Use permissions 644 for data files, not 755.-- -- David Fox <dsf@seereason.com>  Wed, 07 Mar 2012 14:46:04 -0800--haskell-cabal-debian (1.13) unstable; urgency=low--  * Append the version number when constructing the directory for data-    files.-- -- David Fox <dsf@seereason.com>  Wed, 07 Mar 2012 08:56:39 -0800--haskell-cabal-debian (1.12) unstable; urgency=low--  * Include any files listed in the Data-Files field of the cabal file-    in the utils package.-- -- David Fox <dsf@seereason.com>  Tue, 06 Mar 2012 11:31:47 -0800--haskell-cabal-debian (1.11) unstable; urgency=low--  * Replace --epoch flag with --epoch-map, so we can specify epoch numbers-    for both the package being built and for dependency packages.-- -- David Fox <dsf@seereason.com>  Thu, 09 Feb 2012 07:01:19 -0800--haskell-cabal-debian (1.10) unstable; urgency=low--  * Add bundled package list for ghc 7.4.1.-- -- David Fox <dsf@seereason.com>  Sat, 04 Feb 2012 14:44:33 -0800--haskell-cabal-debian (1.9) unstable; urgency=low--  * Add --dep-map flag to allow mapping of cabal package names to the base-    of a debian package name.  This modifies the name to which the prefix-    "lib" and the suffix "-dev" are added.-  * Fix dependency generation bug introduced in 1.8.-- -- David Fox <dsf@seereason.com>  Mon, 23 Jan 2012 14:13:05 -0800--haskell-cabal-debian (1.8) unstable; urgency=low--  * Add a --dev-dep flag to make one or more packages install dependencies-    of the dev package.-- -- David Fox <dsf@seereason.com>  Mon, 23 Jan 2012 05:00:46 -0800--haskell-cabal-debian (1.7) unstable; urgency=low--  * Add info about ghc 7.4.0 pre-release.-- -- David Fox <dsf@seereason.com>  Wed, 11 Jan 2012 09:57:45 -0800--haskell-cabal-debian (1.6) unstable; urgency=low--  * Don't omit dependencies built into ghc, they should be satisfied by-    the Provides in the compiler if they are not available in the-    repository.  However, we do need to make ghc an alterantive to any-    versioned dependencies that are bundled with the compiler, since the-    built in dependencies are virtual packages and thus unversioned.-- -- David Fox <dsf@seereason.com>  Wed, 07 Dec 2011 06:10:17 -0800--haskell-cabal-debian (1.5) unstable; urgency=low--  * Fix the generation of build dependency version ranges by using an-    intermediate version range type.-  * If the version range for the cabal file touches two different debian-    package, don't try to write build dependencies that allow either one,-    it can't really be done.  Just give the allowable versions of the-    newer package (e.g. libghc-parsec3-dev rather than libghc-parsec2-dev.)-- -- David Fox <dsf@seereason.com>  Sun, 04 Dec 2011 05:59:25 -0800--haskell-cabal-debian (1.4) unstable; urgency=low--  * Add a --revision <suffix> flag which appends a (perhaps empty) string-    cabal version number to get the debian version number.  Without this-    flag the string "-1~hackage1" is appended.-  * Make it an error to specify a debian version via --deb-version that is-    older than the current cabal version.-- -- David Fox <dsf@seereason.com>  Sun, 20 Nov 2011 06:45:33 -0800--haskell-cabal-debian (1.3) unstable; urgency=low--  * Fix error message when compiler version is not in bundled package list.-  * Add bundled package list for compiler 7.0.4 (same as 7.0.3.)-- -- David Fox <dsf@seereason.com>  Sat, 08 Oct 2011 07:58:19 -0700--haskell-cabal-debian (1.2) unstable; urgency=low--  * When computing the debian name from a package's cabal name, if we-    have no particular version number we are comparing to, use the name-    from the version split that corresponds to newer version numbers.-  * Add code to make the cabal package haskell-src-exts map to the debian-    packages libghc-src-exts-dev etc.  Normally it would map to-    libghc-haskell-src-exts-dev.-- -- David Fox <dsf@seereason.com>  Thu, 06 Oct 2011 09:27:02 -0700--haskell-cabal-debian (1.1) unstable; urgency=low--  * Use propositional logic package to compute normal form for dependencies-  * Make sure to correct format of cabal package synopsis before using as debian-    package description.-- -- David Fox <dsf@seereason.com>  Fri, 30 Sep 2011 06:16:34 -0700--haskell-cabal-debian (1.0) unstable; urgency=low--  * Debianization generated by cabal-debian-- -- David Fox <dsf@seereason.com>  Sun, 18 Sep 2011 06:40:21 -0700
− debian-haskell/Debian/Apt/Dependencies.hs
@@ -1,285 +0,0 @@-{-# LANGUAGE ScopedTypeVariables #-}-{-# OPTIONS -fno-warn-missing-signatures #-}-module Debian.Apt.Dependencies-{--    ( solve-    , State-    , binaryDepends-    , search-    , bj'-    , bt-    , CSP(..)-    ) -} where---- test gutsyPackages "libc6" (\csp -> bt csp)--import Control.Arrow (second)-import qualified Data.ByteString.Char8 as C-import Data.List as List (find, union)-import Data.Tree (Tree(rootLabel, Node))-import Debian.Apt.Package (PackageNameMap, packageNameMap, lookupPackageByRel)-import Debian.Control.ByteString (ControlFunctions(stripWS, lookupP, parseControlFromFile),-                                  Field'(Field, Comment), Control'(Control), Paragraph, Control)-import Debian.Relation (BinPkgName(..))-import Debian.Relation.ByteString (ParseRelations(..), Relation(..), OrRelation, AndRelation, Relations, checkVersionReq)-import Debian.Version (DebianVersion, parseDebianVersion, prettyDebianVersion)-import Debian.Version.ByteString ()-import Text.PrettyPrint (render)---- * Basic CSP Types and Functions--data Status-    = Remaining AndRelation-    | MissingDep Relation-    | Complete-      deriving (Eq)--type State a = (Status, [a])--complete :: State a -> Bool-complete (Complete, _) = True-complete _ = False--data CSP a-    = CSP { pnm :: PackageNameMap a-          , relations :: Relations-          , depFunction :: (a -> Relations)-          , conflicts :: a -> Relations-          , packageVersion :: a -> (BinPkgName, DebianVersion)-          }---- * Test CSP---- |TODO addProvides -- see DQL.Exec-controlCSP :: Control -> Relations -> (Paragraph -> Relations) -> CSP Paragraph-controlCSP (Control paragraphs) rels depF' =-    CSP { pnm = packageNameMap getName paragraphs-        , relations = rels-        , depFunction = depF'-        , conflicts = conflicts'-        , packageVersion = packageVersionParagraph-        }-    where-      getName :: Paragraph -> BinPkgName-      getName p = case lookupP "Package" p of-                    Nothing -> error "Missing Package field"-                    Just (Field (_,n)) -> BinPkgName (C.unpack (stripWS n))-                    Just (Comment _) -> error "controlCSP"-      conflicts' :: Paragraph -> Relations-      conflicts' p =-          case lookupP "Conflicts" p of-            Nothing -> []-            Just (Field (_, c)) -> either (error . show) id (parseRelations c)-            Just (Comment _) -> error "controlCSP"--testCSP :: FilePath -> (Paragraph -> Relations) -> String -> (CSP Paragraph -> IO a) -> IO a-testCSP controlFile depf relationStr cspf =-    do c' <- parseControlFromFile controlFile-       case c' of-         Left e -> error (show e)-         Right control@(Control _) ->-             case parseRelations relationStr of-               Left e -> error (show e)-               Right r ->-                     cspf (controlCSP control r depf)--depF :: Paragraph -> Relations-depF p =-    let preDepends =-            case lookupP "Pre-Depends" p of-              Nothing -> []-              Just (Field (_,pd)) ->-                  either (error . show) id (parseRelations pd)-              Just (Comment _) -> error "depF"-        depends =-            case lookupP "Depends" p of-              Nothing -> []-              Just (Field (_,pd)) ->-                  either (error . show) id (parseRelations pd)-              Just (Comment _) -> error "depF"-    in-      preDepends ++ depends--sidPackages = "/var/lib/apt/lists/ftp.debian.org_debian_dists_unstable_main_binary-i386_Packages"-gutsyPackages = "/var/lib/apt/lists/mirror.anl.gov_pub_ubuntu_dists_gutsy_main_binary-i386_Packages"--test controlFP rel labeler =-    testCSP controlFP depF rel (mapM_ (\ (_,p) -> mapM_ (print . second (render . prettyDebianVersion) . packageVersionParagraph) p ) . take 1 . search labeler)---- TODO: add better errors-packageVersionParagraph :: Paragraph -> (BinPkgName, DebianVersion)-packageVersionParagraph p =-    case lookupP "Package" p of-      Nothing -> error $ "Paragraph missing Package field"-      (Just (Field (_, name))) ->-          case lookupP "Version" p of-            Nothing -> error $ "Paragraph missing Version field"-            (Just (Field (_, str))) ->-                case parseDebianVersion str of-                  Right ver -> (BinPkgName (C.unpack (stripWS name)), ver)-                  Left e -> error $ "packageVersionParagraph: " ++ show e-            (Just (Comment _)) -> error "packageVersionParagraph"-      (Just (Comment _)) -> error "packageVersionParagraph"----conflict :: CSP p -> p -> p -> Bool-conflict csp p1 p2 =-    let (name1, version1) = (packageVersion csp) p1-        (name2, version2) = (packageVersion csp) p2-    in-      if name1 == name2-      then version1 /= version2-      else-        any (conflict' (name1, version1)) (concat $ (conflicts csp) p2) ||-        any (conflict' (name2, version2)) (concat $ (conflicts csp) p1)---- |JAS: deal with 'Provides' (can a package provide more than one package?)-conflict' :: (BinPkgName, DebianVersion) -> Relation -> Bool-conflict' (pName, pVersion) (Rel pkgName mVersionReq _) =-    (pName == pkgName) && (checkVersionReq mVersionReq (Just pVersion))------ * Tree Helper Functions--mkTree :: a -> [Tree a] -> Tree a-mkTree = Node--label :: Tree a -> a-label = rootLabel--initTree :: (a -> [a]) -> a -> Tree a-initTree f a = Node a (map (initTree f) (f a))--mapTree :: (a -> b) -> Tree a -> Tree b-mapTree = fmap--foldTree :: (a -> [b] -> b) -> Tree a -> b-foldTree f (Node a ts) = f a (map (foldTree f) ts)--zipTreesWith :: (a -> b -> c) -> Tree a -> Tree b -> Tree c-zipTreesWith f (Node a ts) (Node b us) =-    Node (f a b) (zipWith (zipTreesWith f) ts us)--prune :: (a -> Bool) -> Tree a -> Tree a-prune p = foldTree f-    where f a ts = Node a (filter (not . p . label) ts)--leaves :: Tree a -> [a]-leaves = foldTree f-    where f leaf [] = [leaf]-          f _ ts = concat ts--inhTree :: (b -> a -> b) -> b -> Tree a -> Tree b-inhTree f b (Node a ts) = Node b' (map (inhTree f b') ts)-    where b' = f b a--distrTree :: (a -> [b]) -> b -> Tree a -> Tree b-distrTree  f b (Node a ts) = Node b (zipWith (distrTree f) (f a) ts)---- * mkSearchTree---- TODO: might want to leave markers about what relation we are satisfying?-mkSearchTree :: forall a. CSP a -> Tree (State a)-mkSearchTree csp =-    Node (Remaining (relations csp),[]) (andRelation ([],[]) (relations csp))-    where-      andRelation :: ([a],AndRelation) -> AndRelation -> [Tree (State a)]-      andRelation (candidates,[]) [] = [Node (Complete, candidates) []]-      andRelation (candidates,remaining) [] = andRelation (candidates, []) remaining-      andRelation (candidates, remaining) (x:xs) =-          orRelation (candidates, xs ++ remaining) x-      orRelation :: ([a],AndRelation) -> OrRelation -> [Tree (State a)]-      orRelation acc x =-          concat (fmap (relation acc) x)-      relation :: ([a],AndRelation) -> Relation -> [Tree (State a)]-      relation acc@(candidates,_) rel =-          let packages = lookupPackageByRel (pnm csp) (packageVersion csp) rel in-          case packages of-            [] -> [Node (MissingDep rel, candidates) []]-            _ -> map (package acc) packages-      package :: ([a],AndRelation) -> a -> Tree (State a)-      package (candidates, remaining) p =-          if ((packageVersion csp) p) `elem` (map (packageVersion csp) candidates)-          then if null remaining-               then Node (Complete, candidates) []-               else Node (Remaining remaining, candidates) (andRelation (candidates, []) remaining)-          else Node (Remaining remaining, (p : candidates)) (andRelation ((p : candidates), remaining) ((depFunction csp) p))----- |earliestInconsistency does what it sounds like--- the 'reverse as' is because the vars are order high to low, but we--- want to find the lowest numbered (aka, eariest) inconsistency ??----earliestInconsistency :: CSP a -> State a -> Maybe ((BinPkgName, DebianVersion), (BinPkgName, DebianVersion))-earliestInconsistency _ (_,[]) = Nothing-earliestInconsistency _ (_,[_p]) = Nothing-earliestInconsistency csp (_,(p:ps)) =-    case find ((conflict csp) p) (reverse ps) of-      Nothing -> Nothing-      (Just conflictingPackage) -> Just ((packageVersion csp) p, (packageVersion csp) conflictingPackage)---- * Conflict Set---- | conflicting packages and relations that require non-existant packages-type ConflictSet = ([(BinPkgName, DebianVersion)],[Relation])--isConflict :: ConflictSet -> Bool-isConflict ([],[]) = False-isConflict _ = True--solutions :: Tree (State a, ConflictSet) -> [State a]-solutions = filter complete . map fst . leaves . prune (isConflict . snd)--type Labeler a = CSP a -> Tree (State a) -> Tree (State a, ConflictSet)--search :: Labeler a -> CSP a -> [State a]-search labeler csp = (solutions . (labeler csp) . mkSearchTree) csp---- * Backtracking Labeler--bt :: Labeler a-bt csp = mapTree f-    where-      f s@(status,_) =-              case status of-                (MissingDep rel) -> (s, ([], [rel]))-                _ ->-                    (s,-                      case (earliestInconsistency csp) s of-                        Nothing -> ([],[])-                        Just (a,b) -> ([a,b], []))---- * BackJumping Solver--{-|bj - backjumping labeler--If the node already has a conflict set, then leave it alone.--Otherwise, the conflictset for the node is the combination of the-conflict sets of its direct children.--}-bj :: CSP p -> Tree (State p, ConflictSet) -> Tree (State p, ConflictSet)-bj csp = foldTree f-    where f (s, cs) ts-            | isConflict cs  = mkTree (s, cs) ts---            | isConflict cs' = mkTree (s, cs') [] -- prevent space leak-            | otherwise = mkTree (s, cs') ts-            where cs' =-                      let set = combine csp (map label ts) [] in-                      set `seq` set -- prevent space leak--unionCS :: [ConflictSet] -> ConflictSet-unionCS css = foldr (\(c1, m1) (c2, m2) -> ((c1 `union` c2), (m1 `union` m2))) ([],[]) css--combine :: CSP p -> [(State p, ConflictSet)] -> [ConflictSet] -> ConflictSet-combine _ [] acc = unionCS acc-combine csp ((s,cs@(c,m)):ns) acc-    | (not (lastvar `elem` c)) && null m = cs-    | null c && null m = ([],[]) -- is this case ever used?-    | otherwise = combine csp ns ((c, m):acc)-    where lastvar =-              let (_,(p:_)) = s in (packageVersion csp) p--
− debian-haskell/Debian/Apt/Index.hs
@@ -1,300 +0,0 @@-{-# LANGUAGE DeriveDataTypeable, FlexibleContexts, OverloadedStrings, ScopedTypeVariables #-}-{-# OPTIONS_GHC -fno-warn-name-shadowing -fno-warn-orphans #-}-module Debian.Apt.Index-    ( update-    , Fetcher-    , CheckSums(..)-    , Compression(..)-    , FileTuple-    , Size-    , controlFromIndex-    , controlFromIndex'-    , findContentsFiles-    , findIndexes-    , indexesInRelease-    , tupleFromFilePath-    ) where--import Control.Monad-import qualified Codec.Compression.GZip as GZip-import qualified Codec.Compression.BZip as BZip-import qualified Data.ByteString.Char8 as B-import qualified Data.ByteString.Lazy.Char8 as L-import qualified Data.Digest.Pure.MD5 as MD5-import Data.Function-import Data.List as List (null, intercalate, sortBy, isSuffixOf, isPrefixOf)-import qualified Data.Map as M-import Data.Monoid ((<>))-import Data.Text as Text (Text, unpack, concat, lines, null, words)-import Data.Time-import Debian.Apt.Methods-import Debian.Control (formatControl)-import Debian.Control.ByteString-import Debian.Control.Common-import Debian.Control.Text (decodeControl)-import Debian.Release-import Debian.Sources-import Debian.URI-import System.Directory-import System.FilePath ((</>))-import System.Posix.Files-import System.FilePath (takeBaseName)---import qualified System.Unix.Misc as Misc-import Text.ParserCombinators.Parsec.Error-import Text.PrettyPrint (render)-import Text.PrettyPrint.HughesPJClass (pPrint)---- |Package indexes on the server are uncompressed or compressed with--- gzip or bzip2. We do not know what will exist on the server until we--- actually look. This type is used to mark the compression status of--- what was actually found.-data Compression-    = BZ2 | GZ | Uncompressed-      deriving (Read, Show, Eq, Ord, Enum, Bounded)--data CheckSums-    = CheckSums { md5sum :: Maybe String-                , sha1   :: Maybe String-                , sha256 :: Maybe String-                }-      deriving (Read, Show, Eq)---- |function-type for a function that downloads a file--- The timestamp is optional. If the local file is as new or newer--- than the remote copy, the download may be skipped.------ A good choice might be a partially parameterized call to--- 'Debian.Apt.Methods.fetch'-type Fetcher =-    URI ->              -- remote URI-    FilePath ->         -- local file name-    Maybe UTCTime ->    -- optional time stamp for local file-    IO Bool             -- True on success, False on failure---- |update - similar to apt-get update---- downloads the index files associated with a sources.list. The--- downloaded index files will have the same basenames that apt-get uses--- in \/var\/lib\/apt\/lists. You can almost use this function instead of--- calling apt-get update. However there are a few key differences:---  1. apt-get update also updates the binary cache files---  2. apt-get update uses the partial directory and lock file in\ /var\/lib\/apt\/lists---  3. apt-get update downloads the Release and Release.gpg files-update :: Fetcher -- ^ function that will do actually downloading-       -> FilePath -- ^ download indexes to the directory (must already exist)-       -> String -- ^ binary architecture-       -> [DebSource] -- ^ sources.list-       -> IO [Maybe (FilePath, Compression)] -- ^ (basename of index file, compression status)-update fetcher basePath arch sourcesList =-    mapM (uncurry $ fetchIndex fetcher) (map (\(uri, fp, _) -> (uri, (basePath </> fp))) (concatMap (indexURIs arch) sourcesList))---- | download possibly compressed files--- NOTE: index uri must not include the .bz2 or .gz extension-fetchIndex :: Fetcher -- ^ function that will do the actual fetch-           -> URI -- ^ remote URI of package index, without .bz2 or .gz extension-           -> FilePath -- ^ name to save downloaded file as, without .bz2 or .gz extension-           -> IO (Maybe (FilePath, Compression)) -- ^ (downloaded file name + extension, compression status)-fetchIndex fetcher uri localPath =-    do let localPath' = localPath ++ ".bz2"-       --lm <- getLastModified localPath'-       res <- fetcher (uri { uriPath = (uriPath uri) ++ ".bz2" }) localPath' Nothing-       if res-          then return $ Just (localPath', BZ2)-          else do let localPath' = localPath ++ ".gz"-                  lm <- getLastModified localPath'-                  res <- fetcher (uri { uriPath = (uriPath uri) ++ ".gz" }) localPath' lm-                  if res-                     then return $ Just (localPath', GZ)-                     else do lm <- getLastModified localPath-                             res <- fetcher (uri { uriPath = (uriPath uri) }) localPath lm-                             if res-                                then return (Just (localPath, Uncompressed))-                                else return Nothing---- |examine a DebSource line, and calculate for each section:---  - the URI to the uncompressed index file---  - the basename that apt-get would name the downloaded index--- FIXME: ExactPath dist will fail with error at runtime :(-indexURIs :: String -- ^ which binary architecture-          -> DebSource -- ^ line from sources.list-          -> [(URI, FilePath, DebSource)] -- ^ (remote uri, local name, deb source for just this section)-indexURIs arch debSource =-    map (\ section -> let (uri, fp) = calcPath (sourceType debSource) arch baseURI release section-                      in (uri,fp, debSource { sourceDist = (Right (release, [section])) }) ) sections-    where-      baseURI = sourceUri debSource-      (release, sections) =-          either (error $ "indexURIs: support not implemented for exact path: " ++ render (pPrint debSource)) id (sourceDist debSource)---- |return a tuple for the section---  - the URI to the uncompressed index file---  - the basename that apt-get uses for the downloaded index--- FIXME: support for Release and Release.gpg-calcPath :: SourceType -- ^ do we want Packages or Sources-         -> String  -- ^ The binary architecture to use for Packages-         -> URI -- ^ base URI as it appears in sources.list-         -> ReleaseName -- ^ the release (e.g., unstable, testing, stable, sid, etc)-         -> Section -- ^ the section (main, contrib, non-free, etc)-         -> (URI, [Char]) -- ^ (uri to index file, basename for the downloaded file)-calcPath srcType arch baseURI release section =-          let indexPath = case srcType of-                      DebSrc -> "source/Sources"-                      Deb -> "binary-" ++ arch </> "Packages"-              path = (uriPath baseURI) </> "dists" </> (releaseName' release) </> sectionName' section </> indexPath-          in (baseURI { uriPath = path }, addPrefix . escapePath $ path)-          where-            addPrefix s = prefix scheme user' pass' reg port ++ {- "_" ++ -} s-            prefix "http:" (Just user) Nothing (Just host) port = user ++ host ++ port-            prefix "http:" _ _ (Just host) port = host ++ port-            prefix "ftp:" _ _ (Just host) _ = host-            prefix "file:" Nothing Nothing Nothing "" = ""-            prefix "ssh:" (Just user) Nothing (Just host) port = user ++ host ++ port-            prefix "ssh:" _ _ (Just host) port = host ++ port-            prefix _ _ _ _ _ = error ("calcPath: unsupported uri: " ++ uriToString' baseURI)-            user' = maybeOfString user-            pass' = maybeOfString pass-            (user, pass) = break (== ':') userpass-            userpass = maybe "" uriUserInfo auth-            reg = maybeOfString $ maybe "" uriRegName auth-            port = maybe "" uriPort auth-            scheme = uriScheme baseURI-            auth = uriAuthority baseURI-            --path = uriPath baseURI--            escapePath :: String -> String-            escapePath s = intercalate "_" $ wordsBy (== '/') s--            maybeOfString :: String -> Maybe String-            maybeOfString "" = Nothing-            maybeOfString s = Just s--            wordsBy :: Eq a => (a -> Bool) -> [a] -> [[a]]-            wordsBy p s =-                case (break p s) of-                  (s, []) -> [s]-                  (h, t) -> h : wordsBy p (drop 1 t)---- |Parse a possibly compressed index file.-controlFromIndex :: Compression -> FilePath -> L.ByteString -> Either ParseError (Control' Text)-controlFromIndex GZ path s = either Left (Right . decodeControl) . parseControl path . B.concat . L.toChunks . GZip.decompress $ s-controlFromIndex BZ2 path s = either Left (Right . decodeControl) . parseControl path . B.concat . L.toChunks . BZip.decompress $ s-controlFromIndex Uncompressed path s = either Left (Right . decodeControl) . parseControl path . B.concat . L.toChunks $ s---- |parse an index possibly compressed file-controlFromIndex' :: Compression -> FilePath -> IO (Either ParseError (Control' Text))-controlFromIndex' compression path = L.readFile path >>= return . controlFromIndex compression path--type Size = Integer-type FileTuple = (CheckSums, Size, FilePath)---- |A release file contains a list of indexes (Packages\/Sources). Each--- Package or Source index may appear multiple times because it may be--- compressed several different ways. This function will return an--- assoc list where the key is the name of the uncompressed package--- index name and the value is the list of (file, compression) which--- decompress to the key.-groupIndexes :: [FileTuple] -> [(FilePath, [(FileTuple, Compression)])]-groupIndexes indexFiles =-    M.toList $ M.fromListWith combine $ map makeKV indexFiles-    where-      makeKV fileTuple@(_,_,fp) =-          let (name, compressionMethod) = uncompressedName fp-          in-            (name, [(fileTuple, compressionMethod)])-      combine = (\x y -> sortBy (compare `on` snd) (x ++ y))-{--      with t@(_,_,fp) m =-          let (un, compression) =-          in-            M.insertWith--}--{--groupIndexes' :: String ->[FileTuple] -> [(FilePath, [(FileTuple, Compression)])]-groupIndexes' iType indexFiles =-    M.toList (foldr (insertType iType) M.empty indexFiles)-    where-      insertType iType t@(_,_,fp) m =-          case uncompressedName' iType fp of-            Nothing -> m-            (Just (un, compression)) ->-                M.insertWith (\x y -> sortBy (compare `on` snd) (x ++ y)) un [(t, compression)] m--}---- |The release file contains the checksums for the uncompressed--- package indexes, even if the uncompressed package indexes are not--- stored on the server. This function returns the list of files that--- actually exist.-filterExists :: FilePath -> (FilePath, [(FileTuple, Compression)]) -> IO (FilePath, [(FileTuple, Compression)])-filterExists distDir (fp, alternatives) =-          do e <- filterM ( \((_,_,fp),_) -> fileExist (distDir </> fp)) alternatives-             -- when (null e) (error $ "None of these files exist: " ++ show alternatives)-             return (fp, e)--findIndexes :: FilePath -> String -> [FileTuple] -> IO [(FileTuple, Compression)]-findIndexes distDir iType controlFiles =-    let indexes = groupIndexes controlFiles-    in-      do indexes' <- mapM (filterExists distDir) (filter (isType iType) indexes)-         return $ map (head . snd) (filter (not . List.null . snd) indexes')-    where-      isType iType (fp, _) = iType `isSuffixOf` fp--{--findIndexes' :: FilePath -> String -> [FileTuple] -> IO [(FileTuple, Compression)]-findIndexes' distDir iType controlFiles =-    let m = groupIndexes' iType controlFiles-    in-      do m' <- mapM (filterExists distDir) m-         return $ map (head . snd) (filter (not . null . snd) m')--}--      -- insertType :: String -> (CheckSums, Integer, FilePath) -> M.Map FilePath ((CheckSums, Integer, FilePath), Compression) -> M.Map FilePath ((CheckSums, Integer, FilePath), Compression)--{--uncompressedName' :: String -> FilePath -> Maybe (FilePath, Compression)-uncompressedName' iType fp-          | isSuffixOf iType fp = Just (fp, Uncompressed)-          | isSuffixOf (iType ++".gz") fp = Just (reverse . (drop 3) . reverse $ fp, GZ)-          | isSuffixOf (iType ++".bz2") fp = Just (reverse . (drop 4) . reverse $ fp, BZ2)-          | otherwise = Nothing--}--uncompressedName :: FilePath -> (FilePath, Compression)-uncompressedName fp-          | isSuffixOf ".gz"  fp = (reverse . (drop 3) . reverse $ fp, GZ)-          | isSuffixOf ".bz2" fp = (reverse . (drop 4) . reverse $ fp, BZ2)-          | otherwise            = (fp, Uncompressed)--indexesInRelease :: (FilePath -> Bool)-                 -> Control' Text -- ^ A release file-                 -> [(CheckSums, Integer, FilePath)] -- ^-indexesInRelease filterp (Control [p]) =-    let md5sums =-            case md5sumField p of-              (Just md5) -> md5-              Nothing -> error $ "Did not find MD5Sum field."-    in-      filter (\(_,_,fp) -> filterp fp) $ map (makeTuple . Text.words) $ filter (not . Text.null) (Text.lines md5sums)-    where-      makeTuple :: [Text] -> (CheckSums, Integer, FilePath)-      makeTuple [md5sum, size, fp] = (CheckSums { md5sum = Just (Text.unpack md5sum), sha1 = Nothing, sha256 = Nothing }, read (Text.unpack size), Text.unpack fp)-      makeTuple x = error $ "Invalid line in release file: " ++ show x-indexesInRelease _ x = error $ "Invalid release file: " <> Text.unpack (Text.concat (formatControl x))---- |make a FileTuple for a file found on the local disk--- returns 'Nothing' if the file does not exist.-tupleFromFilePath :: FilePath -> FilePath -> IO (Maybe FileTuple)-tupleFromFilePath basePath fp =-          do e <- fileExist (basePath </> fp)-             if not e-              then return Nothing-              else do size <- getFileStatus (basePath </> fp) >>= return . fromIntegral . fileSize-                      md5 <- L.readFile (basePath </> fp) >>= return . show . MD5.md5-                      return $ Just (CheckSums { md5sum = Just md5, sha1 = Nothing, sha256 = Nothing }, size, fp)---- |find the Contents-* files. These are not listed in the Release file-findContentsFiles :: (FilePath -> Bool) -> FilePath -> IO [FilePath]-findContentsFiles filterP distDir =-          do files <- getDirectoryContents distDir-             return $ filter filterP $ filter (isPrefixOf "Contents-" . takeBaseName) files
− debian-haskell/Debian/Apt/Methods.hs
@@ -1,486 +0,0 @@-{-# LANGUAGE PackageImports #-}-{-# OPTIONS_GHC -fno-warn-missing-signatures -fno-warn-name-shadowing #-}--- |an interface for using the methods in /var/lib/apt/methods-module Debian.Apt.Methods-    ( withMethodPath-    , withMethodURI-    , whichMethodPath-    , openMethod-    , closeMethod-    , recvStatus-    , sendCommand-    , getLastModified-    , simpleFetch-    , fetch-    , FetchCallbacks(..)-    , emptyFetchCallbacks-    , cliFetchCallbacks-    , Command(..)-    , Status(..)-    , Message, Site, User, Password, Media, Drive, Header, ConfigItem-    )-    where--import Debian.Time-import Debian.URI--import Control.Exception-import "mtl" Control.Monad.Error-import Data.Maybe-import Data.Time-import System.Directory-import System.Exit-import System.IO-import System.Posix.Files-import System.Process--type MethodHandle = (Handle, Handle, Handle, ProcessHandle)--capabilities, logMsg, status, uriStart, uriDone, uriFailure, generalFailure, authorizationRequired, mediaFailure, uriAcquire, configuration, authorizationCredentials, mediaChanged :: String-capabilities = "100"-logMsg = "101"-status = "102"-uriStart = "200"-uriDone = "201"-uriFailure = "400"-generalFailure = "401"-authorizationRequired = "402"-mediaFailure = "403"-uriAcquire = "600"-configuration = "601"-authorizationCredentials = "602"-mediaChanged = "603"--type Message = String-type Site = String-type User = String-type Password = String-type Media = String-type Drive = String--data Status-    = Capabilities { version :: String, singleInstance :: Bool, preScan :: Bool, pipeline :: Bool, sendConfig :: Bool-                   , needsCleanup :: Bool, localOnly :: Bool }-    | LogMsg Message-    | Status URI Message-    | URIStart { uri :: URI, size :: Maybe Integer, lastModified :: Maybe UTCTime, resumePoint :: Maybe Integer }-    | URIDone { uri :: URI, size :: Maybe Integer,  lastModified :: Maybe UTCTime, resumePoint :: Maybe Integer-              , filename :: Maybe FilePath, hashes :: Hashes, imsHit :: Bool }-    | URIFailure { uri :: URI, message :: Message }-    | GeneralFailure Message-    | AuthorizationRequired Site-    | MediaFailure Media Drive-      deriving (Show, Eq)--data Hashes-    = Hashes { md5 :: Maybe String-             , sha1 :: Maybe String-             , sha256 :: Maybe String-             }-      deriving (Show, Eq)--emptyHashes = Hashes Nothing Nothing Nothing--data Command-    = URIAcquire URI FilePath (Maybe UTCTime)-    | Configuration [ConfigItem]-    | AuthorizationCredentials Site User Password-    | MediaChanged Media (Maybe Bool) -- I don't really understand the Fail field, I am assuming it is 'Fail: true'-      deriving (Show, Eq)--type Header = (String, String)-type ConfigItem = (String, String)--withMethodURI :: URI -> (MethodHandle -> IO a) -> IO a-withMethodURI uri f =-    do  mp <- liftM fromJust (whichMethodPath uri)-        withMethodPath mp f---- |withMethod - run |methodPath| bracketed with--- openMethod\/closeMethod. |f| gets the open handle.-withMethodPath :: FilePath -> (MethodHandle -> IO a) -> IO a-withMethodPath methodPath f =-    bracket (openMethod methodPath) closeMethod $ f---- |whichMethodBinary - find the method executable associated with a URI--- throws an exception on failure-whichMethodPath :: URI -> IO (Maybe FilePath)-whichMethodPath uri =-    let scheme = init (uriScheme uri)-        path = "/usr/lib/apt/methods/" ++ scheme-    in-      doesFileExist path >>= return . bool Nothing (Just path)--{--The flow of messages starts with the method sending out a-100 Capabilities and APT sending out a 601 Configuration.--The flow is largely unsynchronized, but our function may have to-respond to things like authorization requests. Perhaps we do a-recvContents and then mapM_ over that ? Not all incoming messages-require a response, so...---}--parseStatus :: [String] -> Status-parseStatus [] = error "parseStatus"-parseStatus (code' : headers') =-    parseStatus' (take 3 code') (map parseHeader headers')-    where-      parseStatus' code headers-          | code == capabilities =-              foldr updateCapability defaultCapabilities headers-                  where-                    updateCapability (a,v) c-                        | a == "Version"         = c { version = v }-                        | a == "Single-Instance" = c { singleInstance = parseTrueFalse v }-                        | a == "Pre-Scan"        = c { preScan = parseTrueFalse v }-                        | a == "Pipeline"        = c { pipeline = parseTrueFalse v }-                        | a == "Send-Config"     = c { sendConfig = parseTrueFalse v }-                        | a == "Needs-Cleanup"   = c { needsCleanup = parseTrueFalse v }-                        | a == "Local-Only"      = c { localOnly = parseTrueFalse v }-                        | otherwise = error $ "unknown capability: " ++ show (a,v)-                    defaultCapabilities =-                        Capabilities { version = ""-                                     , singleInstance = False-                                     , preScan        = False-                                     , pipeline       = False-                                     , sendConfig     = False-                                     , needsCleanup   = False-                                     , localOnly      = False-                                     }-      parseStatus' code headers-          | code == logMsg =-              case headers of-                [("Message", msg)] -> LogMsg msg-                _ -> error "parseStatus'"-          | code == status =-                Status (fromJust $ parseURI $ fromJust $ lookup "URI" headers) (fromJust $ lookup "Message" headers)-          | code == uriStart =-              foldr updateUriStart (URIStart undefined Nothing Nothing Nothing) headers-                  where-                    updateUriStart (a,v) u-                        | a == "URI" = u { uri = fromJust $ parseURI v }-                        | a == "Size" = u { size = Just (read v) }-                        | a == "Last-Modified" = u { lastModified = parseTimeRFC822 v } -- if the date is unparseable, we silently truncate. Is that bad ?-                        | a == "Resume-Point" = u { resumePoint = Just (read v) }-                    updateUriStart _ _ = error "updateUriStart"-      parseStatus' code headers-          | code == uriDone =-              foldr updateUriDone (URIDone undefined Nothing Nothing Nothing Nothing emptyHashes False) headers-                  where-                    updateUriDone (a,v) u-                        | a == "URI" = u { uri = fromJust $ parseURI v }-                        | a == "Size" = u { size = Just (read v) }-                        | a == "Last-Modified" = u { lastModified = parseTimeRFC822 v } -- if the date is unparseable, we silently truncate. Is that bad ?-                        | a == "Filename" = u { filename = Just v }-                        | a == "MD5Sum-Hash" = u { hashes = (hashes u) { md5    = Just v } }-                        | a == "MD5-Hash" = u { hashes = (hashes u) { md5    = Just v } }-                        | a == "SHA1-Hash"   = u { hashes = (hashes u) { sha1   = Just v } }-                        | a == "SHA256-Hash" = u { hashes = (hashes u) { sha256 = Just v } }-                        | a == "Resume-Point" = u { resumePoint = Just (read v) }-                        | a == "IMS-Hit" && v == "true" = u { imsHit = True }-                        | otherwise = error $ "updateUriDone: unknown header: " ++ show (a,v)-      parseStatus' code headers-          | code == uriFailure =-              URIFailure (fromJust $ parseURI $ fromJust $ lookup "URI" headers) (fromJust $ lookup "Message" headers)-          | code == generalFailure =-              GeneralFailure (fromJust $ lookup "Message" headers)-          | code == authorizationRequired =-              AuthorizationRequired (fromJust $ lookup "Site" headers)-          | code == mediaFailure =-              MediaFailure (fromJust $ lookup "Media" headers) (fromJust $ lookup "Drive" headers)-      parseStatus' _ _ = error "parseStatus'"--formatCommand :: Command -> [String]-formatCommand (URIAcquire uri filepath mLastModified) =-    [ uriAcquire ++ " URI Acquire"-    , "URI: " ++ uriToString' uri -- will this get credentials correct ? Or do we always pass those in seperately-    , "FileName: " ++ filepath-    ] ++ maybe [] (\lm -> ["Last-Modified: " ++ formatTimeRFC822 lm ]) mLastModified-formatCommand (Configuration configItems) =-    (configuration ++ " Configuration") : (map formatConfigItem configItems)-    where-      formatConfigItem (a,v) = concat ["Config-Item: ", a, "=", v]-formatCommand (AuthorizationCredentials site user passwd) =-    (authorizationCredentials ++ " Authorization Credentials") :-    [ "Site: " ++ site-    , "User: " ++ user-    , "Password: " ++ passwd-    ]-formatCommand (MediaChanged media mFail) =-    [ mediaChanged ++ " Media Changed"-    , "Media: " ++ media-    ] ++ maybe [] (\b -> ["Fail: " ++ case b of True -> "true" ; False -> "false"]) mFail---parseTrueFalse :: String -> Bool-parseTrueFalse "true" = True-parseTrueFalse "false" = False-parseTrueFalse s = error $ "Invalid boolean string: " ++ s---recvStatus :: MethodHandle -> IO Status-recvStatus mh = liftM parseStatus $ recv mh--sendCommand :: MethodHandle -> Command -> IO ()-sendCommand mh cmd = sendMethod mh (formatCommand cmd)---parseHeader :: String -> Header-parseHeader str =-    let (a, r) = span (/= ':') str-        v = dropWhile (flip elem ": \t") r-    in-      (a, v)--openMethod :: FilePath -> IO MethodHandle-openMethod methodBinary =-    do-      -- hPutStrLn stderr ("openMethod " ++ methodBinary)-      runInteractiveCommand methodBinary-      -- runInteractiveProcess methodBinary [] Nothing Nothing--sendMethod :: MethodHandle -> [String] -> IO ()-sendMethod (pIn, _pOut, _, _) strings =-    do-      -- hPutStrLn stderr "send:"-      mapM_ put strings-      hPutStrLn pIn ""-      hFlush pIn-    where-      put line =-          do-            -- hPutStrLn stderr ("  " ++ line)-            hPutStrLn pIn line--closeMethod :: MethodHandle -> IO ExitCode-closeMethod (pIn, pOut, pErr, handle) =-    do-      -- hPutStrLn stderr "closeMethod"-      hClose pIn-      hClose pOut-      hClose pErr-      waitForProcess handle--recv :: MethodHandle -> IO [String]-recv (_pIn, pOut, _pErr, _pHandle) =-    do-      -- hPutStrLn stderr "recv:"-      readTillEmptyLine pOut-    where-      readTillEmptyLine pOut =-          do-            line <- hGetLine pOut-            case line of-              "" -> return []-              line ->-                  do-                    -- hPutStrLn stderr ("  " ++ line)-                    tail <- readTillEmptyLine pOut-                    return $ line : tail-{--The flow of messages starts with the method sending out a-<em>100 Capabilities</> and APT sending out a <em>601 Configuration</>.--The flow is largely unsynchronized, but our function may have to-respond to things like authorization requests. Perhaps we do a-recvContents and then mapM_ over that ? Not all incoming messages-require a response.--We probably also need to track state, for example, if we are-pipelining multiple downloads and want to show seperate progress bars-for each download.--If someone wants to use fetch, they will need to provide methods to:-- 1. prompt for and provide authentication- 2. show progress- 3. show media change dialog- 4. Show log messages- 5. Show failures- 6. Send Configuration--pipeline vs non-pipeline mode.-what if different methods are being used ?--when pipelining, we probably don't want to have too many pipelines to-the same server. Perhaps there can be a limit, and for non-pipelinable-methods, we set the limit to 1.--Each method can run in a seperate thread, since methods do not-interact with each other. In fact, each unique method+uri can be a-seperate thread. We can use a MVar to track the global max download-count. Perhaps we also want a per host throttle, since it is the host-connect that is likely to max out, not the access method.--Plan:--partition fetches by (host,method).-fork off threads for each (host, method).-Use MVar to throttle per host, and total connections--We don't know if a method supports pipelining until we connect atleast-once. So if we have a non-pipelined method, we might want to start-multiple streams. On the other hand, for something like a CDROM, that-will just cause the system to thrash.--cdrom, file, etc, don't have a host, so that is not a unique key then.-Pipelining on local methods is tricky, because it is hard to tell if-the local methods point to the same device or not.--Even though we have multiple threads, the interactor can view the-incoming Stream as a single Stream because all the events are tagged-with the URI (i think). But, sending commands involves a fancy-router. We could include a reference to corresponding command for each-stream.--For now, let's serialize the transfers, but allow pipeling for methods-that really allow pipelining.---}--data FetchCallbacks-    = FetchCallbacks { logCB :: Message ->  IO ()-                     , statusCB :: URI -> Message -> IO ()-                     , uriStartCB :: URI -> Maybe Integer -> Maybe UTCTime -> Maybe Integer -> IO ()-                     , uriDoneCB ::  URI -> Maybe Integer -> Maybe UTCTime -> Maybe Integer -> Maybe FilePath -> Hashes -> Bool -> IO ()-                     , uriFailureCB :: URI -> Message -> IO ()-                     , generalFailureCB :: Message -> IO ()-                     , authorizationRequiredCB :: Site -> IO (Maybe (User, Password))-                     , mediaFailureCB :: Media -> Drive -> IO ()-                     , debugCB :: String -> IO ()-                     }--simpleFetch :: [ConfigItem] -> URI -> FilePath -> Maybe UTCTime -> IO Bool-simpleFetch = fetch cliFetchCallbacks---- |fetch a single item, show console output--- see also: getLastModified-fetch :: FetchCallbacks -> [ConfigItem] -> URI -> FilePath -> Maybe UTCTime -> IO Bool-fetch cb configItems uri fp lastModified =-    do withMethodURI uri $ \mh ->-        do s <- recvStatus mh-           debugCB cb ("<- " ++ show s)-           sendCommand' mh (URIAcquire uri fp lastModified)-           loop mh-    where-      sendCommand' mh c =-          do mapM_ (debugCB cb . ("-> " ++)) (formatCommand c)-             sendCommand mh c-      loop mh =-          do r <- recvStatus mh-             case r of-               Capabilities {} ->-                   do unless (null configItems) (sendCommand' mh (Configuration configItems))-                      loop mh-               LogMsg m ->-                   do logCB cb m-                      loop mh-               Status uri m ->-                   do statusCB cb uri m-                      loop mh-               URIStart uri size lastModified resumePoint ->-                   uriStartCB cb uri size lastModified resumePoint >> loop mh-               URIDone uri size lastModified resumePoint filename hashes imsHit ->-                   uriDoneCB cb uri size lastModified resumePoint filename hashes imsHit >> return True-               URIFailure uri message ->-                   uriFailureCB cb uri message >> return False-               GeneralFailure m -> generalFailureCB cb m >> return False-               AuthorizationRequired site ->-                   do mCredentials <- authorizationRequiredCB cb site-                      case mCredentials of-                        Nothing -> return False -- FIXME: do we need a force close option for closeMethod ?-                        Just (user, passwd) ->-                            do sendCommand' mh (AuthorizationCredentials site user passwd)-                               loop mh-               MediaFailure media drive ->-                    do mediaFailureCB cb media drive-                       return False---- |set of callbacks which do nothing.--- suitable for non-interactive usage. In the case authorization is--- required, no credentials will be supplied and the download should--- abort.-emptyFetchCallbacks =-    FetchCallbacks { logCB = \ _m -> return ()-                   , statusCB = \ _uri _m -> return ()-                   , uriStartCB = \ _uri _size _lastModified _resumePoint -> return ()-                   , uriDoneCB = \ _uri _size _lastModified _resumePoint _filename _hashes _imsHit -> return ()-                   , uriFailureCB = \ _uri _message -> return ()-                   , generalFailureCB = \ _m -> return ()-                   , authorizationRequiredCB = \ _site -> return Nothing-                   , mediaFailureCB = \ _media _drive -> return ()-                   , debugCB = \ _m -> return ()-                   }--cliFetchCallbacks =-    emptyFetchCallbacks { statusCB = \uri m -> putStrLn $ uriToString' uri ++ " : " ++ m-                        , uriStartCB = \ uri _size lastModified _resumePoint -> putStrLn $ uriToString' uri ++ " started. " ++ show lastModified-                        , uriDoneCB = \uri _size _lastModified _resumePoint _filename _hashes imsHit -> putStrLn $ uriToString' uri ++ (if imsHit then " cached." else " downloaded.")-                        , uriFailureCB = \uri message -> hPutStrLn stderr $ "URI Failure: " ++ uriToString' uri ++ " : " ++ message-                        , generalFailureCB = \message -> hPutStrLn stderr $ "General Failure: " ++ message-                        , authorizationRequiredCB = \site ->-                                                    do putStrLn $ "Authorization Required for " ++ site-                                                       putStrLn "Username: " >> hFlush stdout-                                                       user <- getLine-                                                       putStrLn "Password: " >> hFlush stdout-                                                       passwd <- getLine -- TODO: write a getPasswd function which does not echo input-                                                       return (Just (user, passwd))-                        , mediaFailureCB = \media drive -> hPutStrLn stderr $ "Media Failure: media=" ++ media ++" drive="++ drive-                        , debugCB = \m -> print m-                        }--{--    FetchCallbacks { logCB = \m -> hPutStrLn stderr m-                   , statusCB = \uri m -> putStrLn (show uri ++" : "++ m)-                   , uriStartCB = \uri-                   }--defaultAuthenticate site =-    do putStrLn $ "Authorization Required for " ++ site-       putStrLn "Username: " >> hFlush stdout-       user <- getLine-       putStrLn "Password: " >> hFlush stdout-       passwd <- getLine -- TODO: write a getPasswd function which does not echo input-       return (user, passwd)--}--{--    let itemsByHost = groupOn (regName . fst) items-    in-      do totalQSem <- newQSem 16 -- max number of streams allowed for-         forkIO-    where-      regName = fmap uriRegName . uriAuthority-      withQSem :: QSem -> IO a -> IO a-      withQSem qSem f = bracket (waitQSem qSem) (const $ signalQSem qSem) (const f)--uris = map (fromJust . parseURI) [ "http://n-heptane.com/whee"-                                 , "file:/one/two/three"-                                 , "ssh://jeremy:aoeu@n-heptane.com"-                                 , "cdrom:/one"-                                 ]--}---- * Misc Helper Functions--bool :: a -> a -> Bool -> a-bool f _ False = f-bool _ t True = t---getLastModified :: FilePath -> IO (Maybe UTCTime)-getLastModified fp =-    do e <- doesFileExist fp-       if e-          then getFileStatus fp >>= return . Just . epochTimeToUTCTime . modificationTime-          else return Nothing--{--groupOn :: (Ord b) => (a -> b) -> [a] -> [[a]]-groupOn f = groupBy ((==) `on` f) . sortBy (compare `on` f)--on :: (a -> a -> b) -> (c -> a) -> c -> c -> b-on f g x y = f (g x) (g y)--}
− debian-haskell/Debian/Apt/Package.hs
@@ -1,54 +0,0 @@-{-# LANGUAGE ScopedTypeVariables #-}--- |Functions for dealing with source and binary packages in an abstract-way-module Debian.Apt.Package where---- Standard GHC Modules--import qualified Data.Map as Map---- Local Modules--import Debian.Version-import Debian.Relation--type PackageNameMap a = Map.Map BinPkgName [a]---- |'packageNameMap' creates a map from a package name to all the versions of that package--- NOTE: Provides are not included in the map--- NOTE: the sort order is random -- this is perhaps a bug--- see also: 'addProvides'-packageNameMap :: (a -> BinPkgName) -> [a] -> PackageNameMap a-packageNameMap getName packages = foldl (\m p -> Map.insertWith (++) (getName p) [p] m) Map.empty packages---- |'addProvides' finds packages that Provide other packages and adds--- them to the PackageNameMap. They will be adde to the end of the--- list, so that real packages have 'higher priority' than virtual--- packages.--- NOTE: Does not check for duplication or multiple use-addProvides :: (p -> [BinPkgName]) -> [p] -> PackageNameMap p -> PackageNameMap p-addProvides providesf ps pnm =-    let provides = findProvides providesf ps in-    foldl (\m (packageName, package) -> Map.insertWith (flip (++)) packageName [package] m) pnm provides---- |'findProvides'-findProvides :: forall p. (p -> [BinPkgName]) -> [p] -> [(BinPkgName, p)]-findProvides providesf packages = foldl addProvides' [] packages-    where addProvides' :: [(BinPkgName, p)] -> p -> [(BinPkgName, p)]-          addProvides' providesList package =-              foldl (\pl pkgName -> (pkgName, package): pl) providesList (providesf package)---- |'lookupPackageByRel' returns all the packages that satisfy the specified relation--- TODO: Add architecture check-lookupPackageByRel :: PackageNameMap a -> (a -> (BinPkgName, DebianVersion)) -> Relation -> [a]-lookupPackageByRel pm packageVersionF (Rel pkgName mVerReq _mArch) =-    case Map.lookup pkgName pm of-      Nothing -> []-      Just packages -> filter filterVer packages-    where filterVer p =-              case mVerReq of-                Nothing -> True-                Just _verReq ->-                    let (pName, pVersion) = packageVersionF p-                    in if pName /= pkgName-                       then False -- package is a virtual package, hence we can not do a version req-                       else checkVersionReq mVerReq (Just pVersion)
− debian-haskell/Debian/Arch.hs
@@ -1,54 +0,0 @@-{-# LANGUAGE DeriveDataTypeable, OverloadedStrings #-}-module Debian.Arch-    ( Arch(..)-    , ArchOS(..)-    , ArchCPU(..)-    , prettyArch-    , parseArch-    ) where--import Data.Data (Data)-import Data.Monoid ((<>))-import Data.Typeable (Typeable)-import Text.PrettyPrint (Doc, text)--data ArchOS = ArchOS String | ArchOSAny deriving (Eq, Ord, Read, Show, Data, Typeable)--prettyOS :: ArchOS -> Doc-prettyOS (ArchOS s) = text s-prettyOS ArchOSAny = text "any"--parseOS :: String -> ArchOS-parseOS "any" = ArchOSAny-parseOS s = ArchOS s--data ArchCPU = ArchCPU String | ArchCPUAny deriving (Eq, Ord, Read, Show, Data, Typeable)--prettyCPU :: ArchCPU -> Doc-prettyCPU (ArchCPU s) = text s-prettyCPU ArchCPUAny = text "any"--parseCPU :: String -> ArchCPU-parseCPU "any" = ArchCPUAny-parseCPU s = ArchCPU s--data Arch-    = Source-    | All-    | Binary ArchOS ArchCPU-    deriving (Eq, Ord, Read, Show, Data, Typeable)--prettyArch :: Arch -> Doc-prettyArch Source = text "source"-prettyArch All = text "all"-prettyArch (Binary (ArchOS "linux") cpu) = prettyCPU cpu-prettyArch (Binary os cpu) = prettyOS os <> text "-" <> prettyCPU cpu--parseArch :: String -> Arch-parseArch s =-    case span (/= '-') s of-      ("source", "") -> Source-      ("all", "") -> All-      (cpu, "") -> Binary (ArchOS "linux") (parseCPU cpu)-      (os, '-' : cpu) -> Binary (parseOS os) (parseCPU cpu)-      _ -> error "parseArch: internal error"
− debian-haskell/Debian/Changes.hs
@@ -1,350 +0,0 @@-{-# LANGUAGE FlexibleInstances #-}-{-# OPTIONS_GHC -fno-warn-name-shadowing -fno-warn-missing-signatures #-}--- |Changelog and changes file support.-module Debian.Changes-    ( ChangesFile(..)-    , ChangedFileSpec(..)-    , changesFileName-    , ChangeLog(..)-    , ChangeLogEntry(..)-    , parseChangeLog-    , parseEntries -- was parseLog-    , parseEntry-    , parseChanges-    ) where--import Data.Either (partitionEithers)-import Data.List (intercalate, intersperse)-import Data.Monoid ((<>))-import Data.Text (Text, pack, unpack, strip)-import Debian.Arch (Arch, prettyArch)-import qualified Debian.Control.String as S-import Debian.Pretty (PP(..))-import Debian.Release-import Debian.URI()-import Debian.Version-import System.Posix.Types-import Text.Regex.TDFA hiding (empty)-import Text.PrettyPrint (Doc, text, hcat, render)-import Text.PrettyPrint.HughesPJClass (Pretty(pPrint))---- |A file generated by dpkg-buildpackage describing the result of a--- package build-data ChangesFile =-    Changes { changeDir :: FilePath             -- ^ The full pathname of the directory holding the .changes file.-            , changePackage :: String           -- ^ The package name parsed from the .changes file name-            , changeVersion :: DebianVersion    -- ^ The version number parsed from the .changes file name-            , changeRelease :: ReleaseName      -- ^ The Distribution field of the .changes file-            , changeArch :: Arch                -- ^ The architecture parsed from the .changes file name-            , changeInfo :: S.Paragraph' Text   -- ^ The contents of the .changes file-            , changeEntry :: ChangeLogEntry     -- ^ The value of the Changes field of the .changes file-            , changeFiles :: [ChangedFileSpec]  -- ^ The parsed value of the Files attribute-            } deriving (Eq, Read, Show)---- |An entry in the list of files generated by the build.-data ChangedFileSpec =-    ChangedFileSpec { changedFileMD5sum :: String-                    , changedFileSHA1sum :: String-                    , changedFileSHA256sum :: String-                    , changedFileSize :: FileOffset-                    , changedFileSection :: SubSection-                    , changedFilePriority :: String-                    , changedFileName :: FilePath-                    } deriving (Eq, Read, Show)---- |A changelog is a series of ChangeLogEntries-data ChangeLogEntry =-    Entry { logPackage :: String -- FIXME: Should be a SrcPkgName-          , logVersion :: DebianVersion-          , logDists :: [ReleaseName]-          , logUrgency :: String-          , logComments :: String-          , logWho :: String-          , logDate :: String-          }-  | WhiteSpace String -- ^ The parser here never returns this-  deriving (Eq, Read, Show)--newtype ChangeLog = ChangeLog [ChangeLogEntry] deriving (Eq, Read, Show)--{--instance Show ChangesFile where-    show = changesFileName--}--changesFileName :: ChangesFile -> String-changesFileName = render . pPrint . PP--instance Pretty (PP ChangesFile) where-    pPrint (PP changes) = text (changePackage changes ++ "_") <> prettyDebianVersion (changeVersion changes) <> text "_" <> prettyArch (changeArch changes) <> text ".changes"--instance Pretty (PP ChangedFileSpec) where-    pPrint (PP file) =-        text (changedFileMD5sum file <> " " <>-              show (changedFileSize file) <> " " <>-              sectionName (changedFileSection file) <> " " <>-              changedFilePriority file <> " " <>-              changedFileName file)--instance Pretty (PP ChangeLogEntry) where-    pPrint (PP (Entry package ver dists urgency details who date)) =-        hcat [ text package <> text " (" <> prettyDebianVersion ver <> text (") " <> intercalate " " (map releaseName' dists) ++ "; urgency=" ++ urgency)-             , text "\n\n"-             , text "  " <> text (strip' details)-             , text "\n\n"-             , text (" -- " <> who <> "  " <> date)-             , text "\n" ]-    pPrint (PP (WhiteSpace _)) = error "instance Pretty ChangeLogEntry"--instance Pretty (PP [ChangeLogEntry]) where-    pPrint = hcat . intersperse (text "\n") . map (pPrint . PP) . unPP--strip' = unpack . strip . pack--instance Pretty (PP ChangeLog) where-    pPrint (PP (ChangeLog xs)) = hcat (intersperse (text "\n") (map (pPrint . PP) xs))---- |Show just the top line of a changelog entry (for debugging output.)-_showHeader :: ChangeLogEntry -> Doc-_showHeader (Entry package ver dists urgency _ _ _) =-    text (package <> " (") <> prettyDebianVersion ver <> text (") " <> intercalate " " (map releaseName' dists) <> "; urgency=" <> urgency <> "...")-_showHeader (WhiteSpace _) = error "_showHeader"--{--format is a series of entries like this:--     package (version) distribution(s); urgency=urgency-    [optional blank line(s), stripped]-       * change details-         more change details-    [blank line(s), included in output of dpkg-parsechangelog]-       * even more change details-    [optional blank line(s), stripped]-      -- maintainer name <email address>[two spaces]  date--package and version are the source package name and version number.--distribution(s) lists the distributions where this version should be-installed when it is uploaded - it is copied to the Distribution field-in the .changes file. See Distribution, Section 5.6.14.--urgency is the value for the Urgency field in the .changes file for-the upload (see Urgency, Section 5.6.17). It is not possible to-specify an urgency containing commas; commas are used to separate-keyword=value settings in the dpkg changelog format (though there is-currently only one useful keyword, urgency).--The change details may in fact be any series of lines starting with at-least two spaces, but conventionally each change starts with an-asterisk and a separating space and continuation lines are indented so-as to bring them in line with the start of the text above. Blank lines-may be used here to separate groups of changes, if desired.--If this upload resolves bugs recorded in the Bug Tracking System-(BTS), they may be automatically closed on the inclusion of this-package into the Debian archive by including the string: closes:-Bug#nnnnn in the change details.[16] This information is conveyed via-the Closes field in the .changes file (see Closes, Section 5.6.22).--The maintainer name and email address used in the changelog should be-the details of the person uploading this version. They are not-necessarily those of the usual package maintainer. The information-here will be copied to the Changed-By field in the .changes file (see-Changed-By, Section 5.6.4), and then later used to send an-acknowledgement when the upload has been installed.--The date must be in RFC822 format[17]; it must include the time zone-specified numerically, with the time zone name or abbreviation-optionally present as a comment in parentheses.--The first "title" line with the package name must start at the left-hand margin. The "trailer" line with the maintainer and date details-must be preceded by exactly one space. The maintainer details and the-date must be separated by exactly two spaces.--The entire changelog must be encoded in UTF-8.--}---- | Parse the entries of a debian changelog and verify they are all--- valid.-parseChangeLog :: String -> ChangeLog-parseChangeLog s =-    case partitionEithers (parseEntries s) of-      ([], xs) -> ChangeLog xs-      (ss, _) -> error (intercalate "\n  " ("Error(s) parsing changelog:" : concat ss))---- |Parse a Debian Changelog and return a lazy list of entries-parseEntries :: String -> [Either [String] ChangeLogEntry]-parseEntries "" = []-parseEntries text =-    case parseEntry text of-      Left messages -> [Left messages]-      Right (entry, text') -> Right entry : parseEntries text'---- |Parse a single changelog entry, returning the entry and the remaining text.-{--parseEntry :: String -> Failing (ChangeLogEntry, String)-parseEntry text =-    case span (\ x -> elem x " \t\n") text of-      ("", _) ->-          case matchRegexAll entryRE text of-            Nothing -> Failure ["Parse error in changelog:\n" ++ show text]-            Just ("", _, remaining, [_, name, version, dists, urgency, _, details, _, _, _, _, _, who, date, _]) ->-                Success (Entry name-                               (parseDebianVersion version)-                               (map parseReleaseName . words $ dists)-                               urgency-                               details-                               who-                               date,-                         remaining)-            Just (before, _, remaining, submatches) ->-                Failure ["Internal error:\n  text=" ++ show text ++ "\n before=" ++ show before ++ "\n  remaining=" ++ show remaining ++ ", submatches=" ++ show submatches]-      (w, text') -> Success (WhiteSpace (trace ("whitespace: " ++ show w) w), text')--}--parseEntry :: String -> Either [String] (ChangeLogEntry, String)-parseEntry text =-    case text =~ entryRE :: MatchResult String of-      x | mrSubList x == [] -> Left ["Parse error in " ++ show text]-      MR {mrAfter = after, mrSubList = [_, name, ver, dists, urgency, _, details, _, _, who, _, date, _]} ->-          Right (Entry name-                         (parseDebianVersion' ver)-                         (map parseReleaseName . words $ dists)-                         urgency-                         ("  " ++ unpack (strip (pack details)) ++ "\n")-                         (take (length who - 2) who)-                         date,-                   after)-      MR {mrBefore = _before, mrMatch = _matched, mrAfter = after, mrSubList = matches} ->-          Left ["Internal error\n after=" ++ show after ++ "\n " ++ show (length matches) ++ " matches: " ++ show matches]-{--parseREs :: [Regex] -> String -> Failing ([String], String)-parseREs res text =-    foldr f (Success ([], text)) entryREs-    where-      f _ (Failure msgs) = Failure msgs-      f re (Success (oldMatches, text)) =-          case matchRegexAll re text of-            Nothing -> Failure ["Parse error at " ++ show text]-            Just (before, matched, after, newMatches) ->-                Success (oldMatches ++ trace ("newMatches=" ++ show newMatches) newMatches, after)--}--entryRE = bol ++ blankLines ++ headerRE ++ changeDetails ++ signature ++ blankLines-changeDetails = "((\n| \n| -\n|([^ ]| [^--]| -[^--])[^\n]*\n)*)"-signature = " -- ([ ]*([^ ]+ )* )([^\n]*)\n"--{--entryRE = mkRegexWithOpts (bol ++ blankLines ++ headerRE ++ nonSigLines ++ blankLines ++ signature ++ blankLines) False True-nonSigLines = "(((  .*|\t.*| \t.*)|([ \t]*)\n)+)"--- In the debian repository, sometimes the extra space in front of the--- day-of-month is missing, sometimes an extra one is added.-signature = "( -- ([^\n]*)  (..., ? ?.. ... .... ........ .....))[ \t]*\n"--}---- |Parse the changelog information that shows up in the .changes--- file, i.e. a changelog entry with no signature.-parseChanges :: Text -> Maybe ChangeLogEntry-parseChanges text =-    case unpack text =~ changesRE :: MatchResult String of-      MR {mrSubList = []} -> Nothing-      MR {mrSubList = [_, name, ver, dists, urgency, _, details]} ->-          Just $ Entry name-                       (parseDebianVersion' ver)-                       (map parseReleaseName . words $ dists)-                       urgency-                       details-                       "" ""-      MR {mrSubList = x} -> error $ "Unexpected match: " ++ show x-    where-      changesRE = bol ++ blankLines ++ optWhite ++ headerRE ++ "(.*)$"--headerRE =-    package ++ ver ++ dists ++ urgency-    where-      package = "([^ \t(]*)" ++ optWhite-      ver = "\\(([^)]*)\\)" ++ optWhite-      dists = "([^;]*);" ++ optWhite-      urgency = "urgency=([^\n]*)\n" ++ blankLines--blankLines = blankLine ++ "*"-blankLine = "(" ++ optWhite ++ "\n)"-optWhite = "[ \t]*"-bol = "^"---- This can be used for tests-_s1 = unlines-     ["haskell-regex-compat (0.92-3+seereason1~jaunty4) jaunty-seereason; urgency=low",-      "",-      "  [ Joachim Breitner ]",-      "  * Adjust priority according to override file",-      "  * Depend on hscolour (Closes: #550769)",-      "",-      "  [ Marco Túlio Gontijo e Silva ]",-      "  * debian/control: Use more sintetic name for Vcs-Darcs.",-      "  * Built from sid apt pool",-      "  * Build dependency changes:",-      "     cpphs:                    1.9-1+seereason1~jaunty5     -> 1.9-1+seereason1~jaunty6",-      "     ghc6:                     6.10.4-1+seereason5~jaunty1  -> 6.12.1-0+seereason1~jaunty1",-      "     ghc6-doc:                 6.10.4-1+seereason5~jaunty1  -> 6.12.1-0+seereason1~jaunty1",-      "     ghc6-prof:                6.10.4-1+seereason5~jaunty1  -> 6.12.1-0+seereason1~jaunty1",-      "     haddock:                  2.4.2-3+seereason3~jaunty1   -> 6.12.1-0+seereason1~jaunty1",-      "     haskell-devscripts:       0.6.18-21+seereason1~jaunty1 -> 0.6.18-23+seereason1~jaunty1",-      "     haskell-regex-base-doc:   0.93.1-5+seereason1~jaunty1  -> 0.93.1-5++1+seereason1~jaunty1",-      "     haskell-regex-posix-doc:  0.93.2-4+seereason1~jaunty1  -> 0.93.2-4+seereason1~jaunty2",-      "     libghc6-regex-base-dev:   0.93.1-5+seereason1~jaunty1  -> 0.93.1-5++1+seereason1~jaunty1",-      "     libghc6-regex-base-prof:  0.93.1-5+seereason1~jaunty1  -> 0.93.1-5++1+seereason1~jaunty1",-      "     libghc6-regex-posix-dev:  0.93.2-4+seereason1~jaunty1  -> 0.93.2-4+seereason1~jaunty2",-      "     libghc6-regex-posix-prof: 0.93.2-4+seereason1~jaunty1  -> 0.93.2-4+seereason1~jaunty2",-      "",-      " -- SeeReason Autobuilder <autobuilder@seereason.org>  Fri, 25 Dec 2009 01:55:37 -0800",-      "",-      "haskell-regex-compat (0.92-3) unstable; urgency=low",-      "",-      "  [ Joachim Breitner ]",-      "  * Adjust priority according to override file",-      "  * Depend on hscolour (Closes: #550769)",-      "",-      "  [ Marco Túlio Gontijo e Silva ]",-      "  * debian/control: Use more sintetic name for Vcs-Darcs.",-      "",-      " -- Joachim Breitner <nomeata@debian.org>  Mon, 20 Jul 2009 13:05:35 +0200",-      "",-      "haskell-regex-compat (0.92-2) unstable; urgency=low",-      "",-      "  * Adopt package for the Debian Haskell Group",-      "  * Fix \"FTBFS with new dpkg-dev\" by adding comma to debian/control",-      "    (Closes: #536473)",-      "",-      " -- Joachim Breitner <nomeata@debian.org>  Mon, 20 Jul 2009 12:05:40 +0200",-      "",-      "haskell-regex-compat (0.92-1.1) unstable; urgency=low",-      "",-      "  * Rebuild for GHC 6.10.",-      "  * NMU with permission of the author.",-      "",-      " -- John Goerzen <jgoerzen@complete.org>  Mon, 16 Mar 2009 10:12:04 -0500",-      "",-      "haskell-regex-compat (0.92-1) unstable; urgency=low",-      "",-      "  * New upstream release",-      "  * debian/control:",-      "    - Bump Standards-Version. No changes needed.",-      "",-      " -- Arjan Oosting <arjan@debian.org>  Sun, 18 Jan 2009 00:05:02 +0100",-      "",-      "haskell-regex-compat (0.91-1) unstable; urgency=low",-      "",-      "  * Take over package from Ian, as I already maintain haskell-regex-base,",-      "    and move Ian to the Uploaders field.",-      "  * Packaging complete redone (based on my haskell-regex-base package).",-      "",-      " -- Arjan Oosting <arjan@debian.org>  Sat, 19 Jan 2008 16:48:39 +0100",-      "",-      "haskell-regex-compat (0.71.0.1-1) unstable; urgency=low",-      " ",-      "  * Initial release (used to be part of ghc6).",-      "  * Using \"Generic Haskell cabal library packaging files v9\".",-      "  ",-      " -- Ian Lynagh (wibble) <igloo@debian.org>  Wed, 21 Nov 2007 01:26:57 +0000"]
− debian-haskell/Debian/Control.hs
@@ -1,74 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--- |A module for working with Debian control files <http://www.debian.org/doc/debian-policy/ch-controlfields.html>-module Debian.Control-    ( -- * Types-      Control'(..)-    , Paragraph'(..)-    , Field'(..)-    , Control-    , Paragraph-    , Field-    , ControlParser-    , ControlFunctions(..)-    -- * Control File Parser-    , pControl-    -- * Helper Functions-    , mergeControls-    , fieldValue-    , removeField-    , prependFields-    , appendFields-    , renameField-    , modifyField-    , raiseFields-    , packParagraph-    , packField-    , formatControl-    , formatParagraph-    , formatField-    -- * Policy classes and functions-    , P.HasDebianControl(..)-    , P.ControlFileError(..)-    , P.parseDebianControlFromFile-    , P.validateDebianControl-    , P.unsafeDebianControl-    , P.debianSourceParagraph-    , P.debianBinaryParagraphs-    , P.debianPackageParagraphs-    , P.debianPackageNames-    , P.debianSourcePackageName-    , P.debianBinaryPackageNames-    , P.debianRelations-    , P.debianBuildDeps-    , P.debianBuildDepsIndep-    ) where----import Control.Monad---import Data.List---import Text.ParserCombinators.Parsec---import System.IO-import Debian.Control.Common-import Debian.Control.String-import Data.List-import Data.Text as T (Text, pack, concat)-import qualified Debian.Control.Text as T-import qualified Debian.Control.ByteString as B ()-import qualified Debian.Control.Policy as P-import qualified Debian.Control.String as S--packParagraph :: S.Paragraph -> T.Paragraph-packParagraph (S.Paragraph s) = T.Paragraph (map packField s)--packField :: Field' String -> Field' Text-packField (S.Field (name, value)) = T.Field (T.pack name, T.pack value)-packField (S.Comment s) = T.Comment (T.pack s)--formatControl :: Control' Text -> [Text]-formatControl (T.Control paragraphs) = intersperse (T.pack "\n") . map formatParagraph $ paragraphs--formatParagraph :: Paragraph' Text -> Text-formatParagraph (T.Paragraph fields) = T.concat . map formatField $ fields--formatField :: Field' Text -> Text-formatField (T.Field (name, value)) = T.concat [name, T.pack ":", value, T.pack "\n"]-formatField (T.Comment s) = s
− debian-haskell/Debian/Control/ByteString.hs
@@ -1,289 +0,0 @@-{-# LANGUAGE CPP, FlexibleContexts, MultiParamTypeClasses, PackageImports, ScopedTypeVariables #-}-{-# OPTIONS_GHC -fno-warn-name-shadowing -fno-warn-orphans #-}-module Debian.Control.ByteString-    ( Control'(..)-    , Paragraph'(..)-    , Field'(..)-    , Control-    , Paragraph-    , Field-    , ControlFunctions(..)-    -- * Helper Functions-    , mergeControls-    , fieldValue-    , removeField-    , prependFields-    , appendFields-    , renameField-    , modifyField-    , raiseFields-    ) where---- Standard GHC modules--#if !MIN_VERSION_base(4,8,0)-import Control.Applicative (Applicative(..))-#endif-import Control.Applicative (Alternative(..))-import qualified Control.Exception as E-import "mtl" Control.Monad.State--import Data.Char(toLower, isSpace, chr, ord)-import Data.Word (Word8)-import Data.List-import qualified Data.ListLike as LL-import qualified Data.ListLike.String as LL--import Text.ParserCombinators.Parsec.Error-import Text.ParserCombinators.Parsec.Pos---- Third Party Modules--import qualified Data.ByteString.Char8 as C--import Debian.Control.Common hiding (protectFieldText')---- Local Modules---- import ByteStreamParser---- * Types-{--newtype Control = Control [Paragraph]-newtype Paragraph = Paragraph [Field]-newtype Field = Field (C.ByteString, C.ByteString)--}--type Control = Control' C.ByteString-type Paragraph = Paragraph' C.ByteString-type Field = Field'  C.ByteString--- * Control Parser--type ControlParser a = Parser C.ByteString a--pKey :: ControlParser C.ByteString-pKey = notEmpty $ pTakeWhile (\c -> (c /= ':') && (c /= '\n'))--pValue :: ControlParser C.ByteString-pValue = Parser $ \bs ->-    let newlines = C.elemIndices '\n' bs-        rest = dropWhile continuedAfter newlines ++ [C.length bs]-        continuedAfter i = bs `safeIndex` (i+1) `elem` map Just " \t#"-        (text, bs') = C.splitAt (head rest) bs-    in Ok (text, bs')--pField :: ControlParser Field-pField =-    do k <- pKey-       _ <- pChar ':'-       v <- pValue---       pChar '\n'-       (pChar '\n' >> return ()) <|> pEOF-       return (Field (k,v))--pComment :: ControlParser Field-pComment = Parser $ \bs ->-    let newlines = C.elemIndices '\n' bs-        linestarts = 0 : map (+1) newlines-        rest = dropWhile commentAt linestarts ++ [C.length bs]-        commentAt i = bs `safeIndex` i == Just '#'-        (text, bs') = C.splitAt (head rest) bs-    in if C.null text-       then Empty-       else Ok (Comment text, bs')--pParagraph :: ControlParser Paragraph-pParagraph =-    do f <- pMany1 (pComment <|> pField)-       pSkipMany (pChar '\n')-       return (Paragraph f)--pControl :: ControlParser Control-pControl =-    do pSkipMany (pChar '\n')-       c <- pMany pParagraph-       return (Control c)----- parseControlFromFile :: FilePath -> IO (Either String Control)--instance ControlFunctions C.ByteString where-    parseControlFromFile fp =-        do c <- C.readFile fp-           case parse pControl c of-             Nothing -> return (Left (newErrorMessage (Message ("Failed to parse " ++ fp)) (newPos fp 0 0)))-             (Just (cntl,_)) -> return (Right cntl)-    parseControlFromHandle sourceName handle =-        E.try (C.hGetContents handle) >>=-        either (\ (e :: E.SomeException) -> error ("parseControlFromHandle ByteString: Failure parsing " ++ sourceName ++ ": " ++ show e)) (return . parseControl sourceName)-    parseControl sourceName c =-        do case parse pControl c of-             Nothing -> Left (newErrorMessage (Message ("Failed to parse " ++ sourceName)) (newPos sourceName 0 0))-             Just (cntl,_) -> Right cntl-    lookupP fieldName (Paragraph fields) =-        let pFieldName = C.pack (map toLower fieldName) in-        find (\ (Field (fieldName',_)) -> C.map toLower fieldName' == pFieldName) fields-    -- NOTE: probably inefficient-    stripWS = C.reverse . strip . C.reverse . strip-        where strip = C.dropWhile (flip elem " \t")-    protectFieldText = protectFieldText'-    asString = C.unpack--protectFieldText' :: (LL.StringLike a, LL.ListLike a Word8) => ControlFunctions a => a -> a-protectFieldText' s =-    case LL.lines s of-      [] -> LL.empty-      (l : ls) -> dropWhileEnd (isSpace . chr . fromIntegral) $ LL.unlines $ l : map protect ls-    where-      dropWhileEnd :: (LL.StringLike a, LL.ListLike a Word8) => (Word8 -> Bool) -> a -> a-      dropWhileEnd func = LL.reverse . LL.dropWhile func . LL.reverse -- foldr (\x xs -> if func x && LL.null xs then LL.empty else LL.cons x xs) empty-      protect :: (LL.StringLike a, LL.ListLike a Word8) => a -> a-      protect l = maybe LL.empty (\ c -> if isHorizSpace c then l else LL.cons (ord' ' ' :: Word8) l) (LL.find (const True :: Word8 -> Bool) l)-      -- isSpace' = isSpace . chr'-      isHorizSpace c = elem c (map ord' " \t")-      ord' = fromIntegral . ord-      -- chr' = chr . fromIntegral--{--main =-    do [fp] <- getArgs-       C.readFile fp >>= \c -> maybe (putStrLn "failed.") (print . length . fst) (parse pControl c)--}--- * Helper Functions--safeIndex :: C.ByteString -> Int -> Maybe Char-bs `safeIndex` i = if i < C.length bs then Just (bs `C.index` i) else Nothing---- * Parser--data Result a-    = Ok a-    | Fail-    | Empty-      deriving Show---- m2r :: Maybe a -> Result a--- m2r (Just a) = Ok a--- m2r Nothing = Empty--r2m :: Result a -> Maybe a-r2m (Ok a) = Just a-r2m _ = Nothing--newtype Parser state a = Parser { unParser :: (state -> Result (a, state)) }--instance Functor (Parser state) where-    fmap f m =-        Parser $ \ state ->-            let r = (unParser m) state in-            case r of-              Ok (a,state') -> Ok (f a,state')-              Empty -> Empty-              Fail -> Fail--instance Applicative (Parser state) where-    pure = return-    (<*>) = ap--instance Alternative (Parser state) where-    empty =-        Parser $ \state ->-            (unParser mzero) state-    (<|>) = mplus--instance Monad (Parser state) where-    return a = Parser (\s -> Ok (a,s))-    m >>= f =-        Parser $ \state ->-            let r = (unParser m) state in-            case r of-              Ok (a,state') ->-                  case unParser (f a) $ state' of-                    Empty -> Fail-                    o -> o-              Empty -> Empty-              Fail -> Fail--instance MonadPlus (Parser state) where-    mzero = Parser (const Empty)-    mplus (Parser p1) (Parser p2) =-        Parser (\s -> case p1 s of-                        Empty -> p2 s-                        o -> o-               )----       Parser (\s -> maybe (p2 s) (Just) (p1 s))---_pSucceed :: a -> Parser state a-_pSucceed = return--_pFail :: Parser state a-_pFail = Parser (const Empty)---satisfy :: (Char -> Bool) -> Parser C.ByteString Char-satisfy f =-    Parser $ \bs ->-        if C.null bs-        then Empty-        else let (s,ss) = (C.head bs, C.tail bs) in-             if (f s)-                then Ok (s,ss)-                else Empty--pChar :: Char -> Parser C.ByteString Char-pChar c = satisfy ((==) c)---_try :: Parser state a -> Parser state a-_try (Parser p) =-    Parser $ \bs -> case (p bs) of-                      Fail -> Empty-                      o -> o--pEOF :: Parser C.ByteString ()-pEOF =-    Parser $ \bs -> if C.null bs then Ok ((),bs) else Empty--pTakeWhile :: (Char -> Bool) -> Parser C.ByteString C.ByteString-pTakeWhile f =-    Parser $ \bs -> Ok (C.span f bs)--_pSkipWhile :: (Char -> Bool) -> Parser C.ByteString ()-_pSkipWhile p =-    Parser $ \bs -> Ok ((), C.dropWhile p bs)--pMany ::  Parser st a -> Parser st [a]-pMany p-    = scan id-    where-      scan f = do x <- p-                  scan (\tail -> f (x:tail))-               <|> return (f [])--notEmpty :: Parser st C.ByteString -> Parser st C.ByteString-notEmpty (Parser p) =-    Parser $ \s -> case p s of-                     o@(Ok (a, _s)) ->-                         if C.null a-                         then Empty-                         else o-                     x -> x--pMany1 :: Parser st a -> Parser st [a]-pMany1 p =-    do x <- p-       xs <- pMany p-       return (x:xs)--pSkipMany :: Parser st a -> Parser st ()-pSkipMany p = scan-    where-      scan = (p >> scan) <|> return ()--_pSkipMany1 :: Parser st a -> Parser st ()-_pSkipMany1 p = p >> pSkipMany p--parse :: Parser state a -> state -> Maybe (a, state)-parse p s = r2m ((unParser p) s)
− debian-haskell/Debian/Control/Common.hs
@@ -1,191 +0,0 @@-{-# LANGUAGE FlexibleContexts, FlexibleInstances, OverloadedStrings, ScopedTypeVariables, UndecidableInstances #-}-module Debian.Control.Common-    ( -- * Types-      Control'(..)-    , Paragraph'(..)-    , Field'(..)-    , ControlFunctions(..)-    , mergeControls-    , fieldValue-    , removeField-    , prependFields-    , appendFields-    , renameField-    , modifyField-    , raiseFields-    , parseControlFromCmd-    , md5sumField-    , protectFieldText'-    )-    where--import Data.Char (isSpace)-import Data.List as List (dropWhileEnd, partition, intersperse)-import Data.ListLike as LL (ListLike, cons, dropWhileEnd, empty, find, null, singleton)-import Data.ListLike.String as LL (StringLike, lines, unlines)-import Data.Monoid ((<>))-import Debian.Pretty (PP(..))-import System.Exit (ExitCode(ExitSuccess, ExitFailure))-import System.IO (Handle)-import System.Process (runInteractiveCommand, waitForProcess)-import Text.ParserCombinators.Parsec (ParseError)-import Text.PrettyPrint (Doc, text, hcat)-import Text.PrettyPrint.HughesPJClass (Pretty(pPrint))--newtype Control' a-    = Control { unControl :: [Paragraph' a] } deriving (Eq, Ord, Read, Show)--newtype Paragraph' a-    = Paragraph [Field' a]-    deriving (Eq, Ord, Read, Show)---- |NOTE: we do not strip the leading or trailing whitespace in the--- name or value-data Field' a-    = Field (a, a)-    | Comment a     -- ^ Lines beginning with #-      deriving (Eq, Ord, Read, Show)--class ControlFunctions a where-    -- |'parseControlFromFile' @filepath@ is a simple wrapper function-    -- that parses @filepath@ using 'pControl'-    parseControlFromFile :: FilePath -> IO (Either ParseError (Control' a))-    -- |'parseControlFromHandle' @sourceName@ @handle@ - @sourceName@ is only used for error reporting-    parseControlFromHandle :: String -> Handle -> IO (Either ParseError (Control' a))-    -- |'parseControlFromString' @sourceName@ @text@ - @sourceName@ is only used for error reporting-    parseControl :: String -> a -> (Either ParseError (Control' a))-    -- | 'lookupP' @fieldName paragraph@ looks up a 'Field' in a 'Paragraph'.-    -- @N.B.@ trailing and leading whitespace is /not/ stripped.-    lookupP :: String -> (Paragraph' a) -> Maybe (Field' a)-    -- |Strip the trailing and leading space and tab characters from a-    -- string. Folded whitespace is /not/ unfolded. This should probably-    -- be moved to someplace more general purpose.-    stripWS :: a -> a-    -- |Protect field value text so the parser doesn't split it into-    -- multiple fields or paragraphs.  This must modify all field text-    -- to enforce two conditions: (1) All lines other than the initial-    -- one must begin with a space or a tab, and (2) the trailing-    -- white space must not contain newlines.  This is called before-    -- pretty printing to prevent the parser from misinterpreting-    -- field text as multiple fields or paragraphs.-    protectFieldText :: a -> a-    asString :: a -> String---- | This can usually be used as the implementation of protectFieldText-protectFieldText' :: forall a. (StringLike a, ListLike a Char) => ControlFunctions a => a -> a-protectFieldText' s =-    let trimmedLines :: [a]-        trimmedLines = map (LL.dropWhileEnd isSpace :: a -> a) $ (LL.lines s :: [a])-        strippedLines :: [a]-        strippedLines = List.dropWhileEnd LL.null trimmedLines in-    -- Split the text into lines, drop trailing whitespace from each-    -- line, and drop trailing blank lines.-    case strippedLines of-      [] -> empty-      (l : ls) ->-          let -- The first line is indented one space-              l' = {-LL.cons ' '-} l-              -- Null lines are replaced by a single '.'  If any line-              -- is unindented, all will get an additional space of-              -- indentation.-              ls' = case all indented ls of-                      True -> map (\ x -> if LL.null x then (LL.cons ' ' $ singleton '.') else x) ls-                      False -> map (LL.cons ' ') $ map (\ x -> if LL.null x then (singleton '.') else x) ls in-          LL.dropWhileEnd isSpace (LL.unlines (l' : ls'))-    where-      indented l = maybe True isSpace (LL.find (const True) l)---- | This may have bad performance issues (dsf: Whoever wrote this--- comment should have explained why.)-instance (ControlFunctions a, Pretty (PP a)) => Pretty (Control' a) where-    pPrint = ppControl-instance (ControlFunctions a, Pretty (PP a)) => Pretty (Paragraph' a) where-    pPrint = ppParagraph--instance (ControlFunctions a, Pretty (PP a)) => Pretty (Field' a) where-    pPrint = ppField--ppControl :: (ControlFunctions a, Pretty (PP a)) => Control' a -> Doc-ppControl (Control paragraph) =-    hcat (intersperse (text "\n") (map ppParagraph paragraph))--ppParagraph :: (ControlFunctions a, Pretty (PP a)) => Paragraph' a -> Doc-ppParagraph (Paragraph fields) =-    hcat (map (\ x -> ppField x <> text "\n") fields)--ppField :: (ControlFunctions a, Pretty (PP a)) => Field' a -> Doc-ppField (Field (n,v)) = pPrint (PP n) <> text ":" <> pPrint (PP (protectFieldText v))-ppField (Comment c) = pPrint (PP c)--mergeControls :: [Control' a] -> Control' a-mergeControls controls =-    Control (concatMap unControl controls)--fieldValue :: (ControlFunctions a) => String -> Paragraph' a -> Maybe a-fieldValue fieldName paragraph =-    case lookupP fieldName paragraph of-      Just (Field (_, val)) -> Just $ stripWS val-      _ -> Nothing--removeField :: (Eq a) => a -> Paragraph' a -> Paragraph' a-removeField toRemove (Paragraph fields) =-    Paragraph (filter remove fields)-    where-      remove (Field (name,_)) = name == toRemove-      remove (Comment _) = False--prependFields :: [Field' a] -> Paragraph' a -> Paragraph' a-prependFields newfields (Paragraph fields) = Paragraph (newfields ++ fields)--appendFields :: [Field' a] -> Paragraph' a -> Paragraph' a-appendFields newfields (Paragraph fields) = Paragraph (fields ++ newfields)--renameField :: (Eq a) => a -> a -> Paragraph' a -> Paragraph' a-renameField oldname newname (Paragraph fields) =-    Paragraph (map rename fields)-    where-      rename (Field (name, value)) | name == oldname = Field (newname, value)-      rename field = field--modifyField :: (Eq a) => a -> (a -> a) -> Paragraph' a -> Paragraph' a-modifyField name f (Paragraph fields) =-    Paragraph (map modify fields)-    where-      modify (Field (name', value)) | name' == name = Field (name, f value)-      modify field = field---- | Move selected fields to the beginning of a paragraph.-raiseFields :: (Eq a) => (a -> Bool) -> Paragraph' a -> Paragraph' a-raiseFields f (Paragraph fields) =-    let (a, b) = partition f' fields in Paragraph (a ++ b)-    where f' (Field (name, _)) = f name-          f' (Comment _) = False---- | Run a command and parse its output as a control file.-parseControlFromCmd :: ControlFunctions a => String -> IO (Either String (Control' a))-parseControlFromCmd cmd =-    do-      (_, outh, _, handle) <- runInteractiveCommand cmd-      result <- parseControlFromHandle cmd outh-      either (return . Left . show) (finish handle) result-    where-      finish handle control =-          do-            exitCode <- waitForProcess handle-            case exitCode of-              ExitSuccess -> return $ Right control-              ExitFailure n -> return $ Left ("Failure: " ++ cmd ++ " -> " ++ show n)---- |look up the md5sum file in a paragraph--- Tries several different variations:---  MD5Sum:---  Md5Sum:---  MD5sum:-md5sumField :: (ControlFunctions a) => Paragraph' a -> Maybe a-md5sumField p =-    case fieldValue "MD5Sum" p of-      m@(Just _) -> m-      Nothing ->-          case fieldValue "Md5Sum" p of-            m@(Just _) -> m-            Nothing -> fieldValue "MD5sum" p
− debian-haskell/Debian/Control/Policy.hs
@@ -1,180 +0,0 @@-{-# LANGUAGE CPP, DeriveDataTypeable, FlexibleContexts, FlexibleInstances, FunctionalDependencies, MultiParamTypeClasses, RecordWildCards, ScopedTypeVariables, TemplateHaskell #-}-{-# OPTIONS_GHC -Wall #-}--- | Access to things that Debian policy says should be in a valid--- control file.  The pure functions will not throw ControlFileError--- if they are operating on a DebianControl value returned by--- validateDebianControl.  However, they might if they are created--- using unsafeDebianControl.-module Debian.Control.Policy-    ( -- * Validated debian control file type-      DebianControl(unDebianControl)-    , validateDebianControl-    , unsafeDebianControl-    , parseDebianControlFromFile-    , parseDebianControl-    , ControlFileError(..)-    -- * Class of things that contain one DebianControl value-    , HasDebianControl(debianControl)-    -- * Pure functions that operate on validated control files-    , debianSourceParagraph-    , debianBinaryParagraphs-    , debianPackageParagraphs-    , debianPackageNames-    , debianSourcePackageName-    , debianBinaryPackageNames-    , debianRelations-    , debianBuildDeps-    , debianBuildDepsIndep-    ) where--import Control.Exception (Exception, throw)-import Control.Monad.Catch (MonadCatch, try)-import Data.List (intercalate)-import Data.Text (Text)-import Data.Typeable (Typeable)-import Data.ListLike (toList)-import Debian.Control.Common (Control'(..), Paragraph'(..), Field'(..), fieldValue, ControlFunctions(parseControlFromFile, parseControl))-import Debian.Control.Text ()-import Debian.Loc (__LOC__)-import Debian.Pretty (prettyShow)-import Debian.Relation (SrcPkgName(..), BinPkgName(..), Relations, parseRelations)-import Debian.Relation.Text ()-import Language.Haskell.TH (Loc(..))-import Prelude hiding (ioError)--- import qualified Debug.ShowPlease as Please-import Text.Parsec.Error (ParseError)---- | Opaque (constructor not exported) type to hold a validated Debian--- Control File-data DebianControl = DebianControl {unDebianControl :: Control' Text}--instance Show DebianControl where-    show c = "(parseDebianControl \"\" " ++ show (prettyShow (unDebianControl c)) ++ ")"---- | Validate and return a control file in an opaque wrapper.  May--- throw a ControlFileError.  Currently we only verify that it has a--- Source field in the first paragraph and one or more subsequent--- paragraphs each with a Package field, and no syntax errors in the--- build dependencies (though they may be absent.)-validateDebianControl :: MonadCatch m => Control' Text -> m (Either ControlFileError DebianControl)-validateDebianControl ctl =-    try (do _ <- return $ debianPackageNames (DebianControl ctl)-            _ <- return $ debianBuildDeps (DebianControl ctl)-            _ <- return $ debianBuildDepsIndep (DebianControl ctl)-            return ()) >>=-    return . either Left (\ _ -> Right $ DebianControl ctl)--unsafeDebianControl :: Control' Text -> DebianControl-unsafeDebianControl = DebianControl--parseDebianControl :: MonadCatch m => String -> Text -> m (Either ControlFileError DebianControl)-parseDebianControl sourceName s = either (return . Left . ParseControlError [$__LOC__]) validateDebianControl (parseControl sourceName s)--parseDebianControlFromFile :: FilePath -> IO (Either ControlFileError DebianControl)-parseDebianControlFromFile controlPath =-  try (parseControlFromFile controlPath) >>=-  either (return . Left . IOError [$__LOC__])-         (either (return . Left . ParseControlError [$__LOC__]) validateDebianControl)---- | Class of things that contain a validated Debian control file.-class HasDebianControl a where-    debianControl :: a -> DebianControl--instance HasDebianControl DebianControl where-    debianControl = id--class HasControl a where-    control :: a -> Control' Text--instance HasControl (Control' Text) where-    control = id--instance HasControl DebianControl where-    control = unDebianControl---- | Errors that control files might throw, with source file name and--- line number generated by template haskell.-data ControlFileError-    = NoParagraphs        {locs :: [Loc]}-    | NoBinaryParagraphs  {locs :: [Loc]}-    | MissingField        {locs :: [Loc], field :: String}-    | ParseRelationsError {locs :: [Loc], parseError :: ParseError}-    | ParseControlError   {locs :: [Loc], parseError :: ParseError}-    | IOError             {locs :: [Loc], ioError :: IOError}-    deriving Typeable--instance Show ControlFileError where-    show (NoParagraphs {..}) = intercalate ", " (map showLoc locs) ++ ": NoParagraphs"-    show (NoBinaryParagraphs {..}) = intercalate ", " (map showLoc locs) ++ ": NoBinaryParagraphs"-    show (MissingField {..}) = intercalate ", " (map showLoc locs) ++ ": MissingField " ++ show field-    show (ParseRelationsError {..}) = intercalate ", " (map showLoc locs) ++ ": ParseRelationsError " ++ show parseError-    show (ParseControlError {..}) = intercalate ", " (map showLoc locs) ++ ": ParseControlError " ++ show parseError-    show (IOError {..}) = intercalate ", " (map showLoc locs) ++ ": IOError " ++ show ioError--showLoc :: Loc -> String-showLoc x = show (loc_filename x) ++ "(line " ++ show (fst (loc_start x)) ++ ", column " ++ show (snd (loc_start x)) ++ ")"---- instance Please.Show ControlFileError where---     show (IOError e) = "(IOError " ++ Please.show e ++ ")"---     show (ParseRelationsError e) = "(ParseRelationsError " ++ Please.show e ++ ")"---     show (ParseControlError e) = "(ParseControlError " ++ Please.show e ++ ")"---     show x = show x--instance Exception ControlFileError--instance Eq ControlFileError where-    _ == _ = False--debianPackageParagraphs :: HasDebianControl a => a -> (Paragraph' Text, [Paragraph' Text])-debianPackageParagraphs ctl =-    case removeCommentParagraphs ctl of-      DebianControl (Control [_]) -> throw $ NoBinaryParagraphs [$__LOC__]-      DebianControl (Control []) -> throw $ NoParagraphs [$__LOC__]-      DebianControl (Control (sourceParagraph : binParagraphs)) -> (sourceParagraph, binParagraphs)---- | Comment paragraphs are rare, but they happen.-removeCommentParagraphs :: HasDebianControl a => a -> DebianControl-removeCommentParagraphs c =-    DebianControl (Control (filter (not . isCommentParagraph) (unControl (unDebianControl (debianControl c)))))-    where-      isCommentParagraph (Paragraph fields) = all isCommentField fields-      isCommentField (Comment _) = True-      isCommentField _ = False--debianSourceParagraph :: HasDebianControl a => a -> Paragraph' Text-debianSourceParagraph = fst . debianPackageParagraphs--debianBinaryParagraphs :: HasDebianControl a => a -> [Paragraph' Text]-debianBinaryParagraphs = snd . debianPackageParagraphs--debianPackageNames :: HasDebianControl a => a -> (SrcPkgName, [BinPkgName])-debianPackageNames c =-  let (srcParagraph, binParagraphs) = debianPackageParagraphs c in-  (mapFieldValue (SrcPkgName . toList) "Source" srcParagraph, map (mapFieldValue (BinPkgName . toList) "Package") binParagraphs)--debianSourcePackageName :: HasDebianControl a => a -> SrcPkgName-debianSourcePackageName = fst . debianPackageNames--debianBinaryPackageNames :: HasDebianControl a => a -> [BinPkgName]-debianBinaryPackageNames = snd . debianPackageNames--debianBuildDepsIndep :: HasDebianControl a => a -> Maybe Relations-debianBuildDepsIndep ctl = either throw id $ debianRelations "Build-Depends-Indep" (debianControl ctl)--debianBuildDeps :: HasDebianControl a => a -> Maybe Relations-debianBuildDeps ctl = either throw id $ debianRelations "Build-Depends" (debianControl ctl)---- | Version of fieldValue that may throw a ControlFileError.  We only--- use this internally on fields that we already validated.-fieldValue' :: ControlFunctions text => String -> Paragraph' text -> text-fieldValue' fieldName paragraph = maybe (throw $ MissingField [$__LOC__] fieldName) id $ fieldValue fieldName paragraph---- | This could access fields we haven't validated, so--- it can return an error.  Additionally, the field might--- be absent, in which case it returns Nothing.-debianRelations :: HasDebianControl a => String -> a -> Either ControlFileError (Maybe Relations)-debianRelations fieldName ctl = maybe (Right Nothing) (either (Left . ParseRelationsError [$__LOC__]) (Right . Just) . parseRelations) $ fieldValue fieldName (debianSourceParagraph ctl)---- | Apply a function to the text from a named field in a control file paragraph.-mapFieldValue :: (Text -> a) -> String -> Paragraph' Text -> a-mapFieldValue f fieldName paragraph = f $ fieldValue' fieldName paragraph
− debian-haskell/Debian/Control/String.hs
@@ -1,110 +0,0 @@-{-# LANGUAGE FlexibleInstances, ScopedTypeVariables, TypeSynonymInstances #-}-{-# OPTIONS_GHC -fno-warn-orphans -fno-warn-name-shadowing -fno-warn-unused-do-bind #-}-module Debian.Control.String-    ( -- * Types-      Control'(..)-    , Paragraph'(..)-    , Field'(..)-    , Control-    , Paragraph-    , Field-    , ControlParser-    , ControlFunctions(..)-    -- * Control File Parser-    , pControl-    -- * Helper Functions-    , mergeControls-    , fieldValue-    , removeField-    , prependFields-    , appendFields-    , renameField-    , modifyField-    , raiseFields-    ) where--import qualified Control.Exception as E-import Data.Char (toLower)-import Data.List (find)-import Debian.Control.Common (ControlFunctions(parseControlFromFile, parseControlFromHandle, parseControl, lookupP, stripWS, protectFieldText, asString),-                              Control'(Control), Paragraph'(Paragraph), Field'(Field, Comment),-                              mergeControls, fieldValue, removeField, prependFields, appendFields,-                              renameField, modifyField, raiseFields, protectFieldText')-import System.IO (hGetContents)-import Text.ParserCombinators.Parsec (CharParser, parse, parseFromFile, sepEndBy, satisfy, oneOf, string, lookAhead, try, many, many1, (<|>), noneOf, char, eof)--type Field = Field' String-type Control = Control' String-type Paragraph = Paragraph' String---- * ControlFunctions--instance ControlFunctions String where-    parseControlFromFile filepath =-        parseFromFile pControl filepath-    parseControlFromHandle sourceName handle =-        E.try (hGetContents handle) >>=-        either (\ (e :: E.SomeException) -> error ("parseControlFromHandle String: Failure parsing " ++ sourceName ++ ": " ++ show e)) (return . parseControl sourceName)-    parseControl sourceName c =-        parse pControl sourceName c-    lookupP fieldName (Paragraph paragraph) =-        find (hasFieldName (map toLower fieldName)) paragraph-        where hasFieldName name (Field (fieldName',_)) = name == map toLower fieldName'-              hasFieldName _ _ = False-    stripWS = reverse . strip . reverse . strip-        where strip = dropWhile (flip elem " \t")-    protectFieldText = protectFieldText'-    asString = id---- * Control File Parser--type ControlParser a = CharParser () a---- |A parser for debian control file. This parser handles control files--- that end without a newline as well as ones that have several blank--- lines at the end. It is very liberal and does not attempt validate--- the fields in any way. All trailing, leading, and folded whitespace--- is preserved in the field values. See 'stripWS'.-pControl :: ControlParser Control-pControl =-    do many $ char '\n'-       sepEndBy pParagraph pBlanks >>= return . Control--pParagraph :: ControlParser Paragraph-pParagraph = many1 (pComment <|> pField) >>= return . Paragraph---- |We are liberal in that we allow *any* field to have folded white--- space, even though the specific restricts that to a few fields.-pField :: ControlParser Field-pField =-    do c1 <- noneOf "#\n"-       fieldName <-  many1 $ noneOf ":\n"-       char ':'-       fieldValue <- many fcharfws-       (char '\n' >> return ()) <|> eof-       return $ Field (c1 : fieldName, fieldValue)--pComment :: ControlParser Field-pComment =-    do char '#'-       text <- many (satisfy (not . ((==) '\n')))-       char '\n'-       return $ Comment ("#" ++ text ++ "\n")--fcharfws :: ControlParser Char-fcharfws = fchar <|> (try $ lookAhead (string "\n ") >> char '\n') <|> (try $ lookAhead (string "\n\t") >> char '\n') <|> (try $ lookAhead (string "\n#") >> char '\n')--fchar :: ControlParser Char-fchar = satisfy (/='\n')--_fws :: ControlParser String-_fws =-    try $ do char '\n'-             ws <- many1 (char ' ')-             c <- many1 (satisfy (not . ((==) '\n')))-             return $ '\n' : (ws ++ c)---- |We go with the assumption that 'blank lines' mean lines that--- consist of entirely of zero or more whitespace characters.-pBlanks :: ControlParser String-pBlanks = many1 (oneOf " \n")
− debian-haskell/Debian/Control/Text.hs
@@ -1,155 +0,0 @@-{-# LANGUAGE FlexibleInstances, OverloadedStrings, ScopedTypeVariables, TypeSynonymInstances #-}-{-# OPTIONS_GHC -fno-warn-orphans -fno-warn-name-shadowing -fno-warn-unused-do-bind #-}-module Debian.Control.Text-    ( -- * Types-      Control'(..)-    , Paragraph'(..)-    , Field'(..)-    , Control-    , Paragraph-    , Field-    -- , ControlParser-    , ControlFunctions(..)-    -- * Control File Parser-    -- , pControl-    -- * Helper Functions-    , mergeControls-    , fieldValue-    , removeField-    , prependFields-    , appendFields-    , renameField-    , modifyField-    , raiseFields-    , decodeControl-    , decodeParagraph-    , decodeField-    ) where--import qualified Data.ByteString.Char8 as B-import Data.Char (toLower, chr)-import Data.List (find)-import qualified Data.Text as T (Text, pack, unpack, map, dropAround, reverse)-import Data.Text.Encoding (decodeUtf8With, encodeUtf8)---import Data.Text.IO as T (readFile)-import qualified Debian.Control.ByteString as B---import Text.Parsec.Error (ParseError)---import Text.Parsec.Text (Parser)---import Text.Parsec.Prim (runP)-import Debian.Control.Common (ControlFunctions(parseControlFromFile, parseControlFromHandle, parseControl, lookupP, stripWS, asString),-                              Control'(Control), Paragraph'(Paragraph), Field'(Field, Comment),-                              mergeControls, fieldValue, removeField, prependFields, appendFields,-                              renameField, modifyField, raiseFields, protectFieldText')---- | @parseFromFile p filePath@ runs a string parser @p@ on the--- input read from @filePath@ using 'Prelude.readFile'. Returns either a 'ParseError'--- ('Left') or a value of type @a@ ('Right').------ >  main    = do{ result <- parseFromFile numbers "digits.txt"--- >              ; case result of--- >                  Left err  -> print err--- >                  Right xs  -> print (sum xs)--- >              }-{--parseFromFile :: Parser a -> String -> IO (Either ParseError a)-parseFromFile p fname-    = do input <- T.readFile fname `E.catch` (\ (_ :: E.SomeException) -> B.readFile fname >>= return . decode)-         return (runP p () fname input)--}--type Field = Field' T.Text-type Control = Control' T.Text-type Paragraph = Paragraph' T.Text--decodeControl :: B.Control -> Control-decodeControl (B.Control paragraphs) = Control (map decodeParagraph paragraphs)--decodeParagraph :: B.Paragraph -> Paragraph-decodeParagraph (B.Paragraph s) = B.Paragraph (map decodeField s)--decodeField :: Field' B.ByteString -> Field' T.Text-decodeField (B.Field (name, value)) = Field (decode name, decode value)-decodeField (B.Comment s) = Comment (decode s)--decode :: B.ByteString -> T.Text-decode = decodeUtf8With (\ _ w -> fmap (chr . fromIntegral) w)---- * ControlFunctions--instance ControlFunctions T.Text where-    parseControlFromFile filepath =-        -- The ByteString parser is far more efficient than the Text-        -- parser.  By calling decodeControl we tell the compiler to-        -- use it instead.-        parseControlFromFile filepath >>= return . either Left (Right . decodeControl)-    parseControlFromHandle sourceName handle =-        parseControlFromHandle sourceName handle >>= return . either Left (Right . decodeControl)-    parseControl sourceName c =-        -- Warning: This is very slow, it does a utf8 round trip-        either Left (Right . decodeControl) (parseControl sourceName (encodeUtf8 c))-    lookupP fieldName (Paragraph paragraph) =-        find (hasFieldName (map toLower fieldName)) paragraph-        where hasFieldName :: String -> Field' T.Text -> Bool-              hasFieldName name (Field (fieldName',_)) = T.pack name == T.map toLower fieldName'-              hasFieldName _ _ = False-    stripWS = T.dropAround (`elem` (" \t" :: String))-      -- T.strip would also strip newlines-    protectFieldText = protectFieldText'-    asString = T.unpack---- * Control File Parser-{---- type ControlParser = GenParser T.Text-type ControlParser a = Parsec T.Text () a---- |A parser for debian control file. This parser handles control files--- that end without a newline as well as ones that have several blank--- lines at the end. It is very liberal and does not attempt validate--- the fields in any way. All trailing, leading, and folded whitespace--- is preserved in the field values. See 'stripWS'.-pControl :: ControlParser Control-pControl =-    do many $ char '\n'-       sepEndBy pParagraph pBlanks >>= return . Control--pParagraph :: ControlParser Paragraph-pParagraph = many1 (pComment <|> pField) >>= return . Paragraph---- |We are liberal in that we allow *any* field to have folded white--- space, even though the specific restricts that to a few fields.-pField :: ControlParser Field-pField =-    do c1 <- noneOf "#\n"-       fieldName <-  many1 $ noneOf ":\n"-       char ':'-       fieldValue <- many fcharfws-       (char '\n' >> return ()) <|> eof-       return $ Field (T.cons c1 (T.pack fieldName), T.pack fieldValue)--pComment :: ControlParser Field-pComment =-    do char '#'-       text <- many (satisfy (not . ((==) '\n')))-       char '\n'-       return $ Comment (T.pack ("#" <> text <> "\n"))--fcharfws :: ControlParser Char-fcharfws = fchar <|> (try $ lookAhead (string "\n ") >> char '\n') <|> (try $ lookAhead (string "\n\t") >> char '\n') <|> (try $ lookAhead (string "\n#") >> char '\n')--fchar :: ControlParser Char-fchar = satisfy (/='\n')--_fws :: ControlParser T.Text-_fws =-    try $ do char '\n'-             ws <- many1 (char ' ')-             c <- many1 (satisfy (not . ((==) '\n')))-             return $ T.cons '\n' (T.pack ws <> T.pack c)---- |We go with the assumption that 'blank lines' mean lines that--- consist of entirely of zero or more whitespace characters.-pBlanks :: ControlParser T.Text-pBlanks =-    do s <- many1 (oneOf " \n")-       return . T.pack $ s--}
− debian-haskell/Debian/Deb.hs
@@ -1,24 +0,0 @@-{-# OPTIONS_GHC -fno-warn-name-shadowing #-}-module Debian.Deb where--import Control.Monad--import Debian.Control.Common-import System.Directory (canonicalizePath)-import System.Exit (ExitCode(..))-import System.Process (readProcessWithExitCode)-import System.Unix.Directory (withTemporaryDirectory, withWorkingDirectory)--fields :: (ControlFunctions a) => FilePath -> IO (Control' a)-fields debFP =-    withTemporaryDirectory ("fields.XXXXXX") $ \tmpdir ->-      do debFP <- canonicalizePath debFP-         withWorkingDirectory 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 e -> error (show e)-                (Right c) -> return c -- I don't think we need seq because parsec will force everything from the file
− debian-haskell/Debian/Extra/Files.hs
@@ -1,31 +0,0 @@-{-# LANGUAGE PackageImports #-}--- |Domain independent functions used by the haskell-debian package.-module Debian.Extra.Files-    ( withTemporaryFile-    ) where--import "mtl" Control.Monad.Trans (MonadIO, liftIO)-import System.Directory (getTemporaryDirectory, removeFile)-import System.IO (hPutStr, hClose, openBinaryTempFile)--withTemporaryFile :: MonadIO m-                  => (FilePath -> m a)  -- ^ The function we want to pass a FilePath to-                  -> String             -- ^ The text that the file should contain-                  -> m a                -- ^ The function's return value-withTemporaryFile f text =-    do path <- liftIO writeTemporaryFile-       result <- f path-       liftIO $ removeFile path-       return result-    where-      writeTemporaryFile =-          do dir <- getTemporaryDirectory-             (path, h) <- openBinaryTempFile dir "wtf.tmp"-             hPutStr h text-             hClose h-             return path---- Example: write the path of the temporary file and its contents into /tmp/result:--- test =---   withTemporaryFile f "Some text\n"---   where f path = readFile path >>= return . (("Contents of " ++ path ++ ":\n") ++) >>= writeFile "/tmp/result"
− debian-haskell/Debian/GenBuildDeps.hs
@@ -1,329 +0,0 @@-{-# LANGUAGE CPP, FlexibleContexts, OverloadedStrings, RecordWildCards, ScopedTypeVariables, TemplateHaskell #-}--- |Figure out the dependency relation between debianized source--- directories.  The code to actually solve these dependency relations--- for a particular set of binary packages is in Debian.Repo.Dependency.-module Debian.GenBuildDeps-    ( DepInfo(..)-    , sourceName'-    , relations'-    , binaryNames'-    -- * Preparing dependency info-    , buildDependencies-    , RelaxInfo-    , relaxDeps-    -- * Using dependency info-    , BuildableInfo(..)-    , ReadyTarget(..)-    , buildable-    , compareSource-    -- * Obsolete?-    , orderSource-    , genDeps-    , failPackage-    , getSourceOrder-    ) where--#if !MIN_VERSION_base(4,8,0)-import           Control.Applicative ((<$>))-#endif-import           Control.Exception (throw)-import           Control.Monad (filterM, foldM)-import           Control.Monad.State (evalState, get, modify, State)-import           Data.Graph (Graph, Edge, Vertex, buildG, topSort, reachable, transposeG, edges, scc)-import           Data.List as List (elemIndex, find, map, nub, partition, tails)-import           Data.Map as Map (empty, findWithDefault, fromList, insert, Map, lookup)-import           Data.Maybe-import           Data.Set as Set (fromList, intersection, null, Set)-import           Data.Tree as Tree (Tree(Node, rootLabel, subForest))-import           Debian.Control (parseControlFromFile)-import           Debian.Control.Policy (HasDebianControl, DebianControl, ControlFileError(..), validateDebianControl, debianSourcePackageName, debianBinaryPackageNames, debianBuildDeps, debianBuildDepsIndep)-import           Debian.Loc (__LOC__)-import           Debian.Relation-import           Debian.Relation.Text ()--- import           Debug.Trace (trace)-import           System.Directory (getDirectoryContents, doesFileExist)---- | This type describes the build dependencies of a source package.-data DepInfo = DepInfo {-      sourceName :: SrcPkgName          -- ^ source package name-    , relations :: Relations            -- ^ dependency relations-    , binaryNames :: [BinPkgName]       -- ^ binary dependency names (is this a function of relations?)-    , depSet :: Set.Set BinPkgName          -- ^ Set containing all binary package names mentioned in relations-    , binSet :: Set.Set BinPkgName          -- ^ Set containing binaryNames-    } deriving Show--instance Eq DepInfo where-    a == b = (sourceName a == sourceName b) &&-             Set.fromList (map Set.fromList (relations a)) == Set.fromList (map Set.fromList (relations b)) &&-             Set.fromList (binaryNames a) == Set.fromList (binaryNames b)---- |Return the dependency info for a source package with the given dependency relaxation.--- |According to debian policy, only the first paragraph in debian\/control can be a source package--- <http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-sourcecontrolfiles>-buildDependencies :: HasDebianControl control => control -> DepInfo-buildDependencies control = do-  let rels = concat [fromMaybe [] (debianBuildDeps control),-                     fromMaybe [] (debianBuildDepsIndep control)]-      bins = debianBinaryPackageNames control-  DepInfo { sourceName = debianSourcePackageName control-          , relations = rels-          , binaryNames = bins-          , depSet = Set.fromList (List.map (\(Rel x _ _) -> x) (concat rels))-          , binSet = Set.fromList bins }---- | source package name-sourceName' :: HasDebianControl control => control -> SrcPkgName-sourceName' control = debianSourcePackageName control---- | dependency relations-relations' :: HasDebianControl control => control -> Relations-relations' control = concat [fromMaybe [] (debianBuildDeps control),-                            fromMaybe [] (debianBuildDepsIndep control)]---- | binary dependency names (is this a function of relations?)-binaryNames' :: HasDebianControl control => control -> [BinPkgName]-binaryNames' control = debianBinaryPackageNames control---- |Specifies build dependencies that should be ignored during the build--- decision.  If the pair is (BINARY, Nothing) it means the binary package--- BINARY should always be ignored when deciding whether to build.  If the--- pair is (BINARY, Just SOURCE) it means that binary package BINARY should--- be ignored when deiciding whether to build package SOURCE.-newtype OldRelaxInfo = RelaxInfo [(BinPkgName, Maybe SrcPkgName)] deriving Show---- | Given a source package name and a binary package name, return--- False if the binary package should be ignored hwen deciding whether--- to build the source package.  This is used to prevent build--- dependency cycles from triggering unnecessary rebuilds.  (This is a--- replacement for the RelaxInfo type, which we temporarily rename--- OldRelaxInfo.)-type RelaxInfo = SrcPkgName -> BinPkgName -> Bool---- |Remove any dependencies that are designated \"relaxed\" by relaxInfo.-relaxDeps :: RelaxInfo -> [DepInfo] -> [DepInfo]-relaxDeps relaxInfo deps =-    List.map relaxDep deps-    where-      relaxDep :: DepInfo -> DepInfo-      relaxDep info = info {relations = filteredDependencies}-          where-            -- Discard any dependencies not on the filtered package name list.  If-            -- this results in an empty list in an or-dep the entire dependency can-            -- be discarded.-            filteredDependencies :: Relations-            filteredDependencies = filter (/= []) (List.map (filter keepDep) (relations info))-            keepDep :: Relation -> Bool-            keepDep (Rel name _ _) = not (relaxInfo (sourceName info) name)--data ReadyTarget a-    = ReadyTarget { ready :: a-                  -- ^ Some target whose build dependencies are all satisfied-                  , waiting :: [a]-                  -- ^ The targets that are waiting for the ready target-                  , other :: [a]-                  -- ^ The rest of the targets that need to be built-                  }--data BuildableInfo a-    = BuildableInfo-      { readyTargets :: [ReadyTarget a]-      , allBlocked :: [a] }-    | CycleInfo-      { depPairs :: [(a, a)] }---- | Given an ordering function representing the dependencies on a--- list of packages, return a ReadyTarget triple: One ready package,--- the packages that depend on the ready package directly or--- indirectly, and all the other packages.-buildable :: forall a. (a -> DepInfo) -> [a] -> BuildableInfo a-buildable relax packages =-    -- Find all packages which can't reach any other packages in the-    -- graph of the "has build dependency" relation on the-    -- yet-to-be-built packages-    case partition (\ x -> reachable hasDep x == [x]) verts of-      -- None of the packages are buildable, return information-      -- about how to break this build dependency cycle.-      ([], _) -> CycleInfo {depPairs = List.map ofEdge $ head $ (allCycles hasDep)}-      -- We have some buildable packages, return them along with-      -- the list of packages each one directly blocks-      (allReady, blocked) ->-          BuildableInfo { readyTargets = List.map (makeReady blocked allReady) allReady-                        , allBlocked = List.map ofVertex blocked }-    where-      makeReady :: [Vertex] -> [Vertex] -> Vertex -> ReadyTarget a-      makeReady blocked ready thisReady =-          let otherReady = filter (/= thisReady) ready-              (directlyBlocked, otherBlocked) = partition (\ x -> elem x (reachable isDep thisReady)) blocked in-          ReadyTarget { ready = ofVertex thisReady-                      , waiting = List.map ofVertex directlyBlocked-                      , other = List.map ofVertex (otherReady ++ otherBlocked) }-      --allDeps x = (ofVertex x, List.map ofVertex (filter (/= x) (reachable hasDep x)))-      isDep :: Graph-      isDep = transposeG hasDep-      hasDep :: Graph-      hasDep = buildG (0, length packages - 1) hasDepEdges--      hasDepEdges :: [(Int, Int)]-      hasDepEdges =-#if 0-          nub (foldr f [] (tails vertPairs))-          where f :: [(Int, DepInfo)] -> [(Int, Int)] -> [(Int, Int)]-                f [] es = es-                f (x : xs) es = catMaybes (List.map (toEdge x) xs) ++ es-                toEdge :: (Int, DepInfo) -> (Int, DepInfo) -> Maybe Edge-                toEdge (xv, xa) (yv, ya) =-                    case compareSource xa ya of-                      EQ -> Nothing-                      LT -> Just (yv, xv)-                      GT -> Just (xv, yv)-#else-          nub (evalState (foldM f [] (tails vertPairs)) Map.empty)-          where f :: [(Int, Int)] -> [(Int, DepInfo)] -> State (Map.Map (Int, Int) Ordering) [(Int, Int)]-                f es [] = return es-                f es (x : xs) = mapM (toEdge x) xs >>= \es' -> return (catMaybes es' ++ es)-                toEdge :: (Int, DepInfo) -> (Int, DepInfo) -> State (Map.Map (Int, Int) Ordering) (Maybe Edge)-                toEdge (xv, xa) (yv, ya) = do-                  mp <- get-                  r <- case Map.lookup (xv, yv) mp of-                         Just r' -> return r'-                         Nothing -> do-                           let r' = compareSource xa ya-                           -- trace ("compareSource " ++ show (unSrcPkgName $ sourceName xa) ++ " " ++ show (unSrcPkgName $ sourceName ya) ++ " -> " ++ show r') (return ())-                           modify (Map.insert (xv, yv) r')-                           return r'-                  case r of-                    EQ -> return Nothing-                    LT -> return $ Just (yv, xv)-                    GT -> return $ Just (xv, yv)-#endif-      ofEdge :: Edge -> (a, a)-      ofEdge (a, b) = (ofVertex a, ofVertex b)-      ofVertex :: Int -> a-      ofVertex n = fromJust (Map.findWithDefault Nothing n (Map.fromList (zip [0..] (map Just packages))))-      verts :: [Int]-      verts = map fst vertPairs-      vertPairs :: [(Int, DepInfo)]-      vertPairs = zip [0..] $ map relax packages---- | Find a cycle in a graph that involves-allCycles :: Graph -> [[Edge]]-allCycles g =-    -- Every cycle is confined to an SCC (strongly connected component).-    -- Every node in an SCC is part of some cycle.-    concatMap sccCycles (scc g)-    where-      -- Find all the cycles in an SCC-      sccCycles :: Tree Vertex -> [[Edge]]-      sccCycles t = mapMaybe addBackEdge (treePaths t)--      addBackEdge :: [Vertex] -> Maybe [Edge]-      addBackEdge path@(root : _) =-          let back = (last path, root) in-          if elem back (edges g) then Just (pathEdges (path ++ [root])) else Nothing---- | All the paths from root to a leaf-treePaths :: Tree a -> [[a]]-treePaths (Node {rootLabel = r, subForest = []}) = [[r]]-treePaths (Node {rootLabel = r, subForest = ts}) = map (r :) (concatMap treePaths ts)--pathEdges :: [a] -> [(a, a)]-pathEdges (v1 : v2 : vs) = (v1, v2) : pathEdges (v2 : vs)-pathEdges _ = []---- | Remove any packages which can't be built given that a package has failed.-failPackage :: Eq a => (a -> a -> Ordering) -> a -> [a] -> ([a], [a])-failPackage cmp failed packages =-    let graph = buildGraph cmp packages in-    let root = elemIndex failed packages in-    let victims = maybe [] (map (fromJust . vertex) . reachable graph) root in-    partition (\ x -> not . elem x $ victims) packages-    where-      vertex n = Map.findWithDefault Nothing n vertexMap-      vertexMap = Map.fromList (zip [0..] (map Just packages))---- | Given a list of packages, sort them according to their apparant--- build dependencies so that the first element doesn't depend on any--- of the other packages.-orderSource :: (a -> a -> Ordering) -> [a] -> [a]-orderSource cmp packages =-    map (fromJust . vertex) (topSort graph)-    where-      graph = buildGraph cmp packages-      vertex n = Map.findWithDefault Nothing n vertexMap-      vertexMap = Map.fromList (zip [0..] (map Just packages))---- | Build a graph with the list of packages as its nodes and the--- build dependencies as its edges.-buildGraph :: (a -> a -> Ordering) -> [a] -> Graph-buildGraph cmp packages =-    let es = someEdges (zip packages [0..]) in-    buildG (0, length packages - 1) es-    where-      someEdges [] = []-      someEdges (a : etc) = aEdges a etc ++ someEdges etc-      aEdges (ap, an) etc =-          concat (map (\ (bp, bn) ->-                           case cmp ap bp of-                             LT -> [(an, bn)]-                             GT -> [(bn, an)]-                             EQ -> []) etc)---- |This is a nice start. It ignores circular build depends and takes--- a pretty simplistic approach to 'or' build depends. However, I--- think this should work pretty nicely in practice.-compareSource :: DepInfo -> DepInfo -> Ordering-compareSource p1 p2-#if 0-    | any (\rel -> isJust (find (checkPackageNameReq rel) (binaryNames p2))) (concat (relations p1)) = GT-    | any (\rel -> isJust (find (checkPackageNameReq rel) (binaryNames p1))) (concat (relations p2)) = LT-    | otherwise = EQ-    where-      checkPackageNameReq :: Relation -> BinPkgName -> Bool-      checkPackageNameReq (Rel rPkgName _ _) bPkgName = rPkgName == bPkgName-#else-    | not (Set.null (Set.intersection (depSet p1) (binSet p2))) = GT-    | not (Set.null (Set.intersection (depSet p2) (binSet p1))) = LT-    | otherwise = EQ-#endif--compareSource' :: HasDebianControl control => control -> control -> Ordering-compareSource' control1 control2-    | any (\rel -> isJust (find (checkPackageNameReq rel) bins2)) (concat depends1) = GT-    | any (\rel -> isJust (find (checkPackageNameReq rel) bins1)) (concat depends2) = LT-    | otherwise = EQ-    where-      bins1 = binaryNames' control1-      bins2 = binaryNames' control2-      depends1 = relations' control1-      depends2 = relations' control2-      checkPackageNameReq :: Relation -> BinPkgName -> Bool-      checkPackageNameReq (Rel rPkgName _ _) bPkgName = rPkgName == bPkgName---- |Return the dependency info for a list of control files.-genDeps :: [FilePath] -> IO [DebianControl]-genDeps controlFiles = do-  orderSource compareSource' <$> mapM genDep' controlFiles-    where-      -- Parse the control file and extract the build dependencies-      genDep' controlPath = parseControlFromFile controlPath >>=-                            either (\ x -> throw (ParseRelationsError [$__LOC__] x))-                                   (\ x -> validateDebianControl x {- `mapExn` (pushLoc $__LOC__) -} >>= either throw return)---- pushLoc :: Loc -> ControlFileError -> ControlFileError--- pushLoc loc e = e {locs = loc : locs e}---- |One example of how to tie the below functions together. In this--- case 'fp' is the path to a directory that contains a bunch of--- checked out source packages. The code will automatically look for--- debian\/control. It returns a list with the packages in the--- order they should be built.-getSourceOrder :: FilePath -> IO [SrcPkgName]-getSourceOrder fp =-    findControlFiles fp >>= genDeps >>= return . map sourceName'-    where-      -- Return a list of the files that look like debian\/control.-      findControlFiles :: FilePath -> IO [FilePath]-      findControlFiles root =-          getDirectoryContents root >>=-          mapM (\ x -> return $ root ++ "/" ++ x ++ "/debian/control") >>=-          filterM doesFileExist
− debian-haskell/Debian/Loc.hs
@@ -1,23 +0,0 @@-{-# LANGUAGE ScopedTypeVariables, StandaloneDeriving, TemplateHaskell #-}-module Debian.Loc-    ( __LOC__-    , mapExn-    ) where--import Control.Applicative ((<$>), (<*>), pure)-import Control.Exception (Exception, throw)-import Control.Monad.Catch (MonadCatch, catch)-import Language.Haskell.TH--__LOC__ :: Q Exp-__LOC__ = location >>= \ x ->-             recConE 'Loc [ (,) <$> (pure 'loc_filename) <*> litE (stringL (loc_filename x))-                          , (,) <$> (pure 'loc_package) <*> litE (stringL (loc_package x))-                          , (,) <$> (pure 'loc_module) <*> litE (stringL (loc_module x))-                          , (,) <$> (pure 'loc_start) <*> [|($(litE (integerL (fromIntegral (fst (loc_start x))))),-                                                             $(litE (integerL (fromIntegral (snd (loc_start x)))))) :: (Int, Int)|]-                          , (,) <$> (pure 'loc_end) <*> [|($(litE (integerL (fromIntegral (fst (loc_end x))))),-                                                           $(litE (integerL (fromIntegral (snd (loc_end x)))))) :: (Int, Int)|] ]--mapExn :: forall e m a. (MonadCatch m, Exception e) => m a -> (e -> e) -> m a-mapExn task f = task `catch` (\ (e :: e) -> throw (f e))
− debian-haskell/Debian/Pretty.hs
@@ -1,46 +0,0 @@--- | A constructor we can wrap around values to avoid any built in--- Pretty instance - for example, instance Pretty [a].------  * display is now prettyShow---  * display' is now prettyText---  * ppDisplay is now ppShow---  * ppDisplay' is now ppText-{-# LANGUAGE DeriveFunctor, FlexibleContexts, FlexibleInstances, OverloadedStrings, TypeSynonymInstances #-}-module Debian.Pretty-    ( PP(PP, unPP)-    , prettyShow-    , prettyText-    , ppPrint-    , ppShow-    , ppText-    ) where--import Data.Text (Text, unpack, pack)-import Text.PrettyPrint.HughesPJClass (Doc, Pretty(pPrint), text, empty, prettyShow)---- | This type is wrapped around values before we pretty print them so--- we can write our own Pretty instances for common types without--- polluting the name space of clients of this package with instances--- they don't want.-newtype PP a = PP {unPP :: a} deriving (Functor)--instance Pretty (PP Text) where-    pPrint = text . unpack . unPP--instance Pretty (PP String) where-    pPrint = text . unPP--instance Pretty (PP a) => Pretty (PP (Maybe a)) where-    pPrint = maybe empty ppPrint . unPP--prettyText :: Pretty a => a -> Text-prettyText = pack . prettyShow--ppPrint :: Pretty (PP a) => a -> Doc-ppPrint = pPrint . PP--ppShow :: Pretty (PP a) => a -> String-ppShow = prettyShow . PP--ppText :: Pretty (PP a) => a -> Text-ppText = pack . prettyShow . PP
− debian-haskell/Debian/Relation.hs
@@ -1,25 +0,0 @@--- |A module for working with debian relationships <http://www.debian.org/doc/debian-policy/ch-relationships.html>-module Debian.Relation-    ( -- * Types-      PkgName(..)-    , SrcPkgName(..)-    , BinPkgName(..)-    , Relations-    , AndRelation-    , OrRelation-    , Relation(..)-    , ArchitectureReq(..)-    , Arch(..)-    , ArchOS(..)-    , ArchCPU(..)-    , VersionReq(..)-    -- * Helper Functions-    , checkVersionReq-    -- * Relation Parser-    , RelParser-    , ParseRelations(..)-    ) where--import Debian.Arch (Arch(..), ArchOS(..), ArchCPU(..))-import Debian.Relation.Common (SrcPkgName(..), BinPkgName(..), PkgName(pkgNameFromString))-import Debian.Relation.String
− debian-haskell/Debian/Relation/ByteString.hs
@@ -1,30 +0,0 @@-{-# OPTIONS -fno-warn-orphans #-}--- |A module for working with debian relationships <http://www.debian.org/doc/debian-policy/ch-relationships.html>-module Debian.Relation.ByteString-    ( -- * Types-      AndRelation-    , OrRelation-    , Relations-    , Relation(..)-    , ArchitectureReq(..)-    , VersionReq(..)-    -- * Helper Functions-    , checkVersionReq-    -- * Relation Parser-    , RelParser-    , ParseRelations(..)-    ) where--import qualified Data.ByteString.Char8 as C---- Local Modules----import Debian.Relation.Common-import Debian.Relation.String---import Debian.Version---- * ParseRelations---- For now we just wrap the string version-instance ParseRelations C.ByteString where-    parseRelations byteStr = parseRelations (C.unpack byteStr)
− debian-haskell/Debian/Relation/Common.hs
@@ -1,132 +0,0 @@-{-# LANGUAGE DeriveDataTypeable, FlexibleContexts, FlexibleInstances, OverloadedStrings, TypeSynonymInstances #-}-module Debian.Relation.Common where---- Standard GHC Modules--import Data.Data (Data)-import Data.List as List (map, intersperse)-import Data.Monoid (mconcat, (<>))-import Data.Function-import Data.Set as Set (Set, toList)-import Data.Typeable (Typeable)-import Debian.Arch (Arch, prettyArch)-import Debian.Pretty (PP(..))-import Prelude hiding (map)-import Text.ParserCombinators.Parsec-import Text.PrettyPrint (Doc, text, empty)-import Text.PrettyPrint.HughesPJClass (Pretty(pPrint))---- Local Modules--import Debian.Version---- Datatype for relations--type Relations = AndRelation-type AndRelation = [OrRelation]-type OrRelation = [Relation]--data Relation = Rel BinPkgName (Maybe VersionReq) (Maybe ArchitectureReq) deriving (Eq, Read, Show)--newtype SrcPkgName = SrcPkgName {unSrcPkgName :: String} deriving (Read, Show, Eq, Ord, Data, Typeable)-newtype BinPkgName = BinPkgName {unBinPkgName :: String} deriving (Read, Show, Eq, Ord, Data, Typeable)--class Pretty (PP a) => PkgName a where-    pkgNameFromString :: String -> a--instance PkgName BinPkgName where-    pkgNameFromString = BinPkgName--instance PkgName SrcPkgName where-    pkgNameFromString = SrcPkgName--class ParseRelations a where-    -- |'parseRelations' parse a debian relation (i.e. the value of a-    -- Depends field). Return a parsec error or a value of type-    -- 'Relations'-    parseRelations :: a -> Either ParseError Relations---- | This needs to be indented for use in a control file: intercalate "\n     " . lines . show-prettyRelations :: [[Relation]] -> Doc-prettyRelations xss = mconcat . intersperse (text "\n, ") . List.map prettyOrRelation $ xss--prettyOrRelation :: [Relation] -> Doc-prettyOrRelation xs = mconcat . intersperse (text " | ") . List.map prettyRelation $ xs--prettyRelation :: Relation -> Doc-prettyRelation (Rel name ver arch) =-    pPrint (PP name) <> maybe empty prettyVersionReq ver <> maybe empty prettyArchitectureReq arch--instance Ord Relation where-    compare (Rel pkgName1 mVerReq1 _mArch1) (Rel pkgName2 mVerReq2 _mArch2) =-        case compare pkgName1 pkgName2 of-             LT -> LT-             GT -> GT-             EQ -> compare mVerReq1 mVerReq2--data ArchitectureReq-    = ArchOnly (Set Arch)-    | ArchExcept (Set Arch)-    deriving (Eq, Ord, Read, Show)--prettyArchitectureReq :: ArchitectureReq -> Doc-prettyArchitectureReq (ArchOnly arch) = text " [" <> mconcat (List.map prettyArch (toList arch)) <> text "]"-prettyArchitectureReq (ArchExcept arch) = text " [" <> mconcat (List.map ((text "!") <>) (List.map prettyArch (toList arch))) <> text "]"--data VersionReq-    = SLT DebianVersion-    | LTE DebianVersion-    | EEQ  DebianVersion-    | GRE  DebianVersion-    | SGR DebianVersion-      deriving (Eq, Read, Show)--prettyVersionReq :: VersionReq -> Doc-prettyVersionReq (SLT v) = text " (<< " <> prettyDebianVersion v <> text ")"-prettyVersionReq (LTE v) = text " (<= " <> prettyDebianVersion v <> text ")"-prettyVersionReq (EEQ v) = text " (= " <> prettyDebianVersion v <> text ")"-prettyVersionReq (GRE v) = text " (>= " <> prettyDebianVersion v <> text ")"-prettyVersionReq (SGR v) = text " (>> " <> prettyDebianVersion v <> text ")"---- |The sort order is based on version number first, then on the kind of--- relation, sorting in the order <<, <= , ==, >= , >>-instance Ord VersionReq where-    compare = compare `on` extr-      where extr (SLT v) = (v,0 :: Int)-            extr (LTE v) = (v,1 :: Int)-            extr (EEQ v) = (v,2 :: Int)-            extr (GRE v) = (v,3 :: Int)-            extr (SGR v) = (v,4 :: Int)---- |Check if a version number satisfies a version requirement.-checkVersionReq :: Maybe VersionReq -> Maybe DebianVersion -> Bool-checkVersionReq Nothing _ = True-checkVersionReq _ Nothing = False-checkVersionReq (Just (SLT v1)) (Just v2) = v2 < v1-checkVersionReq (Just (LTE v1)) (Just v2) = v2 <= v1-checkVersionReq (Just (EEQ v1)) (Just v2) = v2 == v1-checkVersionReq (Just (GRE v1)) (Just v2) = v2 >= v1-checkVersionReq (Just (SGR v1)) (Just v2) = v2 > v1--instance Pretty (PP BinPkgName) where-    pPrint = text . unBinPkgName . unPP--instance Pretty (PP SrcPkgName) where-    pPrint = text . unSrcPkgName . unPP---- | Wrap `PP` around type synonyms that might overlap with the--- `Pretty [a]` instance.-instance Pretty (PP Relations) where-    pPrint = prettyRelations . unPP--instance Pretty (PP OrRelation) where-    pPrint = prettyOrRelation . unPP--instance Pretty (PP Relation) where-    pPrint = prettyRelation . unPP--instance Pretty (PP VersionReq) where-    pPrint = prettyVersionReq . unPP--instance Pretty (PP ArchitectureReq) where-    pPrint = prettyArchitectureReq . unPP
− debian-haskell/Debian/Relation/String.hs
@@ -1,139 +0,0 @@-{-# LANGUAGE FlexibleInstances, PackageImports, TypeSynonymInstances #-}-{-# OPTIONS -fno-warn-unused-do-bind -fno-warn-orphans #-}--- |A module for working with debian relationships <http://www.debian.org/doc/debian-policy/ch-relationships.html>-module Debian.Relation.String-    ( -- * Types-      AndRelation-    , OrRelation-    , Relations-    , Relation(..)-    , ArchitectureReq(..)-    , VersionReq(..)-    -- * Helper Functions-    , checkVersionReq-    -- * Relation Parser-    , RelParser-    , ParseRelations(..)-    , pRelations-    ) where---- Standard GHC Modules--import "mtl" Control.Monad.Identity (Identity)-import Data.Set (fromList)-import Text.ParserCombinators.Parsec-import Text.Parsec.Prim (ParsecT)---- Local Modules--import Debian.Arch (Arch, parseArch)-import Debian.Relation.Common-import Debian.Version---- * ParseRelations--instance ParseRelations String where-    parseRelations str =-        let str' = scrub str in-        case parse pRelations str' str' of-          Right relations -> Right (filter (/= []) relations)-          x -> x-        where-          scrub = unlines . filter (not . comment) . lines-          comment s = case dropWhile (`elem` " \t") s of-                           ('#' : _) -> True-                           _ -> False---- * Relation Parser--type RelParser a = CharParser () a---- "Correct" dependency lists are separated by commas, but sometimes they--- are omitted and it is possible to parse relations without them.-pRelations :: RelParser Relations-pRelations = do -- rel <- sepBy pOrRelation (char ',')-                rel <- many pOrRelation-                eof-                return rel--pOrRelation :: RelParser OrRelation-pOrRelation = do skipMany (char ',' <|> whiteChar)-                 rel <- sepBy1 pRelation (char '|')-                 skipMany (char ',' <|> whiteChar)-                 return rel--whiteChar :: ParsecT String u Identity Char-whiteChar = oneOf [' ','\t','\n']--pRelation :: RelParser Relation-pRelation =-    do skipMany whiteChar-       pkgName <- many1 (noneOf [' ',',','|','\t','\n','('])-       skipMany whiteChar-       mVerReq <- pMaybeVerReq-       skipMany whiteChar-       mArch <- pMaybeArch-       return $ Rel (BinPkgName pkgName) mVerReq mArch--pMaybeVerReq :: RelParser (Maybe VersionReq)-pMaybeVerReq =-    do char '('-       skipMany whiteChar-       op <- pVerReq-       skipMany whiteChar-       ver <- many1 (noneOf [' ',')','\t','\n'])-       skipMany whiteChar-       char ')'-       return $ Just (op (parseDebianVersion' ver))-    <|>-    do return $ Nothing--pVerReq :: ParsecT [Char] u Identity (DebianVersion -> VersionReq)-pVerReq =-    do char '<'-       (do char '<' <|> char ' ' <|> char '\t'-           return $ SLT-        <|>-        do char '='-           return $ LTE)-    <|>-    do string "="-       return $ EEQ-    <|>-    do char '>'-       (do char '='-           return $ GRE-        <|>-        do char '>' <|> char ' ' <|> char '\t'-           return $ SGR)--pMaybeArch :: RelParser (Maybe ArchitectureReq)-pMaybeArch =-    do char '['-       (do archs <- pArchExcept-           char ']'-           skipMany whiteChar-           return (Just (ArchExcept (fromList . map parseArchExcept $ archs)))-        <|>-        do archs <- pArchOnly-           char ']'-           skipMany whiteChar-           return (Just (ArchOnly (fromList . map parseArch $ archs)))-        )-    <|>-    return Nothing---- Some packages (e.g. coreutils) have architecture specs like [!i386--- !hppa], even though this doesn't really make sense: once you have--- one !, anything else you include must also be (implicitly) a !.-pArchExcept :: RelParser [String]-pArchExcept = sepBy (char '!' >> many1 (noneOf [']',' '])) (skipMany1 whiteChar)--pArchOnly :: RelParser [String]-pArchOnly = sepBy (many1 (noneOf [']',' '])) (skipMany1 whiteChar)---- | Ignore the ! if it is present, we already know this list has at--- least one, and the rest are implicit.-parseArchExcept :: String -> Arch-parseArchExcept ('!' : s) = parseArch s-parseArchExcept s = parseArch s
− debian-haskell/Debian/Relation/Text.hs
@@ -1,30 +0,0 @@-{-# OPTIONS -fno-warn-orphans #-}--- |A module for working with debian relationships <http://www.debian.org/doc/debian-policy/ch-relationships.html>-module Debian.Relation.Text-    ( -- * Types-      AndRelation-    , OrRelation-    , Relations-    , Relation(..)-    , ArchitectureReq(..)-    , VersionReq(..)-    -- * Helper Functions-    , checkVersionReq-    -- * Relation Parser-    , RelParser-    , ParseRelations(..)-    ) where--import qualified Data.Text as T---- Local Modules----import Debian.Relation.Common-import Debian.Relation.String---import Debian.Version---- * ParseRelations---- For now we just wrap the string version-instance ParseRelations T.Text where-    parseRelations text = parseRelations (T.unpack text)
− debian-haskell/Debian/Release.hs
@@ -1,60 +0,0 @@-{-# LANGUAGE DeriveDataTypeable #-}-module Debian.Release-    ( ReleaseName(..)-    , parseReleaseName-    , releaseName'-    , Section(..)-    , SubSection(..)-    , sectionName-    , sectionName'-    , sectionNameOfSubSection-    , parseSection-    , parseSection'-    ) where--import Data.Data (Data)-import Data.Typeable (Typeable)-import Network.URI (unEscapeString, escapeURIString, isAllowedInURI)---- |A distribution (aka release) name.  This type is expected to refer--- to a subdirectory of the dists directory which is at the top level--- of a repository.-data ReleaseName = ReleaseName { relName :: String } deriving (Eq, Ord, Read, Show, Data, Typeable)--parseReleaseName :: String -> ReleaseName-parseReleaseName name = ReleaseName {relName = unEscapeString name}--releaseName' :: ReleaseName -> String-releaseName' (ReleaseName {relName = s}) = escapeURIString isAllowedInURI s---- |A section of a repository such as main, contrib, non-free,--- restricted.  The indexes for a section are located below the--- distribution directory.-newtype Section = Section String deriving (Read, Show, Eq, Ord)---- |A package's subsection is only evident in its control information,--- packages from different subsections all reside in the same index.-data SubSection = SubSection { section :: Section, subSectionName :: String } deriving (Read, Show, Eq, Ord)--sectionName :: SubSection -> String-sectionName (SubSection (Section "main") y) = y-sectionName (SubSection x y) = sectionName' x ++ "/" ++ y--sectionName' :: Section -> String-sectionName' (Section s) = escapeURIString isAllowedInURI s--sectionNameOfSubSection :: SubSection -> String-sectionNameOfSubSection = sectionName' . section---- |Parse the value that appears in the @Section@ field of a .changes file.--- (Does this need to be unesacped?)-parseSection :: String -> SubSection-parseSection s =-    case span (/= '/') s of-      (x, "") -> SubSection (Section "main") x-      ("main", y) -> SubSection (Section "main") y-      (x, y) -> SubSection (Section x) (tail y)--parseSection' :: String -> Section-parseSection' name =-    Section (unEscapeString name)
− debian-haskell/Debian/Report.hs
@@ -1,87 +0,0 @@-module Debian.Report where--import Data.Maybe-import qualified Data.Map as M-import Data.Text as Text (Text, unpack)-import Debian.Apt.Index (Fetcher, Compression(..), update, controlFromIndex')-import Debian.Control.Text-import Debian.Sources-import Debian.Version-import Text.XML.HaXml (CFilter, mkElem, cdata)-import Text.XML.HaXml.Posn-import Text.PrettyPrint (render)---- * General Package Map Builders---- |create a map of (package name, extracted field) from a list of index files------ NOTE: we could merge all the files into a single control and then--- run packageMap over that. We currently do it one control file at a--- time to avoid having all the control files loaded in memory at--- once. However, I am not sure that property is actually occuring--- anyway. So, this should be revisited.-makePackageMap :: (Paragraph -> a) -> (a -> a -> a) -> [(FilePath, Compression)] -> IO (M.Map Text a)-makePackageMap _ _ [] = return M.empty-makePackageMap extractValue resolveConflict ((path, compression):is) =-    do r <- controlFromIndex' compression path-       case r of-         (Left e) -> error (show e)-         (Right c) ->-             do let pm = packageMap extractValue resolveConflict c-                pms <- makePackageMap extractValue resolveConflict is-                return $ M.unionWith resolveConflict pm pms---- |create a map of (package name, max version) from a single control file-packageMap :: (Paragraph -> a) -> (a -> a -> a) -> Control' Text -> M.Map Text a-packageMap extractValue resolveConflict control =-    M.fromListWith resolveConflict (map packageTuple (unControl control))-    where-      packageTuple paragraph = (fromJust $ fieldValue "Package" paragraph, extractValue paragraph)---- |extract the version number from a control paragraph-extractVersion :: Paragraph -> Maybe DebianVersion-extractVersion paragraph = fmap (parseDebianVersion' . unpack)  $ fieldValue "Version" paragraph---- * Trump Report---- |compare two sources.list and find all the packages in the second that trump packages in the first--- see also: |trumpedMap|-trumped :: Fetcher -- ^ function for downloading package indexes-        -> FilePath -- ^ cache directory to store index files in (must already exist)-        -> String -- ^ binary architecture-        -> [DebSource] -- ^ sources.list a-        -> [DebSource] -- ^ sources.list b-        -> IO (M.Map Text (DebianVersion, DebianVersion)) -- ^ a map of trumped package names to (version a, version b)-trumped fetcher cacheDir arch sourcesA sourcesB =-    do indexesA <- update fetcher cacheDir arch (filter isDebSrc sourcesA)-       pmA <- makePackageMap (fromJust . extractVersion) max (map fromJust indexesA)-       indexesB <- update fetcher cacheDir arch (filter isDebSrc sourcesB)-       pmB <- makePackageMap (fromJust . extractVersion) max (map fromJust indexesB)-       return (trumpedMap pmA pmB)-    where-      isDebSrc ds = sourceType ds == DebSrc---- |calculate all the trumped packages-trumpedMap :: M.Map Text DebianVersion -- ^ package map a-           -> M.Map Text DebianVersion -- ^ package map b-           -> M.Map Text (DebianVersion, DebianVersion) -- ^ trumped packages (version a, version b)-trumpedMap pmA pmB =-    M.foldWithKey (checkTrumped pmB) M.empty pmA-    where-      checkTrumped pm package aVersion trumpedPM =-          case M.lookup package pm of-            (Just bVersion)-              | bVersion > aVersion -> M.insert package (aVersion, bVersion) trumpedPM-            _ -> trumpedPM---- |create <trumped /> XML element and children from a trumped Map-trumpedXML :: M.Map Text (DebianVersion, DebianVersion) -> CFilter Posn-trumpedXML trumpedMap' =-    mkElem "trumped" (map mkTrumpedPackage (M.toAscList trumpedMap' ))-    where-      mkTrumpedPackage (package, (oldVersion, newVersion)) =-          mkElem "trumpedPackage"-                     [ mkElem "package" [ cdata (unpack package) ]-                     , mkElem "oldVersion" [ cdata (render . prettyDebianVersion $ oldVersion) ]-                     , mkElem "newVersion" [ cdata (render . prettyDebianVersion $ newVersion) ]-                     ]
− debian-haskell/Debian/Sources.hs
@@ -1,171 +0,0 @@-{-# LANGUAGE FlexibleInstances, OverloadedStrings #-}-{-# OPTIONS_GHC -fno-warn-name-shadowing #-}-module Debian.Sources where--import Data.List (intercalate)-import Data.Monoid ((<>))-import Debian.Pretty (PP(..))-import Debian.Release-import Network.URI (URI, uriToString, parseURI, unEscapeString, escapeURIString, isAllowedInURI)-import Text.PrettyPrint (text, hcat)-import Text.PrettyPrint.HughesPJClass (Pretty(pPrint))--data SourceType-    = Deb | DebSrc-    deriving (Eq, Ord, Show)--data DebSource-    = DebSource-    { sourceType :: SourceType-    , sourceUri :: URI-    , sourceDist :: Either String (ReleaseName, [Section])-    } deriving (Eq, Ord, Show)--instance Pretty SourceType where-    pPrint Deb = text "deb"-    pPrint DebSrc = text "deb-src"--instance Pretty DebSource where-    pPrint (DebSource thetype theuri thedist) =-        pPrint thetype <>-        text (" " <> uriToString id theuri " " <>-              case thedist of-                Left exactPath -> escape exactPath-                Right (dist, sections) -> releaseName' dist <> " " <> intercalate " " (map sectionName' sections))-            where escape = escapeURIString isAllowedInURI--instance Pretty (PP [DebSource]) where-    pPrint = hcat . map (\ x -> pPrint x <> text "\n") . unPP---- |This is a name given to a combination of parts of one or more--- releases that can be specified by a sources.list file.-type SliceName = ReleaseName--- data SliceName = SliceName { sliceName :: String } deriving (Eq, Ord, Show)--{---deb uri distribution [component1] [componenent2] [...]--The URI for the deb type must specify the base of the Debian-distribution, from which APT will find the information it needs.--distribution can specify an exact path, in which case the components-must be omitted and distribution must end with a slash (/).--If distribution does not specify an exact path, at least one component-must be present.--Distribution may also contain a variable, $(ARCH), which expands to-the Debian architecture (i386, m68k, powerpc, ...)  used on the-system.--The rest of the line can be marked as a comment by using a #.--Additional Notes:-- + Lines can begin with leading white space.-- + If the dist ends with slash (/), then it must be an absolute path-   and it is an error to specify components after it.---}---- |quoteWords - similar to words, but with special handling of--- double-quotes and brackets.------ The handling double quotes and [] is supposed to match:--- apt-0.6.44.2\/apt-pkg\/contrib\/strutl.cc:ParseQuoteWord()------ The behaviour can be defined as:------  Break the string into space seperated words ignoring spaces that---  appear between \"\" or []. Strip trailing and leading white space---  around words. Strip out double quotes, but leave the square---  brackets intact.-quoteWords :: String -> [String]-quoteWords [] = []-quoteWords s = quoteWords' (dropWhile (==' ') s)-    where-      quoteWords' :: String -> [String]-      quoteWords' [] = []-      quoteWords' str =-          case break (flip elem (" [\"" :: String)) str of-            ([],[]) -> []-            (w, []) -> [w]-            (w, (' ':rest)) -> w : (quoteWords' (dropWhile (==' ') rest))-            (w, ('"':rest)) ->-                case break (== '"') rest of-                  (w',('"':rest)) ->-                      case quoteWords' rest of-                        [] ->  [w ++ w']-                        (w'':ws) -> ((w ++ w' ++ w''): ws)-                  (_w',[]) -> error ("quoteWords: missing \" in the string: "  ++ s)-                  _ -> error ("the impossible happened in SourcesList.quoteWords")-            (w, ('[':rest)) ->-                case break (== ']') rest of-                  (w',(']':rest)) ->-                      case quoteWords' rest of-                        []       -> [w ++ "[" ++ w' ++ "]"]-                        (w'':ws) -> ((w ++ "[" ++ w' ++ "]" ++ w''): ws)-                  (_w',[]) -> error ("quoteWords: missing ] in the string: "  ++ s)-                  _ -> error ("the impossible happened in SourcesList.quoteWords")-            _ -> error ("the impossible happened in SourcesList.quoteWords")--stripLine :: String -> String-stripLine = takeWhile (/= '#') . dropWhile (== ' ')--sourceLines :: String -> [String]-sourceLines = filter (not . null) . map stripLine . lines---- |parseSourceLine -- parses a source line--- the argument must be a non-empty, valid source line with comments stripped--- see: 'sourceLines'-parseSourceLine :: String -> DebSource-parseSourceLine str =-    case quoteWords str of-      (theTypeStr : theUriStr : theDistStr : sectionStrs) ->-          let sections = map parseSection' sectionStrs-              theType = case unEscapeString theTypeStr of-                          "deb" -> Deb-                          "deb-src" -> DebSrc-                          o -> error ("parseSourceLine: invalid type " ++ o ++ " in line:\n" ++ str)-              theUri = case parseURI theUriStr of-                         Nothing -> error ("parseSourceLine: invalid uri " ++ theUriStr ++ " in the line:\n" ++ str)-                         Just u -> u-              theDist = unEscapeString theDistStr-          in-            case last theDist of-              '/' -> if null sections-                      then DebSource { sourceType = theType, sourceUri = theUri, sourceDist = Left theDist }-                      else error ("parseSourceLine: Dist is an exact path, so sections are not allowed on the line:\n" ++ str)-              _ -> if null sections-                    then error ("parseSourceLine: Dist is not an exact path, so at least one section is required on the line:\n" ++ str)-                    else DebSource { sourceType = theType, sourceUri = theUri, sourceDist = Right (parseReleaseName theDist, sections) }-      _ -> error ("parseSourceLine: invalid line in sources.list:\n" ++ str)--parseSourceLine' :: String -> Maybe DebSource-parseSourceLine' str =-    case quoteWords str of-      (theTypeStr : theUriStr : theDistStr : sectionStrs) ->-          let sections = map parseSection' sectionStrs-              theType = case unEscapeString theTypeStr of-                          "deb" -> Just Deb-                          "deb-src" -> Just DebSrc-                          _ -> Nothing-              theUri = case parseURI theUriStr of-                         Nothing -> Nothing-                         Just u -> Just u-              theDist = unEscapeString theDistStr-          in-            case (last theDist, theType, theUri) of-              ('/', Just typ, Just uri) -> if null sections-                      then Just $ DebSource { sourceType = typ, sourceUri = uri, sourceDist = Left theDist }-                      else error ("parseSourceLine: Dist is an exact path, so sections are not allowed on the line:\n" ++ str)-              (_, Just typ, Just uri) -> if null sections-                    then Nothing-                    else Just $ DebSource { sourceType = typ, sourceUri = uri, sourceDist = Right ((parseReleaseName theDist), sections) }-              _ -> Nothing-      _ -> Nothing--parseSourcesList :: String -> [DebSource]-parseSourcesList = map parseSourceLine . sourceLines
− debian-haskell/Debian/Time.hs
@@ -1,27 +0,0 @@-{-# LANGUAGE CPP #-}-module Debian.Time where--import Data.Time-#if !MIN_VERSION_time(1,5,0)-import System.Locale (defaultTimeLocale)-#endif-import Data.Time.Clock.POSIX-import System.Posix.Types---- * Time Helper Functions--rfc822DateFormat' :: String-rfc822DateFormat' = "%a, %d %b %Y %T %z"--epochTimeToUTCTime :: EpochTime -> UTCTime-epochTimeToUTCTime = posixSecondsToUTCTime . fromIntegral . fromEnum--formatTimeRFC822 :: (FormatTime t) => t -> String-formatTimeRFC822 = formatTime defaultTimeLocale rfc822DateFormat'--parseTimeRFC822 :: (ParseTime t) => String -> Maybe t-parseTimeRFC822 = parseTime defaultTimeLocale rfc822DateFormat'--getCurrentLocalRFC822Time :: IO String-getCurrentLocalRFC822Time = getCurrentTime >>= utcToLocalZonedTime >>= return . formatTime defaultTimeLocale rfc822DateFormat'-
− debian-haskell/Debian/URI.hs
@@ -1,90 +0,0 @@-{-# LANGUAGE PackageImports #-}-{-# OPTIONS -fno-warn-orphans #-}-module Debian.URI-    ( module Network.URI-    , URI'-    , toURI'-    , fromURI'-    , readURI'-    , uriToString'-    , fileFromURI-    , fileFromURIStrict-    , dirFromURI-    ) where--import Control.Exception (SomeException, try)-import Data.ByteString.Lazy.UTF8 as L-import qualified Data.ByteString.Lazy.Char8 as L-import Data.Maybe (catMaybes, fromJust)-import Network.URI (URI(..), URIAuth(..), parseURI, uriToString)-import System.Directory (getDirectoryContents)--- import System.Process.ByteString (readProcessWithExitCode)-import System.Process.ByteString.Lazy (readProcessWithExitCode)-import Text.Regex (mkRegex, matchRegex)---- | A wrapper around a String containing a known parsable URI.  Not--- absolutely safe, because you could say read "URI' \"bogus string\""--- :: URI'.  But enough to save me from myself.-newtype URI' = URI' String deriving (Read, Show, Eq, Ord)--readURI' :: String -> Maybe URI'-readURI' s = maybe Nothing (const (Just (URI' s))) (parseURI s)--fromURI' :: URI' -> URI-fromURI' (URI' s) = fromJust (parseURI s)---- | Using the bogus Show instance of URI here.  If it ever gets fixed--- this will stop working.  Worth noting that show will obscure any--- password info embedded in the URI, so that's nice.-toURI' :: URI -> URI'-toURI' = URI' . show--uriToString' :: URI -> String-uriToString' uri = uriToString id uri ""--fileFromURI :: URI -> IO (Either SomeException L.ByteString)-fileFromURI uri = fileFromURIStrict uri--fileFromURIStrict :: URI -> IO (Either SomeException L.ByteString)-fileFromURIStrict uri = try $-    case (uriScheme uri, uriAuthority uri) of-      ("file:", Nothing) -> L.readFile (uriPath uri)-      -- ("ssh:", Just auth) -> cmdOutputStrict ("ssh " ++ uriUserInfo auth ++ uriRegName auth ++ uriPort auth ++ " cat " ++ show (uriPath uri))-      ("ssh:", Just auth) -> do-          let cmd = "ssh"-              args = [uriUserInfo auth ++ uriRegName auth ++ uriPort auth, "cat", uriPath uri]-          (_code, out, _err) <- readProcessWithExitCode cmd args L.empty-          return out-      _ -> do-          let cmd = "curl"-              args = ["-s", "-g", uriToString' uri]-          (_code, out, _err) <- readProcessWithExitCode cmd args L.empty-          return out---- | Parse the text returned when a directory is listed by a web--- server.  This is currently only known to work with Apache.--- NOTE: there is a second copy of this function in--- Extra:Extra.Net. Please update both locations if you make changes.-webServerDirectoryContents :: L.ByteString -> [String]-webServerDirectoryContents text =-    catMaybes . map (second . matchRegex re) . Prelude.lines . L.toString $ text-    where-      re = mkRegex "( <A HREF|<a href)=\"([^/][^\"]*)/\""-      second (Just [_, b]) = Just b-      second _ = Nothing---dirFromURI :: URI -> IO (Either SomeException [String])-dirFromURI uri = try $-    case (uriScheme uri, uriAuthority uri) of-      ("file:", Nothing) -> getDirectoryContents (uriPath uri)-      ("ssh:", Just auth) ->-          do let cmd = "ssh"-                 args = [uriUserInfo auth ++ uriRegName auth ++ uriPort auth, "ls", "-1", uriPath uri]-             (_code, out, _err) <- readProcessWithExitCode cmd args L.empty-             return . Prelude.lines . L.toString $ out-      _ ->-          do let cmd = "curl"-                 args = ["-s", "-g", uriToString' uri]-             (_code, out, _err) <- readProcessWithExitCode cmd args L.empty-             return . webServerDirectoryContents $ out
− debian-haskell/Debian/UTF8.hs
@@ -1,29 +0,0 @@-{-# LANGUAGE CPP #-}--- | There are old index files that have funky characters like 'ø'--- that are not properly UTF8 encoded.  As far as I can tell, these--- files are otherwise plain ascii, so just naivelyinsert the--- character into the output stream.-module Debian.UTF8-    ( decode-    , readFile-    ) where--#if !MIN_VERSION_base(4,8,0)-import Control.Applicative ((<$>))-#endif-import qualified Data.ByteString.Char8 as B (concat)-import qualified Data.ByteString.Lazy.Char8 as L (ByteString, readFile, toChunks)-import Data.Char (chr)-import Data.Text as T-import Data.Text.Encoding (decodeUtf8With)-import Data.Word (Word8)-import Prelude hiding (readFile)--decode :: L.ByteString -> T.Text-decode b = decodeUtf8With e (B.concat (L.toChunks b))-    where-      e :: String -> Maybe Word8 -> Maybe Char-      e _description w = fmap (chr . fromIntegral) w--readFile :: FilePath -> IO T.Text-readFile path = decode <$> L.readFile path
− debian-haskell/Debian/Util/FakeChanges.hs
@@ -1,256 +0,0 @@-{-# LANGUAGE DeriveDataTypeable, ScopedTypeVariables #-}-module Debian.Util.FakeChanges (fakeChanges) where----import Control.Arrow-import Control.Exception-import Control.Monad hiding (mapM)-import qualified Data.ByteString.Lazy.Char8 as L-import Data.Data (Data, Typeable)-import qualified Data.Digest.Pure.MD5 as MD5-import Data.Foldable (concat, all, foldr)-import Data.List as List (intercalate, nub, partition, isSuffixOf)-import Data.Maybe-import Debian.Pretty (prettyShow)-import Data.Traversable-import Debian.Control-import qualified Debian.Deb as Deb-import Debian.Time-import Network.BSD (getHostName)-import Prelude hiding (concat, foldr, all, mapM, sum)-import System.Environment-import System.FilePath-import System.Posix.Files-import Text.Regex.TDFA--data Error-    = NoDebs-    | TooManyDscs [FilePath]-    | TooManyTars [FilePath]-    | TooManyDiffs [FilePath]-    | UnknownFiles [FilePath]-    | MalformedDebFilename [FilePath]-    | VersionMismatch [Maybe String]-    deriving (Read, Show, Eq, Typeable, Data)--data Files-    = Files { dsc :: Maybe (FilePath, Paragraph)-            , debs :: [(FilePath, Paragraph)]-            , tar :: Maybe FilePath-            , diff :: Maybe FilePath-            }--fakeChanges :: [FilePath] -> IO (FilePath, String)-fakeChanges fps =-    do files <- loadFiles fps-       let version      = getVersion files-           source       = getSource files-           maintainer   = getMaintainer files-           arches       = getArches files-           binArch      = getBinArch files-           dist         = "unstable"-           urgency      = "low"-           (invalid, binaries) = unzipEithers $ map (debNameSplit . fst) (debs files)-       when (not . null $ invalid) (error $ "Some .deb names are invalid: " ++ show invalid)-       uploader <- getUploader-       date <- getCurrentLocalRFC822Time-       fileLines <- mapM mkFileLine fps-       let changes = Control $ return . Paragraph $ map Field-               [ ("Format"," 1.7")-               , ("Date", ' ' : date)-               , ("Source", ' ' : source)-               , ("Binary", ' ' : (intercalate " " $ map (\(n,_,_) -> n) binaries))-               , ("Architecture", ' ' : intercalate " " arches)-               , ("Version", ' ' : version)-               , ("Distribution", ' ' : dist)-               , ("Urgency", ' ' : urgency)-               , ("Maintainer", ' ' : maintainer)-               , ("Changed-By", ' ' : uploader)-               , ("Description", "\n Simulated description")-               , ("Changes", "\n" ++ unlines (map (' ':) [ source ++ " (" ++ version ++") " ++ dist ++ "; urgency=" ++ urgency-                                                         , "."-                                                         , "  * Simulated changes"-                                                         ]-                                             ))-               , ("Files", "\n" ++ unlines fileLines)-               ]-       return $ (concat [ source, "_", version, "_", binArch, ".changes"], prettyShow changes)---       let (invalid, binaries) = unzipEithers $ map debNameSplit debs-{--       when (not . null $ invalid) (throwDyn [MalformedDebFilename invalid])-       version <- getVersion dsc debs-       putStrLn version-       source <- getSource dsc debs-       putStrLn source--}--- TODO: seems like this could be more aggressive about ensure the--- versions make sense. Except with packages like libc, the versions--- don't make sense. Maybe we want a flag that disables version check--- ?-getVersion :: Files -> String-getVersion files-    | isNothing (dsc files) =-        let versions = map (fieldValue "Version" . snd) (debs files)-        in-          if (all isJust versions) && (length (nub versions) == 1)-          then fromJust (head versions)-          else error (show [VersionMismatch (nub versions)])-    | otherwise =-        case fieldValue "Version" (snd . fromJust $ dsc files) of-          (Just v) -> v-          Nothing  -> error $ "show (dsc files)" ++ " does not have a Version field :("---getSource :: Files -> String-getSource files =-    let dscSource =-            case (dsc files) of-              Nothing -> []-              (Just (fp, p)) ->-                  case fieldValue "Source" p of-                    (Just v) -> [v]-                    Nothing -> error $ fp ++ " does not have a Source field :("-        debSources = map debSource (debs files)-        srcs = nub (dscSource ++ debSources)-    in-      if (singleton srcs)-         then (head srcs)-         else error $ "Could not determine source."-    where-      debSource (deb,p) =-          case (fieldValue "Source" p) of-            (Just v) -> v-            Nothing ->-                case fieldValue "Package" p of-                  (Just v) -> v-                  Nothing -> error $ "Could not find Source or Package field in " ++ deb----getMaintainer :: Files -> String-getMaintainer files-    | isJust (dsc files) =-        let (fp, p) = fromJust (dsc files)-        in-          case fieldValue "Maintainer" p of-            Nothing -> error $ fp ++ " is missing the Maintainer field."-            (Just v) -> v-    | otherwise =-        let maintainers = catMaybes $ map (fieldValue "Maintainer" . snd) (debs files)-            maintainer = nub maintainers-        in-          if singleton maintainer-             then head maintainer-             else error $ "Could not uniquely determine the maintainer: " ++ show maintainer--getArches :: Files -> [String]-getArches files =-    let debArchs = map (fieldValue "Architecture" . snd) (debs files)-        tarArch  = fmap (const "source") (tar files)-        diffArch = fmap (const "source") (diff files)-    in-      nub $ catMaybes (tarArch : diffArch : debArchs)---getBinArch :: Files -> String-getBinArch files =-    let binArch = nub $ mapMaybe (fieldValue "Architecture" . snd) (debs files)-    in-      if singleton binArch-         then head binArch-         else case (filter (/= "all") binArch) of-                [b] -> b-                _ -> error $ "Could not uniquely determine binary architecture: " ++ show binArch--mkFileLine :: FilePath -> IO String-mkFileLine fp-    | ".deb" `isSuffixOf` fp =-        do sum <- L.readFile fp >>= return . show . MD5.md5-           size <- liftM fileSize $ getFileStatus fp-           (Control (p:_)) <- Deb.fields fp-           return $ concat [ " ", sum, " ", show size, " ", fromMaybe "unknown" (fieldValue "Section" p), " "-                           , fromMaybe "optional" (fieldValue "Priority" p), " ", (takeBaseName fp)-                           ]-    | otherwise =-        do sum <- L.readFile fp >>= return . show . MD5.md5-           size <- liftM fileSize $ getFileStatus fp-           return $ concat [ " ", sum, " ", show size, " ", "unknown", " "-                           , "optional"," ", (takeBaseName fp)-                           ]---- more implementations can be found at:--- http://www.google.com/codesearch?hl=en&lr=&q=%22%5BEither+a+b%5D+-%3E+%28%5Ba%5D%2C%5Bb%5D%29%22&btnG=Search-unzipEithers :: [Either a b] -> ([a],[b])-unzipEithers = foldr unzipEither ([],[])-    where-      unzipEither (Left l) ~(ls, rs) = (l:ls, rs)-      unzipEither (Right r) ~(ls, rs) = (ls, r:rs)---- move to different library-debNameSplit :: String -> Either FilePath (String, String, String)-debNameSplit fp =-    case (takeFileName fp) =~ "^(.*)_(.*)_(.*).deb$" of-      [[_, name, version, arch]] -> Right (name, version, arch)-      _ -> Left fp---loadFiles :: [FilePath] -> IO Files-loadFiles files =-       let (dscs', files'') = partition (isSuffixOf ".dsc") files'-           (debs', files') = partition (isSuffixOf ".deb") files-           (tars', files''') = partition (isSuffixOf ".tar.gz") files''-           (diffs', rest) = partition (isSuffixOf ".diff.gz") files'''-           errors = concat [ if (length debs'  < 1) then [NoDebs] else []-                           , if (length dscs'  > 1) then [TooManyDscs dscs']   else []-                           , if (length tars'  > 1) then [TooManyTars tars']   else []-                           , if (length diffs' > 1) then [TooManyDiffs diffs'] else []-                           , if (length rest  > 0) then [UnknownFiles rest]  else []-                           ]-       in-         do when (not . null $ errors) (error $ show errors)-            dsc' <- mapM loadDsc (listToMaybe dscs')-            debs'' <- mapM loadDeb debs'-            return $ Files { dsc = dsc', debs = debs'', tar = listToMaybe tars', diff = listToMaybe diffs' }-         -- if (not . null $ errors) then throwDyn errors else return (debs, listToMaybe dscs, listToMaybe tars, listToMaybe diffs)-    where-      loadDsc :: FilePath -> IO (FilePath, Paragraph)-      loadDsc dsc' =-          do res <- parseControlFromFile dsc'-             case  res of-               (Left e) -> error $ "Error parsing " ++ dsc' ++ "\n" ++ show e-               (Right (Control [p])) -> return (dsc', p)-               (Right c) -> error $ dsc' ++ " did not have exactly one paragraph: " ++ prettyShow c-      loadDeb :: FilePath -> IO (FilePath, Paragraph)-      loadDeb deb =-          do res <- Deb.fields deb-             case res of-               (Control [p]) -> return (deb, p)-               _ -> error $ deb ++ " did not have exactly one paragraph: " ++ prettyShow res---getUploader :: IO String-getUploader =-    do debFullName <--           do dfn <- try (getEnv "DEBFULLNAME")-              case dfn of-                (Right n) -> return n-                (Left (_ :: SomeException)) ->-                    do dfn' <-try (getEnv "USER")-                       case dfn' of-                         (Right n) -> return n-                         (Left (_ :: SomeException)) -> error $ "Could not determine user name, neither DEBFULLNAME nor USER enviroment variables were set."-       emailAddr <--           do eml <- try (getEnv "DEBEMAIL")-              case eml of-                (Right e) -> return e-                (Left (_ :: SomeException)) ->-                    do eml' <- try (getEnv "EMAIL")-                       case eml' of-                         (Right e) -> return e-                         (Left (_ :: SomeException)) -> getHostName -- FIXME: this is not a FQDN-       return $ debFullName ++ " <" ++ emailAddr ++ ">"---- * Utils--singleton :: [a] -> Bool-singleton [_] = True-singleton _ = False
− debian-haskell/Debian/Version.hs
@@ -1,16 +0,0 @@--- |A module for parsing, comparing, and (eventually) modifying debian version--- numbers. <http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Version>-module Debian.Version-    (DebianVersion -- |Exported abstract because the internal representation is likely to change-    , prettyDebianVersion-    , parseDebianVersion-    , parseDebianVersion'-    , epoch-    , version-    , revision-    , buildDebianVersion-    , evr-    ) where--import Debian.Version.Common-import Debian.Version.String ()
− debian-haskell/Debian/Version/ByteString.hs
@@ -1,18 +0,0 @@-{-# OPTIONS -fno-warn-orphans #-}-module Debian.Version.ByteString-    ( ParseDebianVersion(..)-    ) where--import Text.ParserCombinators.Parsec--import qualified Data.ByteString.Char8 as C--import Debian.Version.Common-import Debian.Version.Internal--instance ParseDebianVersion C.ByteString where-    parseDebianVersion byteStr =-        let str = C.unpack byteStr in-        case parse parseDV str str of-          Left e -> Left e-          Right dv -> Right (DebianVersion str dv)
− debian-haskell/Debian/Version/Common.hs
@@ -1,185 +0,0 @@--- |A module for parsing, comparing, and (eventually) modifying debian version--- numbers. <http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Version>-{-# LANGUAGE FlexibleInstances #-}-{-# OPTIONS -fno-warn-orphans -fno-warn-unused-do-bind #-}-module Debian.Version.Common-    ( DebianVersion -- |Exported abstract because the internal representation is likely to change-    , prettyDebianVersion-    , ParseDebianVersion(..)-    , parseDebianVersion'-    , evr               -- DebianVersion -> (Maybe Int, String, Maybe String)-    , epoch-    , version-    , revision-    , buildDebianVersion-    , parseDV-    ) where--import Data.Char (ord, isDigit, isAlpha)-import Debian.Pretty (PP(..))-import Debian.Version.Internal-import Text.ParserCombinators.Parsec-import Text.Regex-import Text.PrettyPrint (Doc, render)-import Text.PrettyPrint.HughesPJClass (Pretty(pPrint), text)--prettyDebianVersion :: DebianVersion -> Doc-prettyDebianVersion (DebianVersion s _) = text s--instance Pretty (PP DebianVersion) where-    pPrint = prettyDebianVersion . unPP--instance Eq DebianVersion where-    (DebianVersion _ v1) == (DebianVersion _ v2) = v1 == v2--instance Ord DebianVersion where-    compare (DebianVersion _ v1) (DebianVersion _ v2) = compare v1 v2--instance Show DebianVersion where-    show v = "(Debian.Version.parseDebianVersion (" ++ show (render (prettyDebianVersion v)) ++ " :: String))"---- make ~ less than everything, and everything else higher that letters-order :: Char -> Int-order c-    | isDigit c = 0-    | isAlpha c = ord c-    | c == '~' = -1-    | otherwise = (ord c) + 256---- |We have to do this wackiness because ~ is less than the empty string-compareNonNumeric :: [Char] -> [Char] -> Ordering-compareNonNumeric "" "" = EQ-compareNonNumeric "" ('~':_cs) = GT-compareNonNumeric ('~':_cs) "" = LT-compareNonNumeric "" _ = LT-compareNonNumeric _ "" = GT-compareNonNumeric (c1:cs1) (c2:cs2) =-    if (order c1) == (order c2)-       then compareNonNumeric cs1 cs2-       else compare (order c1) (order c2)--instance Eq NonNumeric where-    (NonNumeric s1 n1) == (NonNumeric s2 n2) =-        case compareNonNumeric s1 s2 of-          EQ -> n1 == n2-          _o -> False--instance Ord NonNumeric where-    compare (NonNumeric s1 n1) (NonNumeric s2 n2) =-        case compareNonNumeric s1 s2 of-          EQ -> compare n1 n2-          o -> o--instance Eq Numeric where-    (Numeric n1 mnn1) == (Numeric n2 mnn2) =-        case compare n1 n2 of-          EQ -> case compareMaybeNonNumeric mnn1 mnn2 of-                  EQ -> True-                  _ -> False-          _ -> False--compareMaybeNonNumeric :: Maybe NonNumeric -> Maybe NonNumeric -> Ordering-compareMaybeNonNumeric mnn1 mnn2 =-    case (mnn1, mnn2) of-      (Nothing, Nothing) -> EQ-      (Just (NonNumeric nn _), Nothing) -> compareNonNumeric nn ""-      (Nothing, Just (NonNumeric nn _)) -> compareNonNumeric "" nn-      (Just nn1, Just nn2) -> compare nn1 nn2--instance Ord Numeric where-    compare (Numeric n1 mnn1) (Numeric n2 mnn2) =-        case compare n1 n2 of-          EQ -> compareMaybeNonNumeric mnn1 mnn2-          o -> o---- * Parser--class ParseDebianVersion a where-    parseDebianVersion :: a-> Either ParseError DebianVersion--- |Convert a string to a debian version number. May throw an--- exception if the string is unparsable -- but I am not sure if that--- can currently happen. Are there any invalid version strings?--- Perhaps ones with underscore, or something?--parseDebianVersion' :: ParseDebianVersion string => string -> DebianVersion-parseDebianVersion' str = either (\e -> error (show e)) id (parseDebianVersion str)--{--showNN :: NonNumeric -> String-showNN (NonNumeric s n) = s ++ showN n--showN :: Found Numeric -> String-showN (Found (Numeric n nn)) = show n ++ maybe "" showNN nn-showN (Simulated _) = ""--}--parseDV :: CharParser () (Found Int, NonNumeric, Found NonNumeric)-parseDV =-    do skipMany $ oneOf " \t"-       e <- parseEpoch-       upstreamVersion <- parseNonNumeric True True-       debianRevision <- option (Simulated (NonNumeric "" (Simulated (Numeric 0 Nothing)))) (char '-' >> parseNonNumeric True False >>= return . Found)-       return (e, upstreamVersion, debianRevision)--parseEpoch :: CharParser () (Found Int)-parseEpoch =-    option (Simulated 0) (try (many1 digit >>= \d -> char ':' >> return (Found (read d))))---parseNonNumeric :: Bool -> Bool -> CharParser () NonNumeric-parseNonNumeric zeroOk upstream =-    do nn <- (if zeroOk then many else many1) ((noneOf "-0123456789") <|> (if upstream then upstreamDash else pzero))-       n <- parseNumeric upstream-       return $ NonNumeric nn n-    where-      upstreamDash :: CharParser () Char-      upstreamDash = try $ do char '-'-                              lookAhead $ (many (noneOf "- \n\t") >> char '-')-                              return '-'--parseNumeric :: Bool -> CharParser () (Found Numeric)-parseNumeric upstream =-    do n <- many1 (satisfy isDigit)-       nn <- option Nothing  (parseNonNumeric False upstream >>= return . Just)-       return $ Found (Numeric (read n) nn)-    <|>-    return (Simulated (Numeric 0 Nothing))--{--compareTest :: String -> String -> Ordering-compareTest str1 str2 =-    let v1 = either (error . show) id $ parse parseDV str1 str1-        v2 = either (error . show) id $ parse parseDV str2 str2-        in-          compare v1 v2--}---- |Split a DebianVersion into its three components: epoch, version,--- revision.  It is not safe to use the parsed version number for--- this because you will lose information, such as leading zeros.-evr :: DebianVersion -> (Maybe Int, String, Maybe String)-evr (DebianVersion s _) =-    let re = mkRegex "^(([0-9]+):)?(([^-]*)|((.*)-([^-]*)))$" in-    --                 (         ) (        (            ))-    --                  (   e  )    (  v  )  (v2) (  r  )-    case matchRegex re s of-      Just ["", _, _, v, "", _, _] -> (Nothing, v, Nothing)-      Just ["", _, _, _, _,  v, r] -> (Nothing, v, Just r)-      Just [_,  e, _, v, "", _, _] -> (Just (read e), v, Nothing)-      Just [_,  e, _, _, _,  v, r] -> (Just (read e), v, Just r)-      -- I really don't think this can happen.-      _ -> error ("Invalid Debian Version String: " ++ s)--epoch :: DebianVersion -> Maybe Int-epoch v = case evr v of (x, _, _) -> x-version :: DebianVersion -> String-version v = case evr v of (_, x, _) -> x-revision :: DebianVersion -> Maybe String-revision v = case evr v of (_, _, x) -> x---- Build a Debian version number from epoch, version, revision-buildDebianVersion :: Maybe Int -> String -> Maybe String -> DebianVersion-buildDebianVersion e v r =-    either (error . show) (DebianVersion str) $ parse parseDV str str-    where-      str = (maybe "" (\ n -> show n ++ ":") e ++ v ++ maybe "" (\ s -> "-" ++ s) r)
− debian-haskell/Debian/Version/Internal.hs
@@ -1,36 +0,0 @@-{-# LANGUAGE DeriveDataTypeable, FlexibleContexts #-}-module Debian.Version.Internal-    ( DebianVersion(..)-    , Numeric(..)-    , NonNumeric(..)-    , Found(..)-    ) where--import Data.Data (Data)-import Data.Typeable (Typeable)---- Currently we store the original version string in the data-type so--- that we can faithfully reproduce it quickly. Currently we do not--- have any way to modify a version number -- so this works fine. May--- have to change later.-data DebianVersion-    = DebianVersion String (Found Int, NonNumeric, Found NonNumeric) deriving (Data, Typeable)--data NonNumeric-    = NonNumeric String (Found Numeric)-      deriving (Show, Data, Typeable)--data Numeric-    = Numeric Int (Maybe NonNumeric)-      deriving (Show, Data, Typeable)--data Found a-    = Found { unFound :: a }-    | Simulated { unFound :: a }-      deriving (Show, Data, Typeable)--instance (Eq a) => Eq (Found a) where-    f1 == f2 = (unFound f1) == (unFound f2)--instance (Ord a) => Ord (Found a) where-    compare f1 f2 = compare (unFound f1) (unFound f2)
− debian-haskell/Debian/Version/String.hs
@@ -1,25 +0,0 @@-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}-{-# OPTIONS -fno-warn-orphans #-}-module Debian.Version.String-    ( ParseDebianVersion(..)-    ) where--import Text.ParserCombinators.Parsec--import Data.List (stripPrefix)-import Debian.Version.Common-import Debian.Version.Internal--instance ParseDebianVersion String where-    parseDebianVersion str =-        case parse parseDV str str of-          Left e -> Left e-          Right dv -> Right (DebianVersion str dv)- -instance Read DebianVersion where-    readsPrec _ s =-        case stripPrefix "Debian.Version.parseDebianVersion " s of-          Just s' -> case reads s' :: [(String, String)] of-                       []-> []-                       (v, s'') : _ -> [(parseDebianVersion' v, s'')]-          Nothing -> []
− debian-haskell/Debian/Version/Text.hs
@@ -1,18 +0,0 @@-{-# OPTIONS -fno-warn-orphans #-}-module Debian.Version.Text-    ( ParseDebianVersion(..)-    ) where--import Text.ParserCombinators.Parsec--import qualified Data.Text as T--import Debian.Version.Common-import Debian.Version.Internal--instance ParseDebianVersion T.Text where-    parseDebianVersion text =-        let str = T.unpack text in-        case parse parseDV str str of-          Left e -> Left e-          Right dv -> Right (DebianVersion str dv)
debian/changelog view
@@ -1,3 +1,23 @@+haskell-cabal-debian (4.31.9) unstable; urgency=low++  * Fix official haskell packages repository URI+  * Update expected test results++ -- David Fox <dsf@seereason.com>  Mon, 21 Dec 2015 09:14:14 -0800++haskell-cabal-debian (4.31.8) unstable; urgency=low++  * Handle some idempotent cases in mapCabal and splitCabal+  * Add version split for happstack-authenticate package++ -- David Fox <dsf@seereason.com>  Thu, 08 Oct 2015 11:42:13 -0400++haskell-cabal-debian (4.31.7) unstable; urgency=low++  * Allow optparse-applicative-0.12.++ -- David Fox <dsf@seereason.com>  Fri, 25 Sep 2015 11:18:00 -0700+ haskell-cabal-debian (4.31.6) unstable; urgency=low    * Signature change in Debian.Version.parseDebianVersion
debian/control view
@@ -7,8 +7,9 @@  cdbs,  ghc,  ghc-prof,- libghc-cabal-dev (>= 1.18) | ghc,- libghc-cabal-prof (>= 1.18) | ghc-prof,+ libghc-cabal-dev (>= 1.16),+ libghc-cabal-dev (>= 1.18),+ libghc-cabal-prof (>= 1.18),  libghc-diff-dev (>= 0.3.1),  libghc-diff-prof (>= 0.3.1),  libghc-hunit-dev,@@ -112,7 +113,7 @@ Depends: ${haskell:Depends},  ${misc:Depends},  ${shlibs:Depends},- debian-policy+ debian-policy, Recommends: ${haskell:Recommends}, Suggests: ${haskell:Suggests}, Conflicts: ${haskell:Conflicts},
src/Debian/Debianize/DebianName.hs view
@@ -21,7 +21,7 @@ import Debian.Debianize.CabalInfo as A (debianNameMap, packageDescription, debInfo) import Debian.Debianize.BinaryDebDescription as Debian (PackageType(..)) import Debian.Debianize.DebInfo as D (overrideDebianNameBase, utilsPackageNameBase)-import Debian.Debianize.VersionSplits (DebBase(DebBase, unDebBase), doSplits, insertSplit, makePackage, VersionSplits)+import Debian.Debianize.VersionSplits (DebBase(DebBase, unDebBase), doSplits, insertSplit, makePackage, VersionSplits(oldestPackage, splits)) import Debian.Orphans () import Debian.Relation (PkgName(..), Relations) import qualified Debian.Relation as D (VersionReq(EEQ))@@ -107,6 +107,7 @@     where       f :: Maybe VersionSplits -> Maybe VersionSplits       f Nothing = Just (makePackage dname)+      f (Just sp) | any (== dname) (oldestPackage sp : map snd (splits sp)) = Just sp       f (Just sp) = error $ "mapCabal " ++ show pname ++ " " ++ show dname ++ ": - already mapped: " ++ show sp  -- | Map versions less than ver of Cabal Package pname to Debian package ltname
src/Debian/Debianize/Details.hs view
@@ -27,7 +27,7 @@        A.epochMap %= Map.insert (PackageName "HTTP") 1        -- Associate some build tools and their corresponding        -- (eponymous) debian package names-       mapM (\name -> (A.debInfo . D.execMap) %= Map.insert name [[Rel (BinPkgName name) Nothing Nothing]])+       mapM_ (\name -> (A.debInfo . D.execMap) %= Map.insert name [[Rel (BinPkgName name) Nothing Nothing]])             ["ghc", "happy", "alex", "hsx2hs"]        -- The parsec debs are suffixed with either "2" or "3"        mapCabal (PackageName "parsec") (DebBase "parsec3")@@ -42,3 +42,6 @@        mapCabal (PackageName "haskell-src-exts") (DebBase "src-exts")        mapCabal (PackageName "haskell-src-meta") (DebBase "src-meta")        mapCabal (PackageName "Cabal") (DebBase "cabal")++       mapCabal (PackageName "happstack-authenticate") (DebBase "happstack-authenticate")+       splitCabal (PackageName "happstack-authenticate") (DebBase "happstack-authenticate-0") (Version [2] [])
src/Debian/Debianize/Finalize.hs view
@@ -351,19 +351,23 @@                   _ -> error $ "There is no official packaging for " ++ show flavor  officialSettings :: (Monad m, Functor m) => CabalT m ()-officialSettings =-    do pkgDesc <- use A.packageDescription-       let PackageName cabal = pkgName (Cabal.package pkgDesc)+officialSettings = do+    pkgDesc <- use A.packageDescription+    let PackageName cabal = pkgName (Cabal.package pkgDesc)+    zoom A.debInfo $ do+        let officialError = error "officialSettings: no sourcePackageName" -       (A.debInfo . D.control . S.standardsVersion) .?= Just (parseStandardsVersion "3.9.6")-       (A.debInfo . D.control . S.homepage) .?= Just ("http://hackage.haskell.org/package/" <> pack cabal)-       (A.debInfo . D.omitProfVersionDeps) .= True-       SrcPkgName src <- use (A.debInfo . D.sourcePackageName) >>= maybe (error "officialSettings: no sourcePackageName") return+        D.omitProfVersionDeps .= True+        SrcPkgName src <- fromMaybe officialError <$> use D.sourcePackageName -       (A.debInfo . D.control . S.vcsFields) %= Set.union (Set.fromList-          [ S.VCSBrowser $ "http://darcs.debian.org/cgi-bin/darcsweb.cgi?r=pkg-haskell/" <> pack src-          , S.VCSDarcs  $ "http://darcs.debian.org/pkg-haskell/" <> pack src-          ])+        let packagesURI = "https://anonscm.debian.org/cgit/pkg-haskell/DHG_packages.git/tree/p/" <> pack src+        zoom D.control $ do+           S.standardsVersion .?= Just (parseStandardsVersion "3.9.6")+           S.homepage .?= Just ("http://hackage.haskell.org/package/" <> pack cabal)+           S.vcsFields %= Set.union (Set.fromList+              [ S.VCSBrowser packagesURI+              , S.VCSGit  "git://git.debian.org/git/pkg-haskell/DHG_packages.git"+              ])  putBuildDeps :: (Monad m, Functor m) => (Relations -> Relations) -> PackageDescription -> CabalT m () putBuildDeps finalizeRelations pkgDesc =
src/Debian/Debianize/VersionSplits.hs view
@@ -4,7 +4,7 @@ module Debian.Debianize.VersionSplits     ( DebBase(DebBase, unDebBase)     -- * Combinators for VersionSplits-    , VersionSplits+    , VersionSplits(..)     , makePackage     , insertSplit     -- * Operators on VersionSplits@@ -43,7 +43,7 @@       -- ^ Each pair is The version where the split occurs, and the       -- name to use for versions greater than or equal to that       -- version.  This list assumed to be in (must be kept in)-      -- ascending version number order.+      -- descending version number order, newest to oldest       } deriving (Eq, Ord, Data, Typeable)  instance Show VersionSplits where@@ -59,12 +59,16 @@ makePackage name = VersionSplits {oldestPackage = name, splits = []}  -- | Split the version range and give the older packages a new name.-insertSplit :: Version -> DebBase -> VersionSplits -> VersionSplits+insertSplit :: Version -- ^ Where to split the version range+            -> DebBase -- ^ The name to use for versions older than the split+            -> VersionSplits+            -> VersionSplits insertSplit ver@(Version _ _) ltname sp@(VersionSplits {}) =     -- (\ x -> trace ("insertSplit " ++ show (ltname, ver, sp) ++ " -> " ++ show x) x) $     case splits sp of       -- This is the oldest split, change oldestPackage and insert a new head pair       (ver', _) : _ | ver' > ver -> sp {oldestPackage = ltname, splits = (ver, oldestPackage sp) : splits sp}+      (ver', name) : _ | ver' == ver && name == ltname -> sp       [] -> sp {oldestPackage = ltname, splits = [(ver, oldestPackage sp)]}       -- Not the oldest split, insert it in its proper place.       _ -> sp {splits = reverse (insert (reverse (splits sp)))}
test-data/artvaluereport-data/output/debian/control view
@@ -62,8 +62,6 @@                , libghc-mtl-prof                , libghc-network-dev (>= 2.4)                , libghc-network-prof (>= 2.4)-	       , libghc-old-time-dev-	       , libghc-old-time-prof                , libghc-pandoc-dev                , libghc-pandoc-prof                , libghc-pandoc-types-dev@@ -92,6 +90,8 @@                , libghc-text-prof                , libghc-utf8-string-dev                , libghc-utf8-string-prof+               , libghc-xhtml-dev+               , libghc-xhtml-prof Build-Depends-Indep: ghc-doc                      , libghc-extra-doc                      , libghc-hunit-doc@@ -120,7 +120,6 @@                      , libghc-maccatcher-doc                      , libghc-mtl-doc                      , libghc-network-doc-		     , libghc-old-time-doc                      , libghc-pandoc-doc                      , libghc-pandoc-types-doc                      , libghc-parsec3-doc (>= 3) | libghc-parsec2-doc (<< 3)@@ -135,6 +134,7 @@                      , libghc-syb-with-class-doc                      , libghc-text-doc                      , libghc-utf8-string-doc+                     , libghc-xhtml-doc Standards-Version: 3.9.6 Homepage: http://artvaluereportonline.com X-Description: Data structures used by the fine art appraisal application
test-data/artvaluereport2/output/debian/control view
@@ -30,7 +30,7 @@                , libghc-fb-dev                , libghc-groom-dev                , libghc-happstack-dev-               , libghc-happstack-authenticate-dev+               , libghc-happstack-authenticate-dev (>= 2) | libghc-happstack-authenticate-0-dev (<< 2),                , libghc-happstack-extra-dev                , libghc-happstack-hsp-dev                , libghc-happstack-scaffolding-dev (>= 0.23)@@ -49,8 +49,6 @@                , libghc-lifted-base-dev                , libghc-mtl-dev                , libghc-network-dev (>= 2.4)-	       , libghc-old-locale-dev-	       , libghc-old-time-dev                , libghc-pandoc-dev 	       , libghc-parsec3-dev                , libghc-process-extras-dev (>= 0.5)@@ -64,12 +62,14 @@                , libghc-syb-with-class-dev                , libghc-tagged-dev                , libghc-text-dev+               , libghc-transformers-dev                , libghc-uniplate-dev                , libghc-utf8-string-dev                , libghc-web-routes-dev                , libghc-web-routes-happstack-dev                , libghc-web-routes-hsp-dev                , libghc-web-routes-th-dev+               , libghc-xhtml-dev Standards-Version: 3.9.6 Homepage: http://appraisalreportonline.com X-Description: Haskell modules for fine art appraisal applications
test-data/creativeprompts/output/debian/control view
@@ -22,7 +22,6 @@                , libghc-digestive-functors-dev (>= 0.2)                , libghc-digestive-functors-happstack-dev (>= 0.1)                , libghc-digestive-functors-hsp-dev (>= 0.3.1)-               , libghc-extensible-exceptions-dev                , libghc-happstack-authenticate-dev (>= 0.6)                , libghc-happstack-hsp-dev (>= 7.1)                , libghc-happstack-hsp-dev (<< 7.2)@@ -38,8 +37,6 @@                , libghc-json-dev                , libghc-mtl-dev                , libghc-network-dev-               , libghc-old-locale-dev-               , libghc-old-time-dev                , libghc-parsec3-dev (>= 3) | libghc-parsec2-dev (<< 3)                , libghc-random-dev                , libghc-safecopy-dev (>= 0.6.0)