summaryrefslogtreecommitdiff
path: root/Git/Config.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Git/Config.hs')
-rw-r--r--Git/Config.hs29
1 files changed, 16 insertions, 13 deletions
diff --git a/Git/Config.hs b/Git/Config.hs
index 500c8aa0f..cc9b27b69 100644
--- a/Git/Config.hs
+++ b/Git/Config.hs
@@ -93,7 +93,7 @@ hRead repo h = do
store :: String -> Repo -> IO Repo
store s repo = do
let c = parse s
- let repo' = updateLocation $ repo
+ repo' <- updateLocation $ repo
{ config = (M.map Prelude.head c) `M.union` config repo
, fullconfig = M.unionWith (++) c (fullconfig repo)
}
@@ -106,16 +106,22 @@ store s repo = do
- known. Once the config is read, this can be fixed up to a Local repo,
- based on the core.bare and core.worktree settings.
-}
-updateLocation :: Repo -> Repo
+updateLocation :: Repo -> IO Repo
updateLocation r@(Repo { location = LocalUnknown d })
- | isBare r = newloc $ Local d Nothing
- | otherwise = newloc $ Local (d </> ".git") (Just d)
- where
- newloc l = r { location = getworktree l }
- getworktree l = case workTree r of
- Nothing -> l
- wt -> l { worktree = wt }
-updateLocation r = r
+ | isBare r = updateLocation' r $ Local d Nothing
+ | otherwise = updateLocation' r $ Local (d </> ".git") (Just d)
+updateLocation r@(Repo { location = l@(Local {}) }) = updateLocation' r l
+updateLocation r = return r
+
+updateLocation' :: Repo -> RepoLocation -> IO Repo
+updateLocation' r l = do
+ l' <- case getMaybe "core.worktree" r of
+ Nothing -> return l
+ Just d -> do
+ {- core.worktree is relative to the gitdir -}
+ top <- absPath $ gitdir l
+ return $ l { worktree = Just $ absPathFrom top d }
+ return $ r { location = l' }
{- Parses git config --list or git config --null --list output into a
- config map. -}
@@ -142,6 +148,3 @@ isTrue s
isBare :: Repo -> Bool
isBare r = fromMaybe False $ isTrue =<< getMaybe "core.bare" r
-
-workTree :: Repo -> Maybe FilePath
-workTree = getMaybe "core.worktree"