-- | -- Module : Commands.Update -- Copyright : (C) 2014-2017 Jens Petersen -- -- Maintainer : Jens Petersen -- 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 Distro (detectDistro, Distro(..)) import FileUtils (withTempDirectory) import Options (RpmFlags (..)) import PackageUtils (PackageData (..), bringTarball, getRevisedCabal, isGitDir, latestPackage, packageName, packageVersion, patchSpec, prepare, removePrefix) import SysCmd (cmd_, die, grep_, (+-+)) #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,2)) #else import Control.Applicative ((<$>)) #endif import Control.Monad (unless, when) import Data.Maybe (isJust) import Distribution.PackageDescription (PackageDescription (..)) import System.Directory (createDirectory, getCurrentDirectory, setCurrentDirectory) import System.FilePath ((<.>)) update :: PackageData -> RpmFlags -> Maybe String -> IO () update pkgdata flags mpkgver = case specFilename pkgdata of Nothing -> die "No (unique) .spec file in directory." Just spec -> do let pkgDesc = packageDesc pkgdata pkg = package pkgDesc name = packageName pkg ver = packageVersion pkg current = name ++ "-" ++ ver revised = isJust $ lookup "x-revision" (customFieldsPD pkgDesc) latest <- case mpkgver of Just pv -> return pv Nothing -> latestPackage (rpmStream flags) name let updated = current /= latest getRevisedCabal latest unless updated $ putStrLn $ current +-+ "is already latest version." when (not revised || updated) $ do gitDir <- getCurrentDirectory >>= isGitDir rwGit <- if gitDir then grep_ "url = ssh://" ".git/config" else return False when updated $ do bringTarball latest False when rwGit $ cmd_ "fedpkg" ["new-sources", latest <.> "tar.gz"] withTempDirectory $ \cwd -> do curspec <- createSpecVersion current spec revised newspec <- createSpecVersion latest spec True patchSpec (Just cwd) curspec newspec setCurrentDirectory cwd distro <- maybe detectDistro return (rpmDistribution flags) let suffix = if distro == SUSE then "" else "%{?dist}" subpkg <- grep_ "%{subpkgs}" spec unless (subpkg || rpmSubpackage flags || not updated) $ cmd_ "sed" ["-i", "-e s/^\\(Release: \\).*/\\10" ++ suffix ++ "/", spec] when updated $ do let newver = removePrefix (name ++ "-") latest if distro == SUSE then cmd_ "sed" ["-i", "-e s/^\\(Version: \\).*/\\1" ++ newver ++ "/", spec] else cmd_ "rpmdev-bumpspec" ["-c", "update to" +-+ newver, spec] when rwGit $ cmd_ "git" ["commit", "-a", "-m", "update to" +-+ newver] where createSpecVersion :: String -> String -> Bool -> IO FilePath createSpecVersion pkgver spec revise = do pkgdata' <- prepare flags (Just pkgver) revise let pkgdata'' = pkgdata' { specFilename = Just spec } dir = pkgver <.> if revise then "" else "orig" createDirectory dir createSpecFile pkgdata'' flags (Just dir)