packages feed

gli-0.0.1: src/Gli/Setup.hs

{-# LANGUAGE OverloadedStrings #-}

module Gli.Setup where

import qualified Data.Attoparsec.Text as P
import qualified Data.Map.Strict      as M
import qualified Data.Text            as T
import           Data.Yaml
import           Gli.Gitlab
import           Gli.Types
import           Network.URI
import           System.Process

setupProject :: String -> IO ()
setupProject file = do
  origin <- readProcess "git"
            ["config", "--get", "remote.origin.url"]
            ""
  case P.parseOnly parseGitUrl (T.pack (origin)) of
    Left  msg    -> print msg
    Right gitUrl -> do
      print gitUrl
      cfg <- decodeFile file :: IO (Maybe GliCfg)
      case cfg of
        Nothing -> putStrLn $ mappend "Unable to parse file " (show file)
        Just b  -> if M.null matchedKeyVal
          then putStrLn $ mappend "Unable to find a relevent key for \
                                  \the domain, please check the config \
                                  \file " (show file)
          else do
          project <- getProject
            (T.strip (T.pack origin)) (head $ M.elems $  matchedKeyVal)
          encodeFile localYmlFile (LocalYmlContent
                                   (MasterFileConfig file matchedKey)
                                    project)
          appendFile gitInfoExcludeFile localYmlFile
          where
            matchedKey = head $ M.keys $ matchedKeyVal
            matchedKeyVal = fetchKeyFromAccount (accounts b) (domain gitUrl)

parseGitUrl :: P.Parser GitUrl
parseGitUrl = do
  _ <- P.string "git@"
  d <- P.takeTill (':' ==)
  _ <- P.char ':'
  r <- P.takeTill ('\n' ==)
  return $ GitUrl d r

fetchKeyFromAccount :: Account -> T.Text -> M.Map T.Text AccountConfig
fetchKeyFromAccount a g =
  M.filter (\v -> g == httpDomainConfig(url v)) (accountMap a)

httpDomainConfig :: String -> T.Text
httpDomainConfig u =
  case parseURI u of
    Nothing -> error "Unable to find remote url"
    Just a  -> case uriAuthority a of
      Nothing -> error "Unable to parse the url"
      Just b  -> T.pack $ uriRegName b

accountMap :: Account -> M.Map T.Text AccountConfig
accountMap (Account acc) = acc