module Cmds (
diffCmd,
saveCabal,
showCabal,
listPkg,
latestPkg,
listFiles,
preferCmd,
showMetadata,
dateCabal
) where
import Control.Monad
import Control.Monad.Extra
import qualified Data.ByteString.Lazy.Char8 as BL
import Data.List
import Distribution.Version (Version)
import SimpleCabal
import SimpleCmd
import System.Directory
import System.FilePath
import System.IO.Extra (withTempDir)
import Hackage.Index
-- FIXME structural diff of PackageDescription
-- FIXME revisions?
diffCmd :: String -> Version -> Version -> IO ()
diffCmd pkg v1 v2 =
withTempDir $ \ tmpdir -> do
setCurrentDirectory tmpdir
let pkgid1 = PackageIdentifier (mkPackageName pkg) v1
pkgid2 = PackageIdentifier (mkPackageName pkg) v2
saveCabals pkgid1 pkgid2
void $ cmdBool "diff" ["-u", showPkgId pkgid1 <.> "cabal", showPkgId pkgid2 <.> "cabal"]
-- pkgdesc <- finalPackageDescription [] cabal
where
saveCabals :: PackageIdentifier -> PackageIdentifier -> IO ()
saveCabals pkgid1 pkgid2 = do
(bs1,bs2) <- getCabals pkgid1 pkgid2
BL.writeFile (showPkgId pkgid1 <.> "cabal") bs1
BL.writeFile (showPkgId pkgid2 <.> "cabal") bs2
listPkg :: Maybe PackageName -> IO ()
listPkg (Just pkgname) = do
versions <- packageVersions pkgname
mapM_ (putStrLn . showVersion) versions
listPkg Nothing = fmap sort listPackages >>= mapM_ putStrLn
saveCabal :: PackageIdentifier -> IO ()
saveCabal pkgid = do
pkgver <- packageIdOrLatest pkgid
getCabal pkgver >>= BL.writeFile (showPkgId pkgid <.> "cabal")
showCabal :: PackageIdentifier -> IO ()
showCabal pkgid = do
pkgver <- packageIdOrLatest pkgid
getCabal pkgver >>= BL.putStrLn
showMetadata :: PackageIdentifier -> IO ()
showMetadata pkgid = do
pkgver <- packageIdOrLatest pkgid
finfo <- getFileInfo pkgver
let bytes = show . fileLength . fileInfoLength
putStrLn $ "Size: " ++ bytes finfo
whenJust (fileInfoSHA256 finfo) $ \ hash ->
putStrLn $ "SHA256 " ++ show hash
latestPkg :: PackageName -> IO ()
latestPkg pkgname =
whenJustM (latestVersion pkgname) (putStrLn . showVersion)
listFiles :: IO ()
listFiles = do
files <- indexFiles
mapM_ putStrLn files
preferCmd :: PackageName -> IO ()
preferCmd pkgname =
whenJustM (preferredVersions pkgname) BL.putStrLn
dateCabal :: PackageIdentifier -> IO ()
dateCabal pkgid = do
pkgver <- packageIdOrLatest pkgid
whenJustM (getTimestamp pkgver) print