packages feed

retrie-0.1.0.1: tests/Util.hs

-- Copyright (c) Facebook, Inc. and its affiliates.
--
-- This source code is licensed under the MIT license found in the
-- LICENSE file in the root directory of this source tree.
--
module Util where

import Control.Monad
import System.Directory (createDirectoryIfMissing)
import System.Exit
import System.FilePath
import System.IO.Temp
import System.Process
import Test.HUnit

withFakeRepo :: (FilePath -> IO ()) -> (FilePath -> IO ()) -> IO ()
withFakeRepo f initialise =
  withSystemTempDirectory "retrieTmpRepo" $ \dir -> do
    initialise dir
    f dir

withFakeRepoCmds
  :: String
  -> String
  -> [FilePath]
  -> [FilePath]
  -> (FilePath -> IO ())
  -> IO ()
withFakeRepoCmds initCmd ignoreFile ignoredFiles allFiles f =
  withFakeRepo f $ \dir -> do
  doOrDie dir initCmd
  createAllFiles dir allFiles
  writeFile (dir </> ignoreFile) $ unlines ignoredFiles
  where
    createAllFiles dir files = forM_ files $ \fp -> do
      let filePath = dir </> fp
      createDirectoryIfMissing True (takeDirectory filePath)
      -- Every file has its own name as the contents.
      writeFile filePath fp

withFakeHgRepo :: [FilePath] -> [FilePath] -> (FilePath -> IO ()) -> IO ()
withFakeHgRepo ignoredFiles allFiles f =
  withFakeRepoCmds "hg init" ".hgignore" ignoredFiles allFiles $ \dir -> do
    -- Tell 'hg' which ignore file to use for the repo, because Facebook's
    -- 'hg' looks at .gitignore by default.
    writeFile (dir </> ".hg" </> "hgrc") $ unlines
      [ "[ui]"
      , "ignore = .hgignore"
      ]
    f dir

withFakeGitRepo :: [FilePath] -> [FilePath] -> (FilePath -> IO ()) -> IO ()
withFakeGitRepo = withFakeRepoCmds "git init" ".gitignore"

doOrDie :: FilePath -> String -> IO ()
doOrDie dir cmd = do
  let shellCmd = (shell cmd) { cwd = Just dir }
  (ec, _, _) <- readCreateProcessWithExitCode shellCmd ""
  case ec of
    ExitSuccess -> return ()
    ExitFailure err ->
      assertFailure $ cmd ++ " failed with: " ++ show err