packages feed

dpkg 0.0.0 → 0.0.1

raw patch · 7 files changed

+175/−15 lines, 7 filesdep +bytestringPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: bytestring

API changes (from Hackage documentation)

- Debian.Dpkg.DB: getConfigVersion :: C'pkginfo -> IO String
+ Debian.Dpkg.DB: c'parseversion :: Ptr C'versionrevision -> CString -> Ptr C'dpkg_error -> IO CInt
+ Debian.Dpkg.DB: c'versioncompare :: Ptr C'versionrevision -> Ptr C'versionrevision -> IO CInt
+ Debian.Dpkg.DB: parseVersion :: ByteString -> IO (Either String C'versionrevision)
+ Debian.Dpkg.Enums: instance Enum DpkgMsgType
+ Debian.Dpkg.Enums: instance Eq DpkgMsgType
+ Debian.Dpkg.Enums: instance Show DpkgMsgType
+ Debian.Dpkg.Types: C'dpkg_error :: C'dpkg_msg_type -> CString -> C'dpkg_error
+ Debian.Dpkg.Types: c'dpkg_error'str :: C'dpkg_error -> CString
+ Debian.Dpkg.Types: c'dpkg_error'type :: C'dpkg_error -> C'dpkg_msg_type
+ Debian.Dpkg.Types: data C'dpkg_error
+ Debian.Dpkg.Types: instance Eq C'dpkg_error
+ Debian.Dpkg.Types: instance Show C'dpkg_error
+ Debian.Dpkg.Types: instance Storable C'dpkg_error
+ Debian.Dpkg.Types: p'dpkg_error'str :: Ptr (C'dpkg_error) -> Ptr (CString)
+ Debian.Dpkg.Types: p'dpkg_error'type :: Ptr (C'dpkg_error) -> Ptr (C'dpkg_msg_type)
+ Debian.Dpkg.Types: type C'dpkg_msg_type = CUInt
+ Debian.Dpkg.VersionRevision: VersionRevision :: Int -> ByteString -> ByteString -> VersionRevision
+ Debian.Dpkg.VersionRevision: data VersionRevision
+ Debian.Dpkg.VersionRevision: getConfigVersion :: C'pkginfo -> IO String
+ Debian.Dpkg.VersionRevision: instance Eq VersionRevision
+ Debian.Dpkg.VersionRevision: instance Ord C'versionrevision
+ Debian.Dpkg.VersionRevision: instance Show VersionRevision
+ Debian.Dpkg.VersionRevision: peekVersionRevision :: C'versionrevision -> IO VersionRevision
+ Debian.Dpkg.VersionRevision: vr_epoch :: VersionRevision -> Int
+ Debian.Dpkg.VersionRevision: vr_revision :: VersionRevision -> ByteString
+ Debian.Dpkg.VersionRevision: vr_version :: VersionRevision -> ByteString

Files

+ Debian/Dpkg.hs view
@@ -0,0 +1,11 @@+module Debian.Dpkg+        ( module Debian.Dpkg.DB+        , module Debian.Dpkg.Enums+        , module Debian.Dpkg.Types+        , module Debian.Dpkg.VersionRevision+        ) where++import Debian.Dpkg.DB+import Debian.Dpkg.Enums+import Debian.Dpkg.Types+import Debian.Dpkg.VersionRevision
Debian/Dpkg/DB.hsc view
@@ -26,7 +26,9 @@   , setDbDir   , pkgDbFind   , pkgList-  , getConfigVersion+  , parseVersion+  , c'parseversion+  , c'versioncompare ) where #strict_import @@ -35,6 +37,7 @@ import Foreign.Marshal.Utils (with) import Control.Monad (liftM, join) import Control.Monad.Loops (unfoldrM)+import qualified Data.ByteString as BS import Debian.Dpkg.Types  #include <dpkg/dpkg-db.h>@@ -76,13 +79,22 @@ pkgDbFind :: String -> IO C'pkginfo pkgDbFind p = withCString p c'pkg_db_find >>= peek -getConfigVersion :: C'pkginfo -> IO String-getConfigVersion p = do-		v <- peekCString (c'versionrevision'version vr)-		r <- peekCString (c'versionrevision'revision vr)-		return $ nonZeroEpoch e ++ v ++ nonNativeRevision r-	where-		nonZeroEpoch e = if e == 0 then "" else (show e) ++ ":"-		nonNativeRevision r = if r == "" then r else "-" ++ r-		e = fromIntegral (c'versionrevision'epoch vr)-		vr = c'pkginfo'configversion p+#callconv parseversion , ccall unsafe , Ptr C'versionrevision -> CString -> Ptr C'dpkg_error -> IO CInt+#callconv versioncompare , ccall unsafe , Ptr C'versionrevision -> Ptr C'versionrevision -> IO CInt++parseVersion :: BS.ByteString -> IO (Either String C'versionrevision)+parseVersion verstr = BS.useAsCString verstr $ \vercstr -> alloca $ \vrptr -> alloca $ \deptr -> do+        i <- c'parseversion vrptr vercstr deptr+        vr <- peek vrptr+        if i == 0+            then+                return $ Right vr+            else+                do+                    de <- peek deptr+                    errmsg <- peekCString (c'dpkg_error'str de)+                    if (c'dpkg_error'type de) == 1+                        then+                            return $ Right vr+                        else+                            return $ Left errmsg
Debian/Dpkg/Enums.chs view
@@ -22,6 +22,7 @@  #include <dpkg/dpkg.h> #include <dpkg/dpkg-db.h>+#include <dpkg/error.h>  {# context lib="dpkg" #} @@ -41,3 +42,5 @@ {#enum pkgeflag as PkgEflag {upcaseFirstLetter} deriving (Eq,Show) #} {#enum pkgstatus as PkgStatus {upcaseFirstLetter} deriving (Eq,Show) #} {#enum pkgpriority as PkgPriority {upcaseFirstLetter} deriving (Eq,Show) #}++{#enum dpkg_msg_type as DpkgMsgType {upcaseFirstLetter} deriving (Eq,Show) #}
Debian/Dpkg/Types.hsc view
@@ -24,7 +24,10 @@ module Debian.Dpkg.Types where #strict_import +import Data.ByteString as BS+ #include <dpkg/dpkg-db.h>+#include <dpkg/error.h>  #starttype struct versionrevision #field epoch , CInt@@ -66,4 +69,11 @@ #field installed , <pkgbin> #field available , <pkgbin> #field clientdata , Ptr <perpackagestate>+#stoptype++#integral_t enum dpkg_msg_type++#starttype struct dpkg_error+#field type , <dpkg_msg_type>+#field str , CString #stoptype
+ Debian/Dpkg/VersionRevision.hs view
@@ -0,0 +1,77 @@+{-+ VersionRevision.hs: Haskell bindings to libdpkg+   Copyright (C) 2011 Clint Adams++ This program is free software; you can redistribute it and/or modify+ it under the terms of the GNU General Public License as published by+ the Free Software Foundation; either version 3 of the License, or+ (at your option) any later version.++ This program is distributed in the hope that it will be useful,+ but WITHOUT ANY WARRANTY; without even the implied warranty of+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+ GNU General Public License for more details.++ You should have received a copy of the GNU General Public License+ along with this program; if not, write to the Free Software+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA+-}++module Debian.Dpkg.VersionRevision (+    peekVersionRevision+  , getConfigVersion+  , VersionRevision(VersionRevision,vr_epoch,vr_version,vr_revision)+) where++import Data.ByteString.Char8 (unpack)+import Foreign.Ptr (Ptr)+import Foreign.Marshal.Utils (with)+import System.IO.Unsafe (unsafePerformIO)++import Debian.Dpkg.Types+import Debian.Dpkg.DB (c'parseversion, c'versioncompare)++import qualified Data.ByteString as BS++-- #starttype struct versionrevision+-- #field epoch , CInt+-- #field version , CString+-- #field revision , CString+-- #stoptype++peekVersionRevision :: C'versionrevision -> IO VersionRevision+peekVersionRevision vr = do+        v <- BS.packCString (c'versionrevision'version vr)+        r <- BS.packCString (c'versionrevision'revision vr)+        return $ VersionRevision (fromIntegral (c'versionrevision'epoch vr)) v r++getConfigVersion :: C'pkginfo -> IO String+getConfigVersion p = do+		vr <- peekVersionRevision (c'pkginfo'configversion p)+		let e = fromIntegral (vr_epoch vr)+		let v = vr_version vr+		let r = vr_revision vr+		return $ nonZeroEpoch e ++ (unpack v) ++ nonNativeRevision r+	where+		nonZeroEpoch e = if e == 0 then "" else (show e) ++ ":"+		nonNativeRevision r = if r == BS.empty then (unpack r) else "-" ++ (unpack r)++data VersionRevision = VersionRevision {+  vr_epoch :: Int,+  vr_version :: BS.ByteString,+  vr_revision :: BS.ByteString+} deriving (Eq,Show)++cvrpCompare :: Ptr C'versionrevision -> Ptr C'versionrevision -> IO Ordering+cvrpCompare x y = do+        r <- c'versioncompare x y+        case r of+                -1 -> return LT+                0  -> return EQ+                1  -> return GT++cvrCompare :: C'versionrevision -> C'versionrevision -> Ordering+cvrCompare = (unsafePerformIO .) . (. ((. cvrpCompare) . with)) . with++instance Ord C'versionrevision where+  compare = cvrCompare
dpkg.cabal view
@@ -1,5 +1,5 @@ Name:                dpkg-Version:             0.0.0+Version:             0.0.1 Synopsis:            libdpkg bindings Description:         Haskell bindings to the libdpkg API Copyright:           (C) 2011 Clint Adams@@ -16,8 +16,13 @@ Library   build-depends:   base >= 4 && < 5                  , bindings-DSL >= 1.0.7 && < 1.1+                 , bytestring                  , monad-loops-  exposed-modules: Debian.Dpkg.DB, Debian.Dpkg.Types, Debian.Dpkg.Enums+  exposed-modules: Debian.Dpkg+                 , Debian.Dpkg.DB+                 , Debian.Dpkg.Types+                 , Debian.Dpkg.Enums+                 , Debian.Dpkg.VersionRevision   other-extensions: ForeignFunctionInterface   pkgconfig-depends: libdpkg >= 1.16.1   cpp-options: -DLIBDPKG_VOLATILE_API=1@@ -26,7 +31,7 @@ Test-Suite test   type:       exitcode-stdio-1.0   main-is:    test.hs-  build-depends: base, HUnit, dpkg+  build-depends: base, HUnit, dpkg, bytestring   pkgconfig-depends: libdpkg >= 1.16.1   extra-libraries: dpkg   default-language: Haskell98
test.hs view
@@ -2,9 +2,12 @@ import Debian.Dpkg.DB import Debian.Dpkg.Enums import Debian.Dpkg.Types+import Debian.Dpkg.VersionRevision  import Foreign.C.String (peekCString) import Foreign.Storable (peek)+import qualified Data.ByteString as BS+import Data.ByteString.Char8 (pack)  test1 = TestCase (do 	p <- pkgDbFind "testpkg"@@ -34,6 +37,45 @@ 	assertEqual "configversion" "1.2.3-4" cv         ) -tests = TestList [TestLabel "test1" test1, TestLabel "test2" test2]+test3 = TestCase (do+        cvr <- parseVersion (pack "9:8.7.6-5")+        case cvr of+             Left msg -> assertString msg+             Right v  -> do+                 vr <- peekVersionRevision v+                 assertEqual "epoch" 9 (vr_epoch vr)+                 assertEqual "version" (pack "8.7.6") (vr_version vr)+                 assertEqual "revision" (pack "5") (vr_revision vr)+        )++test4 = TestCase (do+        cvr <- parseVersion (BS.empty)+        case cvr of+             Left msg -> return ()+             Right v  -> assertString "unexpected success"+        )++test5 = TestCase (do+        cvr1 <- parseVersion (pack "9:8.7.6-5")+        cvr2 <- parseVersion (pack "1:2.3.4-5")+        case (cvr1,cvr2) of+             (Right x, Right y) -> assertEqual "comparison" True (cvr1 > cvr2)+             otherwise -> assertFailure"Failed to parse one of the versions"+        )++test6 = TestCase (do+        cvr1 <- parseVersion (pack "1~1")+        cvr2 <- parseVersion (pack "1")+        case (cvr1,cvr2) of+             (Right x, Right y) -> assertEqual "comparison" True (cvr1 < cvr2)+             otherwise -> assertFailure"Failed to parse one of the versions"+        )++tests = TestList [TestLabel "pkgDbFind" test1+                , TestLabel "pkgList" test2+                , TestLabel "parseVersion good" test3+                , TestLabel "parseVersion bad" test4+                , TestLabel "parseVersion Ord" test5+                , TestLabel "parseVersion Ord tilde" test6 ]  main = setDbDir "./testdb" >> msdbInit >> runTestTT tests