67fd06af76
(And a vpop command, which is still a bit buggy.) Still need to do vadd and vrm, though this also adds their documentation. Currently not very happy with the view log data serialization. I had to lose the TDFA regexps temporarily, so I can have Read/Show instances of View. I expect the view log format will change in some incompatable way later, probably adding last known refs for the parent branch to View or something like that. Anyway, it basically works, although it's a bit slow looking up the metadata. The actual git branch construction is about as fast as it can be using the current git plumbing. This commit was sponsored by Peter Hogg.
46 lines
1.2 KiB
Haskell
46 lines
1.2 KiB
Haskell
{- Using other git index files
|
|
-
|
|
- Copyright 2014 Joey Hess <joey@kitenet.net>
|
|
-
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
-}
|
|
|
|
{-# LANGUAGE CPP #-}
|
|
|
|
module Annex.Index (
|
|
withIndexFile,
|
|
) where
|
|
|
|
import qualified Control.Exception as E
|
|
|
|
import Common.Annex
|
|
import Git.Types
|
|
import qualified Annex
|
|
import Utility.Env
|
|
import Annex.Exception
|
|
|
|
{- Runs an action using a different git index file. -}
|
|
withIndexFile :: FilePath -> Annex a -> Annex a
|
|
withIndexFile f a = do
|
|
g <- gitRepo
|
|
#ifdef __ANDROID__
|
|
{- This should not be necessary on Android, but there is some
|
|
- weird getEnvironment breakage. See
|
|
- https://github.com/neurocyte/ghc-android/issues/7
|
|
- Use getEnv to get some key environment variables that
|
|
- git expects to have. -}
|
|
let keyenv = words "USER PATH GIT_EXEC_PATH HOSTNAME HOME"
|
|
let getEnvPair k = maybe Nothing (\v -> Just (k, v)) <$> getEnv k
|
|
e <- liftIO $ catMaybes <$> forM keyenv getEnvPair
|
|
let e' = ("GIT_INDEX_FILE", f):e
|
|
#else
|
|
e <- liftIO getEnvironment
|
|
let e' = addEntry "GIT_INDEX_FILE" f e
|
|
#endif
|
|
let g' = g { gitEnv = Just e' }
|
|
|
|
r <- tryAnnex $ do
|
|
Annex.changeState $ \s -> s { Annex.repo = g' }
|
|
a
|
|
Annex.changeState $ \s -> s { Annex.repo = (Annex.repo s) { gitEnv = gitEnv g} }
|
|
either E.throw return r
|