summaryrefslogtreecommitdiff
path: root/Git/CurrentRepo.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Git/CurrentRepo.hs')
-rw-r--r--Git/CurrentRepo.hs45
1 files changed, 27 insertions, 18 deletions
diff --git a/Git/CurrentRepo.hs b/Git/CurrentRepo.hs
index 054a81e..54e05f4 100644
--- a/Git/CurrentRepo.hs
+++ b/Git/CurrentRepo.hs
@@ -1,18 +1,25 @@
{- The current git repository.
-
- - Copyright 2012 Joey Hess <id@joeyh.name>
+ - Copyright 2012-2022 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU AGPL version 3 or higher.
-}
+{-# LANGUAGE OverloadedStrings #-}
+
module Git.CurrentRepo where
import Common
+import Git
import Git.Types
import Git.Construct
import qualified Git.Config
import Utility.Env
import Utility.Env.Set
+import qualified Utility.RawFilePath as R
+
+import qualified Data.ByteString as B
+import qualified System.FilePath.ByteString as P
{- Gets the current git repository.
-
@@ -37,49 +44,51 @@ get = do
gd <- getpathenv "GIT_DIR"
r <- configure gd =<< fromCwd
prefix <- getpathenv "GIT_PREFIX"
- wt <- maybe (fromRawFilePath <$> worktree (location r)) Just
+ wt <- maybe (worktree (location r)) Just
<$> getpathenvprefix "GIT_WORK_TREE" prefix
case wt of
- Nothing -> return r
+ Nothing -> relPath r
Just d -> do
- curr <- getCurrentDirectory
+ curr <- R.getCurrentDirectory
unless (d `dirContains` curr) $
- setCurrentDirectory d
- return $ addworktree wt r
+ setCurrentDirectory (fromRawFilePath d)
+ relPath $ addworktree wt r
where
getpathenv s = do
v <- getEnv s
case v of
Just d -> do
unsetEnv s
- return (Just d)
+ return (Just (toRawFilePath d))
Nothing -> return Nothing
- getpathenvprefix s (Just prefix) | not (null prefix) =
+ getpathenvprefix s (Just prefix) | not (B.null prefix) =
getpathenv s >>= \case
Nothing -> return Nothing
Just d
| d == "." -> return (Just d)
- | otherwise -> Just <$> absPath (prefix </> d)
+ | otherwise -> Just
+ <$> absPath (prefix P.</> d)
getpathenvprefix s _ = getpathenv s
configure Nothing (Just r) = Git.Config.read r
configure (Just d) _ = do
absd <- absPath d
- curr <- getCurrentDirectory
- r <- Git.Config.read $ newFrom $
- Local
- { gitdir = toRawFilePath absd
- , worktree = Just (toRawFilePath curr)
- }
- return $ if Git.Config.isBare r
+ curr <- R.getCurrentDirectory
+ loc <- adjustGitDirFile $ Local
+ { gitdir = absd
+ , worktree = Just curr
+ }
+ r <- Git.Config.read $ (newFrom loc)
+ { gitDirSpecifiedExplicitly = True }
+ return $ if fromMaybe False (Git.Config.isBare r)
then r { location = (location r) { worktree = Nothing } }
else r
-
configure Nothing Nothing = giveup "Not in a git repository."
addworktree w r = changelocation r $ Local
{ gitdir = gitdir (location r)
- , worktree = fmap toRawFilePath w
+ , worktree = w
}
+
changelocation r l = r { location = l }