cabal-rpm-0.9.2: src/Commands/Update.hs
-- |
-- Module : Commands.Update
-- Copyright : (C) 2014 Jens Petersen
--
-- Maintainer : Jens Petersen <petersen@fedoraproject.org>
-- Stability : alpha
--
-- Explanation: update spec file to a new package version
-- 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.
module Commands.Update (
update
) where
import Commands.Spec (createSpecFile)
import FileUtils (withTempDirectory)
import PackageUtils (PackageData (..), bringTarball, isGitDir, latestPkg,
packageName, packageVersion, prepare, removePrefix)
import Setup (RpmFlags (..))
import SysCmd (cmd_, shell, (+-+))
import Control.Monad (when)
import Distribution.PackageDescription (PackageDescription (..))
import Distribution.Simple.Utils (die)
import System.Directory (createDirectory, getCurrentDirectory,
setCurrentDirectory)
update :: PackageData -> RpmFlags -> IO ()
update pkgdata flags =
case specFilename pkgdata of
Nothing -> die "No (unique) .spec file in directory."
Just spec -> do
withTempDirectory $ \cwd -> do
let pkg = package $ packageDesc pkgdata
name = packageName pkg
ver = packageVersion pkg
current = name ++ "-" ++ ver
curspec <- createSpecVersion current spec
latest <- latestPkg name
if current == latest
then error $ current +-+ "is latest version."
else do
newspec <- createSpecVersion latest spec
getCurrentDirectory >>= putStrLn
shell $ "diff -u1 -I \"- spec file generated by cabal-rpm\" -I \"Fedora Haskell SIG <haskell@lists.fedoraproject.org>\"" +-+ curspec +-+ newspec +-+ "| patch -d" +-+ cwd +-+ "-p1"
setCurrentDirectory cwd
cmd_ "sed" ["-i", "-e s/^\\(Release: \\).*/\\10%{?dist}/", spec]
let newver = removePrefix (name ++ "-") latest
cmd_ "rpmdev-bumpspec" ["-c", "update to" +-+ newver, spec]
bringTarball latest
pkgGit <- isGitDir cwd
when pkgGit $
cmd_ "fedpkg" ["new-sources", latest ++ ".tar.gz"]
where
createSpecVersion :: String -> String -> IO FilePath
createSpecVersion ver spec = do
pkgdata' <- prepare (Just ver) flags
let pkgdata'' = pkgdata' { specFilename = Just spec }
createDirectory ver
createSpecFile pkgdata'' flags (Just ver)