aboutsummaryrefslogtreecommitdiff
path: root/Annex/CatFile.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2013-05-15 19:18:04 -0400
committerGravatar Joey Hess <joey@kitenet.net>2013-05-15 19:18:04 -0400
commit9faa6f0e33dd9e8c7ec3b96715ea3878ff9ef2f0 (patch)
tree3bde05906addb27cb565d67b05bf686945ee235a /Annex/CatFile.hs
parent8986a918e5af331db29b953e061dc2d20a5b86d2 (diff)
parenta243fb1c7f04817fa19209689849aa2fe8631b3d (diff)
Merge branch 'master' into windows
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 c7c01b40c..71b8985a3 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
@@ -38,13 +39,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)
@@ -57,7 +65,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