summaryrefslogtreecommitdiff
path: root/Annex/CatFile.hs
diff options
context:
space:
mode:
authorJoey Hess <joey@kitenet.net>2013-05-15 18:46:38 -0400
committerJoey Hess <joey@kitenet.net>2013-05-15 18:46:38 -0400
commitc62b54d80d9425b92fa127cd1cafb9752890c2e4 (patch)
tree80c2893953472793ab5bc63d50929bb5d4fe7a18 /Annex/CatFile.hs
parentbc628adca00c41be00606969765d3185011baed9 (diff)
start one git-cat-file per index file
This reverts 1c83b6c43936802b436f64748e6ede026946eefe and properly fixes the issue discussed there. This makes git-annex behave much nicer in direct mode.
Diffstat (limited to 'Annex/CatFile.hs')
-rw-r--r--Annex/CatFile.hs26
1 files changed, 17 insertions, 9 deletions
diff --git a/Annex/CatFile.hs b/Annex/CatFile.hs
index 292d624603..9de6f98565 100644
--- a/Annex/CatFile.hs
+++ b/Annex/CatFile.hs
@@ -1,6 +1,6 @@
{- git cat-file interface, with handle automatically stored in the Annex monad
-
- - Copyright 2011 Joey Hess <joey@kitenet.net>
+ - Copyright 2011-2013 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
@@ -15,6 +15,7 @@ module Annex.CatFile (
) where
import qualified Data.ByteString.Lazy as L
+import qualified Data.Map as M
import Common.Annex
import qualified Git
@@ -37,13 +38,20 @@ catObjectDetails ref = do
h <- catFileHandle
liftIO $ Git.CatFile.catObjectDetails h ref
+{- There can be multiple index files, and a different cat-file is needed
+ - for each. This is selected by setting GIT_INDEX_FILE in the gitEnv. -}
catFileHandle :: Annex Git.CatFile.CatFileHandle
-catFileHandle = maybe startup return =<< Annex.getState Annex.catfilehandle
- where
- startup = do
- h <- inRepo Git.CatFile.catFileStart
- Annex.changeState $ \s -> s { Annex.catfilehandle = Just h }
- return h
+catFileHandle = do
+ m <- Annex.getState Annex.catfilehandles
+ indexfile <- fromMaybe "" . maybe Nothing (lookup "GIT_INDEX_FILE")
+ <$> fromRepo gitEnv
+ case M.lookup indexfile m of
+ Just h -> return h
+ Nothing -> do
+ h <- inRepo Git.CatFile.catFileStart
+ let m' = M.insert indexfile h m
+ Annex.changeState $ \s -> s { Annex.catfilehandles = m' }
+ return h
{- From the Sha or Ref of a symlink back to the key. -}
catKey :: Ref -> Annex (Maybe Key)
@@ -56,7 +64,7 @@ catKey ref = do
{- From a file in git back to the key.
-
- Prefixing the file with ./ makes this work even if in a subdirectory
- - of a repo. For some reason, HEAD is sometimes needed.
+ - of a repo.
-}
catKeyFile :: FilePath -> Annex (Maybe Key)
-catKeyFile f = catKey $ Ref $ "HEAD:./" ++ f
+catKeyFile f = catKey $ Ref $ ":./" ++ f