blob: c72edeaa4cb3e4f310b119f8766afd1967b6d930 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
module Git
( withWorkingTree,
getCommitHashes,
getRootDir,
)
where
import Control.Exception (finally)
import Data.ByteString.Lazy.Char8 qualified as LB8
import Data.Text qualified as T
import Data.Text.Encoding qualified as T
import Process (proc, sh, sh_)
import System.Directory (createDirectoryIfMissing)
import System.FilePath (dropTrailingPathSeparator, takeDirectory)
-- | Runs an IO-action within a working tree.
withWorkingTree :: FilePath -> T.Text -> IO a -> IO a
withWorkingTree path hash action = do
createDirectoryIfMissing True (takeDirectory (dropTrailingPathSeparator path))
sh_ $ proc "git worktree add --quiet --detach % %" path hash
action `finally` do
sh_ $ proc "git worktree remove --force %" path
getCommitHashes :: IO [T.Text]
getCommitHashes = T.lines . T.decodeUtf8 . LB8.toStrict <$> sh "git log --format=%H"
getRootDir :: IO FilePath
getRootDir = T.unpack . T.decodeUtf8 . LB8.toStrict <$> sh (proc "git rev-parse --show-toplevel")
|