packages feed

cabal-file-0.1.0: app/Cmds.hs

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