A relative core.worktree is relative to the gitdir.
Now that this is handled correctly, git-annex can be used in git submodules. Also, fixed infelicity where Git.CurrentRepo and Git.Config.updateLocation were both dealing with core.worktree. Now updateLocation handles it for Local as well as for LocalUnknown repos.
This commit is contained in:
parent
148d9f0088
commit
8fec62d299
4 changed files with 21 additions and 15 deletions
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
2
debian/changelog
vendored
2
debian/changelog
vendored
|
@ -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
|
||||
|
||||
|
|
|
@ -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]]
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue