summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Annex.hs30
-rw-r--r--Annex/Direct/Fixup.hs31
2 files changed, 39 insertions, 22 deletions
diff --git a/Annex.hs b/Annex.hs
index 842d930c5..583cb0e02 100644
--- a/Annex.hs
+++ b/Annex.hs
@@ -40,12 +40,11 @@ import Control.Concurrent
import Common
import qualified Git
import qualified Git.Config
-import Git.Types hiding (remotes)
+import Annex.Direct.Fixup
import Git.CatFile
import Git.CheckAttr
import Git.CheckIgnore
import Git.SharedRepository
-import Git.Config
import qualified Git.Queue
import Types.Backend
import Types.GitConfig
@@ -112,9 +111,9 @@ data AnnexState = AnnexState
, useragent :: Maybe String
}
-newState :: Git.Repo -> AnnexState
-newState r = AnnexState
- { repo = if annexDirect c then fixupDirect r else r
+newState :: GitConfig -> Git.Repo -> AnnexState
+newState c r = AnnexState
+ { repo = r
, gitconfig = c
, backends = []
, remotes = []
@@ -145,13 +144,14 @@ newState r = AnnexState
, inodeschanged = Nothing
, useragent = Nothing
}
- where
- c = extractGitConfig r
{- Makes an Annex state object for the specified git repo.
- Ensures the config is read, if it was not already. -}
new :: Git.Repo -> IO AnnexState
-new = newState <$$> Git.Config.read
+new r = do
+ r' <- Git.Config.read r
+ let c = extractGitConfig r'
+ newState c <$> if annexDirect c then fixupDirect r' else return r'
{- Performs an action in the Annex monad from a starting state,
- returning a new state. -}
@@ -250,17 +250,3 @@ withCurrentState :: Annex a -> Annex (IO a)
withCurrentState a = do
s <- getState id
return $ eval s a
-
-{- Direct mode repos have core.bare=true, but are not really bare.
- - Fix up the Repo to be a non-bare repo, and arrange for git commands
- - run by git-annex to be passed parameters that override this setting. -}
-fixupDirect :: Git.Repo -> Git.Repo
-fixupDirect r@(Repo { location = l@(Local { gitdir = d, worktree = Nothing }) }) =
- r
- { location = l { worktree = Just (parentDir d) }
- , gitGlobalOpts = gitGlobalOpts r ++
- [ Param "-c"
- , Param $ coreBare ++ "=" ++ boolConfig False
- ]
- }
-fixupDirect r = r
diff --git a/Annex/Direct/Fixup.hs b/Annex/Direct/Fixup.hs
new file mode 100644
index 000000000..13485242a
--- /dev/null
+++ b/Annex/Direct/Fixup.hs
@@ -0,0 +1,31 @@
+{- git-annex direct mode guard fixup
+ -
+ - Copyright 2013 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Annex.Direct.Fixup where
+
+import Git.Types
+import Git.Config
+import qualified Git.Construct as Construct
+import Utility.Path
+import Utility.SafeCommand
+
+{- Direct mode repos have core.bare=true, but are not really bare.
+ - Fix up the Repo to be a non-bare repo, and arrange for git commands
+ - run by git-annex to be passed parameters that override this setting. -}
+fixupDirect :: Repo -> IO Repo
+fixupDirect r@(Repo { location = l@(Local { gitdir = d, worktree = Nothing }) }) = do
+ let r' = r
+ { location = l { worktree = Just (parentDir d) }
+ , gitGlobalOpts = gitGlobalOpts r ++
+ [ Param "-c"
+ , Param $ coreBare ++ "=" ++ boolConfig False
+ ]
+ }
+ -- Recalc now that the worktree is correct.
+ rs' <- Construct.fromRemotes r'
+ return $ r' { remotes = rs' }
+fixupDirect r = return r