second module!
This commit is contained in:
parent
a667d99cd1
commit
6b54817f26
1 changed files with 57 additions and 0 deletions
57
GitRepo.hs
Normal file
57
GitRepo.hs
Normal file
|
@ -0,0 +1,57 @@
|
|||
{- git repository handling -}
|
||||
|
||||
module GitRepo where
|
||||
|
||||
import Directory
|
||||
import System.Directory
|
||||
import Data.String.Utils
|
||||
|
||||
{- Returns the path to the current repository's .git directory.
|
||||
- (For a bare repository, that is the root of the repository.) -}
|
||||
gitDir :: IO String
|
||||
gitDir = do
|
||||
repo <- repoTop
|
||||
bare <- isBareRepo repo
|
||||
if (bare)
|
||||
then return repo
|
||||
else return $ repo ++ "/.git"
|
||||
|
||||
{- Finds the top of the current git repository, which may be in a parent
|
||||
- directory. -}
|
||||
repoTop :: IO String
|
||||
repoTop = do
|
||||
dir <- getCurrentDirectory
|
||||
top <- seekUp dir isRepoTop
|
||||
case top of
|
||||
(Just dir) -> return dir
|
||||
Nothing -> error "Not in a git repository."
|
||||
|
||||
seekUp :: String -> (String -> IO Bool) -> IO (Maybe String)
|
||||
seekUp dir want = do
|
||||
ok <- want dir
|
||||
if ok
|
||||
then return (Just dir)
|
||||
else case (parentDir dir) of
|
||||
(Just d) -> seekUp d want
|
||||
Nothing -> return Nothing
|
||||
|
||||
parentDir :: String -> Maybe String
|
||||
parentDir dir =
|
||||
if length dirs > 0
|
||||
then Just ("/" ++ (join "/" $ take ((length dirs) - 1) dirs))
|
||||
else Nothing
|
||||
where
|
||||
dirs = filter (\x -> length x > 0) $ split "/" dir
|
||||
|
||||
isRepoTop dir = do
|
||||
r <- isGitRepo dir
|
||||
b <- isBareRepo dir
|
||||
return (r || b)
|
||||
|
||||
isGitRepo dir = gitSignature dir ".git" ".git/config"
|
||||
isBareRepo dir = gitSignature dir "objects" "config"
|
||||
|
||||
gitSignature dir subdir file = do
|
||||
s <- (doesDirectoryExist (dir ++ "/" ++ subdir))
|
||||
f <- (doesFileExist (dir ++ "/" ++ file))
|
||||
return (s && f)
|
Loading…
Reference in a new issue