summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2013-05-15 18:46:38 -0400
committerGravatar Joey Hess <joey@kitenet.net>2013-05-15 18:46:38 -0400
commitbc0583fc9a7addefba04d7068fa1799dd5906383 (patch)
tree99fd36541310a32b54e1fa912d1ae99aced1df26
parent4d5098adf0c019ef6295819b55b67852aac494e6 (diff)
start one git-cat-file per index file
This reverts a5031031f0d596b2381a785925beb574d90a862e and properly fixes the issue discussed there. This makes git-annex behave much nicer in direct mode.
-rw-r--r--Annex.hs4
-rw-r--r--Annex/CatFile.hs26
-rw-r--r--debian/changelog2
3 files changed, 21 insertions, 11 deletions
diff --git a/Annex.hs b/Annex.hs
index 3893f61e6..f9cbfef0d 100644
--- a/Annex.hs
+++ b/Annex.hs
@@ -103,7 +103,7 @@ data AnnexState = AnnexState
, auto :: Bool
, branchstate :: BranchState
, repoqueue :: Maybe Git.Queue.Queue
- , catfilehandle :: Maybe CatFileHandle
+ , catfilehandles :: M.Map FilePath CatFileHandle
, checkattrhandle :: Maybe CheckAttrHandle
, forcebackend :: Maybe String
, limit :: Matcher (FileInfo -> Annex Bool)
@@ -133,7 +133,7 @@ newState gitrepo = AnnexState
, auto = False
, branchstate = startBranchState
, repoqueue = Nothing
- , catfilehandle = Nothing
+ , catfilehandles = M.empty
, checkattrhandle = Nothing
, forcebackend = Nothing
, limit = Left []
diff --git a/Annex/CatFile.hs b/Annex/CatFile.hs
index 292d62460..9de6f9856 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
diff --git a/debian/changelog b/debian/changelog
index dc51d9967..43c7de59e 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -6,6 +6,8 @@ git-annex (4.20130502) UNRELEASED; urgency=low
* git-annex-shell: Ensure that received files can be read. Files
transferred from some Android devices may have very broken permissions
as received.
+ * direct mode: Direct mode commands now work on files staged in the index,
+ they do not need to be committed to git.
* Temporarily add an upper bound to the version of yesod that can be built
with, since yesod 1.2 has a great many changes that will require extensive
work on the webapp.