convert ddar to new ChunkedEncryptable API (but do not support chunking)

Since ddar de-deuplicates, I assume there is no benefit from chunking.

This has not been tested!
This commit is contained in:
Joey Hess 2014-08-02 18:58:38 -04:00
parent b261df735d
commit 19b71cfb8f

View file

@ -9,7 +9,6 @@
module Remote.Ddar (remote) where module Remote.Ddar (remote) where
import Control.Exception import Control.Exception
import qualified Data.ByteString.Lazy as L
import qualified Data.Map as M import qualified Data.Map as M
import System.IO.Error import System.IO.Error
import System.Process import System.Process
@ -23,12 +22,9 @@ import qualified Git
import Config import Config
import Config.Cost import Config.Cost
import Remote.Helper.Special import Remote.Helper.Special
import Remote.Helper.Encryptable import Remote.Helper.ChunkedEncryptable
import Crypto
import Annex.Content
import Annex.Ssh import Annex.Ssh
import Annex.UUID import Annex.UUID
import Utility.Metered
type DdarRepo = String type DdarRepo = String
@ -46,13 +42,17 @@ gen r u c gc = do
if ddarLocal ddarrepo if ddarLocal ddarrepo
then nearlyCheapRemoteCost then nearlyCheapRemoteCost
else expensiveRemoteCost else expensiveRemoteCost
return $ Just $ encryptableRemote c
let new = Remote (simplyPrepare $ store ddarrepo)
(simplyPrepare $ retrieve ddarrepo)
(this cst)
where
this cst = Remote
{ uuid = u { uuid = u
, cost = cst , cost = cst
, name = Git.repoDescribe r , name = Git.repoDescribe r
, storeKey = store ddarrepo , storeKey = storeKeyDummy
, retrieveKeyFile = retrieve ddarrepo , retrieveKeyFile = retreiveKeyFileDummy
, retrieveKeyFileCheap = retrieveCheap , retrieveKeyFileCheap = retrieveCheap
, removeKey = remove ddarrepo , removeKey = remove ddarrepo
, hasKey = checkPresent ddarrepo , hasKey = checkPresent ddarrepo
@ -70,11 +70,6 @@ gen r u c gc = do
, availability = if ddarLocal ddarrepo then LocallyAvailable else GloballyAvailable , availability = if ddarLocal ddarrepo then LocallyAvailable else GloballyAvailable
, readonly = False , readonly = False
} }
return $ Just $ encryptableRemote c
(storeEncrypted new ddarrepo)
(retrieveEncrypted ddarrepo)
new
where
ddarrepo = fromMaybe (error "missing ddarrepo") $ remoteAnnexDdarRepo gc ddarrepo = fromMaybe (error "missing ddarrepo") $ remoteAnnexDdarRepo gc
ddarSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) ddarSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID)
@ -92,17 +87,8 @@ ddarSetup mu _ c = do
return (c', u) return (c', u)
pipeDdar :: [CommandParam] -> Maybe Handle -> Maybe Handle -> IO Bool store :: DdarRepo -> Storer
pipeDdar params inh outh = do store ddarrepo = fileStorer $ \k src _p -> do
p <- runProcess "ddar" (toCommand params)
Nothing Nothing inh outh Nothing
ok <- waitForProcess p
case ok of
ExitSuccess -> return True
_ -> return False
store :: DdarRepo -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool
store ddarrepo k _f _p = sendAnnex k (void $ remove ddarrepo k) $ \src -> do
let params = let params =
[ Param "c" [ Param "c"
, Param "-N" , Param "-N"
@ -112,21 +98,6 @@ store ddarrepo k _f _p = sendAnnex k (void $ remove ddarrepo k) $ \src -> do
] ]
liftIO $ boolSystem "ddar" params liftIO $ boolSystem "ddar" params
storeEncrypted :: Remote -> DdarRepo -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool
storeEncrypted r ddarrepo (cipher, enck) k _p =
sendAnnex k (void $ remove ddarrepo k) $ \src ->
liftIO $ catchBoolIO $
encrypt (getGpgEncParams r) cipher (feedFile src) $ \h ->
pipeDdar params (Just h) Nothing
where
params =
[ Param "c"
, Param "-N"
, Param $ key2file enck
, Param ddarrepo
, Param "-"
]
{- Convert remote DdarRepo to host and path on remote end -} {- Convert remote DdarRepo to host and path on remote end -}
splitRemoteDdarRepo :: DdarRepo -> (String, String) splitRemoteDdarRepo :: DdarRepo -> (String, String)
splitRemoteDdarRepo ddarrepo = splitRemoteDdarRepo ddarrepo =
@ -155,27 +126,17 @@ ddarExtractRemoteCall :: DdarRepo -> Key -> Annex (String, [CommandParam])
ddarExtractRemoteCall ddarrepo k = ddarExtractRemoteCall ddarrepo k =
ddarRemoteCall ddarrepo 'x' [Param "--force-stdout", Param $ key2file k] ddarRemoteCall ddarrepo 'x' [Param "--force-stdout", Param $ key2file k]
retrieve :: DdarRepo -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool retrieve :: DdarRepo -> Retriever
retrieve ddarrepo k _f d _p = do retrieve ddarrepo = fileRetriever $ \d k _p -> do
(cmd, params) <- ddarExtractRemoteCall ddarrepo k (cmd, params) <- ddarExtractRemoteCall ddarrepo k
liftIO $ catchBoolIO $ withFile d WriteMode $ \h -> do liftIO $ withFile d WriteMode $ \h -> do
let p = (proc cmd $ toCommand params){ std_out = UseHandle h } let p = (proc cmd $ toCommand params){ std_out = UseHandle h }
(_, _, _, pid) <- Common.Annex.createProcess p (_, _, _, pid) <- Common.Annex.createProcess p
forceSuccessProcess p pid forceSuccessProcess p pid
return True
retrieveCheap :: Key -> FilePath -> Annex Bool retrieveCheap :: Key -> FilePath -> Annex Bool
retrieveCheap _ _ = return False retrieveCheap _ _ = return False
retrieveEncrypted :: DdarRepo -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool
retrieveEncrypted ddarrepo (cipher, enck) _ f _p = do
(cmd, params) <- ddarExtractRemoteCall ddarrepo enck
let p = proc cmd $ toCommand params
liftIO $ catchBoolIO $ withHandle StdoutHandle createProcessSuccess p $ \h -> do
decrypt cipher (\toh -> L.hPut toh =<< L.hGetContents h) $
readBytes $ L.writeFile f
return True
remove :: DdarRepo -> Key -> Annex Bool remove :: DdarRepo -> Key -> Annex Bool
remove ddarrepo key = do remove ddarrepo key = do
(cmd, params) <- ddarRemoteCall ddarrepo 'd' [Param $ key2file key] (cmd, params) <- ddarRemoteCall ddarrepo 'd' [Param $ key2file key]