packages feed

fbrnch-0.7.1: src/Cmd/Import.hs

{-# LANGUAGE OverloadedStrings #-}

module Cmd.Import (importCmd) where

import Common
import Common.System
import qualified Common.Text as T

import Network.URI

import Branches
import Bugzilla
import Cmd.RequestBranch (requestPkgBranches)
import Git
import Koji
import Krb
import ListReviews
import Package
import Prompt

-- FIXME separate pre-checked listReviews and direct pkg call, which needs checks
importCmd :: [String] -> IO ()
importCmd ps = do
  pkgs <- if null ps
    then map reviewBugToPackage <$> listReviews ReviewRepoCreated
    else return ps
  mapM_ importPkg pkgs

-- FIXME check not in a different git dir
importPkg :: String -> IO ()
importPkg pkg = do
  putPkgHdr (Package pkg)
  dir <- getCurrentDirectory
  when (pkg /= takeFileName dir) $ do
    -- FIXME check git repo exists
    clonePkg True Nothing pkg
    putStrLn ""
    setCurrentDirectory pkg
    -- FIXME: check branch is master
  unlessM isGitRepo $ error' "Not a git repo"
  newrepo <- initialPkgRepo
  if not newrepo
    then putStrLn "Skipping: already imported"
    else do
    checkWorkingDirClean
    -- FIXME get session from importPkgs
    (bid,session) <- approvedReviewBugIdSession pkg
    comments <- getComments session bid
    putBugId bid
    putStrLn ""
    mapM_ showComment comments
    putStrLn ""
    putStr "Review bug: "
    putBugId bid
    putStrLn ""
    prompt_ "Press Enter to continue"
    let srpms = map (T.replace "/reviews//" "/reviews/") $ concatMap findSRPMs comments
    when (null srpms) $ error "No srpm urls found!"
    mapM_ T.putStrLn srpms
    let srpm = (head . filter isURI . filter (".src.rpm" `isSuffixOf`) . words . T.unpack . last) srpms
    let srpmfile = takeFileName srpm
    -- FIXME if havesrpm then print local filename
    prompt_ $ "Press Enter to import " ++ srpmfile
    havesrpm <- doesFileExist srpmfile
    unless havesrpm $
      cmd_ "curl" ["--silent", "--show-error", "--remote-name", srpm]
    krbTicket
    fedpkg_ "import" [srpmfile]
    git_ "commit" ["--message", "import #" ++ show bid]
    nvr <- pkgNameVerRel' Rawhide (pkg <.> "spec")
    prompt_ $ "Press Enter to push and build " ++ nvr
    gitPushSilent Nothing
    kojiBuildBranch "rawhide" (Package pkg) Nothing ["--fail-fast"]
    putBugBuild session bid nvr
    brs <- branchingPrompt
    requestPkgBranches False Nothing brs (Package pkg)
  when (pkg /= takeFileName dir) $
    setCurrentDirectory dir
  where
    findSRPMs :: Comment -> [T.Text]
    findSRPMs =
      filter (\ l -> "https://" `T.isInfixOf` l && any (`T.isPrefixOf` T.toLower l) ["srpm url:", "srpm:", "new srpm:", "updated srpm:"] && ".src.rpm" `T.isSuffixOf` l) . T.lines . commentText

    branchingPrompt :: IO [Branch]
    branchingPrompt = do
      inp <- prompt "Enter required branches [default: latest 2]"
      if null inp
        then return []
        else
        let brs = map anyBranch $ words inp
        in if all isRelBranch brs
           then return $ map onlyRelBranch brs
           else branchingPrompt