{- This file is part of Vervis. - - Written in 2016 by fr33domlover . - - ♡ Copying is an act of love. Please copy, reuse and share. - - The author(s) have dedicated all copyright and related and neighboring - rights to this software to the public domain worldwide. This software is - distributed without any warranty. - - You should have received a copy of the CC0 Public Domain Dedication along - with this software. If not, see - . -} module Data.Git.Local ( initRepo ) where import Prelude import Control.Monad (when) import System.Directory.Tree import qualified Data.ByteString as B (ByteString, writeFile) initialConfig :: B.ByteString initialConfig = "[core]\n\ \ repositoryformatversion = 0\n\ \ filemode = true\n\ \ bare = true" initialDescription :: B.ByteString initialDescription = "Unnamed repository; edit this file to name the repository." initialHead :: B.ByteString initialHead = "ref: refs/heads/master" initialExclude :: B.ByteString initialExclude = "" initialRepoTree :: FileName -> DirTree B.ByteString initialRepoTree repo = Dir repo [ Dir "branches" [] , File "config" initialConfig , File "description" initialDescription , File "HEAD" initialHead , Dir "hooks" [] , Dir "info" [ File "exclude" initialExclude ] , Dir "objects" [ Dir "info" [] , Dir "pack" [] ] , Dir "refs" [ Dir "heads" [] , Dir "tags" [] ] ] -- | initialize a new bare repository at a specific location. -- -- Currently in the @hit@ package, i.e. version 0.6.3, the initRepo function -- creates a directory which the git executable doesn't recognize as a git -- repository. The version here creates a properly initialized repo. initRepo :: FilePath -- ^ Parent directory which already exists -> String -- ^ Name of new repo, i.e. new directory to create under the parent -> IO () initRepo path name = do let tree = path :/ initialRepoTree name result <- writeDirectoryWith B.writeFile tree let errs = failures $ dirTree result when (not . null $ errs) $ error $ show errs