summaryrefslogtreecommitdiff
path: root/Remote
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2011-10-27 14:38:59 -0400
committerGravatar Joey Hess <joey@kitenet.net>2011-10-27 14:55:06 -0400
commitc30366e95aa8967112cec0103393ea2b39ddf1c6 (patch)
tree0193174929ec53ad0def2b7f7a5c04d337d5738a /Remote
parent373cad993d9f12a9dfb7473fdba78e92af6eff99 (diff)
improve config reading when operating on remote on same host
Before the config was read each time onLocal was called, and entirely redundantly since it's read for same-host remotes on startup. Also a minor bug fix: When rsyncing to a same-host remote, use the rsync-options from the repository that the user ran git-annex in, not those of the receiving repository.
Diffstat (limited to 'Remote')
-rw-r--r--Remote/Git.hs26
1 files changed, 16 insertions, 10 deletions
diff --git a/Remote/Git.hs b/Remote/Git.hs
index e77b00572..4285be653 100644
--- a/Remote/Git.hs
+++ b/Remote/Git.hs
@@ -57,7 +57,8 @@ gen r u _ = do
- cached UUID value. -}
let cheap = not $ Git.repoIsUrl r
r' <- case (cheap, u) of
- (True, _) -> tryGitConfigRead r
+ (True, _) -> do
+ tryGitConfigRead r
(False, "") -> tryGitConfigRead r
_ -> return r
@@ -147,8 +148,12 @@ inAnnex r key
- monad using that repository. -}
onLocal :: Git.Repo -> Annex a -> IO a
onLocal r a = do
- annex <- Annex.new r
- Annex.eval annex $ do
+ -- Avoid re-reading the repository's configuration if it was
+ -- already read.
+ state <- if (M.null $ Git.configMap r)
+ then Annex.new r
+ else return $ Annex.newState r
+ Annex.eval state $ do
-- No need to update the branch; its data is not used
-- for anything onLocal is used to do.
Annex.Branch.disableUpdate
@@ -168,7 +173,9 @@ dropKey r key
{- Tries to copy a key's content from a remote's annex to a file. -}
copyFromRemote :: Git.Repo -> Key -> FilePath -> Annex Bool
copyFromRemote r key file
- | not $ Git.repoIsUrl r = rsyncOrCopyFile r (gitAnnexLocation r key) file
+ | not $ Git.repoIsUrl r = do
+ params <- rsyncParams r
+ rsyncOrCopyFile params (gitAnnexLocation r key) file
| Git.repoIsSsh r = rsyncHelper =<< rsyncParamsRemote r True key file
| Git.repoIsHttp r = liftIO $ Url.download (keyUrl r key) file
| otherwise = error "copying from non-ssh, non-http repo not supported"
@@ -179,9 +186,10 @@ copyToRemote r key
| not $ Git.repoIsUrl r = do
g <- gitRepo
let keysrc = gitAnnexLocation g key
+ params <- rsyncParams r
-- run copy from perspective of remote
liftIO $ onLocal r $ Annex.Content.getViaTmp key $
- rsyncOrCopyFile r keysrc
+ rsyncOrCopyFile params keysrc
| Git.repoIsSsh r = do
g <- gitRepo
let keysrc = gitAnnexLocation g key
@@ -200,15 +208,13 @@ rsyncHelper p = do
{- Copys a file with rsync unless both locations are on the same
- filesystem. Then cp could be faster. -}
-rsyncOrCopyFile :: Git.Repo -> FilePath -> FilePath -> Annex Bool
-rsyncOrCopyFile r src dest = do
+rsyncOrCopyFile :: [CommandParam] -> FilePath -> FilePath -> Annex Bool
+rsyncOrCopyFile rsyncparams src dest = do
ss <- liftIO $ getFileStatus $ parentDir src
ds <- liftIO $ getFileStatus $ parentDir dest
if deviceID ss == deviceID ds
then liftIO $ copyFileExternal src dest
- else do
- params <- rsyncParams r
- rsyncHelper $ params ++ [Param src, Param dest]
+ else rsyncHelper $ rsyncparams ++ [Param src, Param dest]
{- Generates rsync parameters that ssh to the remote and asks it
- to either receive or send the key's content. -}