start one git-cat-file per index file

This reverts 1c83b6c439 and properly fixes
the issue discussed there.

This makes git-annex behave much nicer in direct mode.
This commit is contained in:
Joey Hess 2013-05-15 18:46:38 -04:00
parent bc628adca0
commit c62b54d80d
3 changed files with 21 additions and 11 deletions

View file

@ -103,7 +103,7 @@ data AnnexState = AnnexState
, auto :: Bool , auto :: Bool
, branchstate :: BranchState , branchstate :: BranchState
, repoqueue :: Maybe Git.Queue.Queue , repoqueue :: Maybe Git.Queue.Queue
, catfilehandle :: Maybe CatFileHandle , catfilehandles :: M.Map FilePath CatFileHandle
, checkattrhandle :: Maybe CheckAttrHandle , checkattrhandle :: Maybe CheckAttrHandle
, forcebackend :: Maybe String , forcebackend :: Maybe String
, limit :: Matcher (FileInfo -> Annex Bool) , limit :: Matcher (FileInfo -> Annex Bool)
@ -133,7 +133,7 @@ newState gitrepo = AnnexState
, auto = False , auto = False
, branchstate = startBranchState , branchstate = startBranchState
, repoqueue = Nothing , repoqueue = Nothing
, catfilehandle = Nothing , catfilehandles = M.empty
, checkattrhandle = Nothing , checkattrhandle = Nothing
, forcebackend = Nothing , forcebackend = Nothing
, limit = Left [] , limit = Left []

View file

@ -1,6 +1,6 @@
{- git cat-file interface, with handle automatically stored in the Annex monad {- 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. - Licensed under the GNU GPL version 3 or higher.
-} -}
@ -15,6 +15,7 @@ module Annex.CatFile (
) where ) where
import qualified Data.ByteString.Lazy as L import qualified Data.ByteString.Lazy as L
import qualified Data.Map as M
import Common.Annex import Common.Annex
import qualified Git import qualified Git
@ -37,13 +38,20 @@ catObjectDetails ref = do
h <- catFileHandle h <- catFileHandle
liftIO $ Git.CatFile.catObjectDetails h ref 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 :: Annex Git.CatFile.CatFileHandle
catFileHandle = maybe startup return =<< Annex.getState Annex.catfilehandle catFileHandle = do
where m <- Annex.getState Annex.catfilehandles
startup = do indexfile <- fromMaybe "" . maybe Nothing (lookup "GIT_INDEX_FILE")
h <- inRepo Git.CatFile.catFileStart <$> fromRepo gitEnv
Annex.changeState $ \s -> s { Annex.catfilehandle = Just h } case M.lookup indexfile m of
return h 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. -} {- From the Sha or Ref of a symlink back to the key. -}
catKey :: Ref -> Annex (Maybe Key) catKey :: Ref -> Annex (Maybe Key)
@ -56,7 +64,7 @@ catKey ref = do
{- From a file in git back to the key. {- From a file in git back to the key.
- -
- Prefixing the file with ./ makes this work even if in a subdirectory - 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 :: FilePath -> Annex (Maybe Key)
catKeyFile f = catKey $ Ref $ "HEAD:./" ++ f catKeyFile f = catKey $ Ref $ ":./" ++ f

2
debian/changelog vendored
View file

@ -6,6 +6,8 @@ git-annex (4.20130502) UNRELEASED; urgency=low
* git-annex-shell: Ensure that received files can be read. Files * git-annex-shell: Ensure that received files can be read. Files
transferred from some Android devices may have very broken permissions transferred from some Android devices may have very broken permissions
as received. 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 * 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 with, since yesod 1.2 has a great many changes that will require extensive
work on the webapp. work on the webapp.