summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Git/Config.hs29
-rw-r--r--Git/CurrentRepo.hs2
-rw-r--r--debian/changelog2
-rw-r--r--doc/bugs/submodule_path_problem.mdwn3
4 files changed, 21 insertions, 15 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"
diff --git a/Git/CurrentRepo.hs b/Git/CurrentRepo.hs
index 861df1b64..f82241ae2 100644
--- a/Git/CurrentRepo.hs
+++ b/Git/CurrentRepo.hs
@@ -31,7 +31,7 @@ get :: IO Repo
get = do
gd <- pathenv "GIT_DIR"
r <- configure gd =<< maybe fromCwd fromPath gd
- wt <- maybe (Git.Config.workTree r) Just <$> pathenv "GIT_WORK_TREE"
+ wt <- maybe (worktree $ location r) Just <$> pathenv "GIT_WORK_TREE"
case wt of
Nothing -> return r
Just d -> do
diff --git a/debian/changelog b/debian/changelog
index 90cf81327..37ef03b35 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -11,6 +11,8 @@ git-annex (3.20121011) UNRELEASED; urgency=low
scan is running and queueing new transfers for that remote.
* The standalone binaries are now built to not use ssh connection caching,
in order to work with old versions of ssh.
+ * A relative core.worktree is relative to the gitdir. Now that this is
+ handled correctly, git-annex can be used in git submodules.
-- Joey Hess <joeyh@debian.org> Fri, 12 Oct 2012 22:46:08 -0400
diff --git a/doc/bugs/submodule_path_problem.mdwn b/doc/bugs/submodule_path_problem.mdwn
index 7885d0287..664e246bc 100644
--- a/doc/bugs/submodule_path_problem.mdwn
+++ b/doc/bugs/submodule_path_problem.mdwn
@@ -51,5 +51,6 @@ Got:
* The path in that config is relative to the config file: "worktree = ../../../../lib/submod"
* Git-annex expect the path to be relative to the current directory, which is why it fails.
-
+> Impressive analysis, thanks. I've fixed handling of relative
+> core.worktree. [[done]] --[[Joey]]