packages feed

kit-0.6: Kit/Main.hs

module Kit.Main where

  import Control.Monad.Trans
  import qualified Kit.CmdArgs as KA 
  import Kit.Commands
  import Kit.Spec
  import Kit.Package
  import Kit.Project
  import Kit.Util
  import System.Cmd

  doUpdate :: Command ()
  doUpdate = do
              repo <- myRepository
              spec <- mySpec
              deps <- liftKit $ totalSpecDependencies repo spec
              puts $ "Dependencies: " ++ stringJoin ", " (map packageFileName deps)
              liftIO $ mapM_ (installKit repo) deps
              puts " -> Generating Xcode project..."
              liftKit $ generateXcodeProject deps (specKitDepsXcodeFlags spec)
              puts "Kit complete. You may need to restart Xcode for it to pick up any changes."

  doPackageKit :: Command ()
  doPackageKit = mySpec >>= liftIO . package 

  doDeployLocal :: Command ()
  doDeployLocal = mySpec >>= \spec -> liftIO $ do 
    package spec
    publishLocal spec 
    return ()
      where
        publishLocal :: KitSpec -> IO ()
        publishLocal spec = let pkg = (packageFileName spec ++ ".tar.gz")
                            in do
                              repo <- defaultLocalRepoPath
                              let thisKitDir = repo </> "kits" </> packageName spec </> packageVersion spec
                              mkdir_p thisKitDir
                              copyFile ("dist" </> pkg) (thisKitDir </> pkg)
                              copyFile "KitSpec" (thisKitDir </> "KitSpec")

  doVerify :: String -> Command ()
  doVerify sdk = do
        spec <- mySpec
        puts "Checking that the kit can be depended upon..."
        puts " #> Deploying locally"
        doDeployLocal
        puts " #> Building temporary parent project"
        tmp <- liftIO getTemporaryDirectory
        inDirectory tmp $ do
          let kitVerifyDir = "kit-verify"
          cleanOrCreate kitVerifyDir
          inDirectory kitVerifyDir $ do
            writeSpec "KitSpec" (defaultSpec "verify-kit" "1.0") { specDependencies = [specKit spec] }
            doUpdate
            inDirectory "Kits" $ do
              liftIO $ system "open KitDeps.xcodeproj"
              liftIO $ system $ "xcodebuild -sdk " ++ sdk
          puts "OK."
        puts "End checks."

  doCreateSpec :: String -> String -> Command ()
  doCreateSpec name version = do
    let spec = defaultSpec name version 
    writeSpec "KitSpec" spec
    puts $ "Created KitSpec for " ++ packageFileName spec

  handleArgs :: KA.KitCmdArgs -> Command ()
  handleArgs KA.Update = doUpdate
  handleArgs KA.Package = doPackageKit
  handleArgs KA.PublishLocal = doDeployLocal
  handleArgs (KA.Verify sdkName) = doVerify sdkName
  handleArgs (KA.CreateSpec name version) = doCreateSpec name version

  kitMain :: IO ()
  kitMain = do
      mkdir_p =<< defaultLocalRepoPath 
      args <- KA.parseArgs
      runCommand $ handleArgs args