0896038ba7
Added annex.adjustedbranchrefresh git config to update adjusted branches set up by git-annex adjust --unlock-present/--hide-missing. Note, in a few cases, I was not able to make the adjusted branch be updated in calls to moveAnnex, because information about what file corresponds to a key is not available. They are: * If two files point to one file, then eg, `git annex get foo` will update the branch to unlock foo, but will not unlock bar, because it does not know about it. Might be fixable by making `git annex get bar` do something besides skipping bar? * git-annex-shell recvkey likewise (so sends over ssh from old versions of git-annex) * git-annex setkey * git-annex transferkey if the user does not use --file * git-annex multicast sends keys with no associated file info Doing a single full refresh at the end, after any incremental refresh, will deal with those edge cases.
48 lines
1.4 KiB
Haskell
48 lines
1.4 KiB
Haskell
{- git-annex command
|
|
-
|
|
- Copyright 2010 Joey Hess <id@joeyh.name>
|
|
-
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
|
-}
|
|
|
|
module Command.RecvKey where
|
|
|
|
import Command
|
|
import Annex.Content
|
|
import Annex.Action
|
|
import Annex
|
|
import Utility.Rsync
|
|
import Types.Transfer
|
|
import Command.SendKey (fieldTransfer)
|
|
import qualified CmdLine.GitAnnexShell.Fields as Fields
|
|
|
|
cmd :: Command
|
|
cmd = noCommit $ command "recvkey" SectionPlumbing
|
|
"runs rsync in server mode to receive content"
|
|
paramKey (withParams seek)
|
|
|
|
seek :: CmdParams -> CommandSeek
|
|
seek = withKeys (commandAction . start)
|
|
|
|
start :: (SeekInput, Key) -> CommandStart
|
|
start (_, key) = fieldTransfer Download key $ \_p -> do
|
|
-- Always verify content when a repo is sending an unlocked file,
|
|
-- as the file could change while being transferred.
|
|
fromunlocked <- (isJust <$> Fields.getField Fields.unlocked)
|
|
<||> (isJust <$> Fields.getField Fields.direct)
|
|
let verify = if fromunlocked then AlwaysVerify else DefaultVerify
|
|
-- This matches the retrievalSecurityPolicy of Remote.Git
|
|
let rsp = RetrievalAllKeysSecure
|
|
ifM (getViaTmp rsp verify key (AssociatedFile Nothing) go)
|
|
( do
|
|
-- forcibly quit after receiving one key,
|
|
-- and shutdown cleanly
|
|
_ <- shutdown True
|
|
return True
|
|
, return False
|
|
)
|
|
where
|
|
go tmp = unVerified $ do
|
|
opts <- filterRsyncSafeOptions . maybe [] words
|
|
<$> getField "RsyncOptions"
|
|
liftIO $ rsyncServerReceive (map Param opts) (fromRawFilePath tmp)
|