summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2013-11-26 18:11:37 -0400
committerGravatar Joey Hess <joey@kitenet.net>2013-11-26 19:33:26 -0400
commit1e95a0a8add800dda786e47e6afc6f4b2c2355db (patch)
tree462aca8140074ea41334f8ed7f00acfdc3ffe7b0
parent8539e76037382622cc7c49bfd9aef2255c0a4125 (diff)
fix reversion in relative paths to local remotes of direct mode repos
52ad9a1528bc51f65411aca263def97615367943 broke support for local remotes from direct mode repos, because the relative path was taken to be from the gitdir, rather than from the work tree.
-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