2def1d0a23
In c6632ee5c8
, it actually only handled
uploading objects to a shared repository. To avoid verification when
downloading objects from a shared repository, was a lot harder.
On the plus side, if the process of downloading a file from a remote
is able to verify its content on the side, the remote can indicate this
now, and avoid the extra post-download verification.
As of yet, I don't have any remotes (except Git) using this ability.
Some more work would be needed to support it in special remotes.
It would make sense for tahoe to implicitly verify things downloaded from it;
as long as you trust your tahoe server (which typically runs locally),
there's cryptographic integrity. OTOH, despite bup being based on shas,
a bup repo under an attacker's control could have the git ref used for an
object changed, and so a bup repo shouldn't implicitly verify. Indeed,
tahoe seems unique in being trustworthy enough to implicitly verify.
54 lines
1.3 KiB
Haskell
54 lines
1.3 KiB
Haskell
{- git-annex command
|
|
-
|
|
- Copyright 2011 Joey Hess <id@joeyh.name>
|
|
-
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
-}
|
|
|
|
module Command.Reinject where
|
|
|
|
import Common.Annex
|
|
import Command
|
|
import Logs.Location
|
|
import Annex.Content
|
|
|
|
cmd :: Command
|
|
cmd = command "reinject" SectionUtility
|
|
"sets content of annexed file"
|
|
(paramPair "SRC" "DEST") (withParams seek)
|
|
|
|
seek :: CmdParams -> CommandSeek
|
|
seek = withWords start
|
|
|
|
start :: [FilePath] -> CommandStart
|
|
start (src:dest:[])
|
|
| src == dest = stop
|
|
| otherwise =
|
|
ifAnnexed src
|
|
(error $ "cannot used annexed file as src: " ++ src)
|
|
go
|
|
where
|
|
go = do
|
|
showStart "reinject" dest
|
|
next $ whenAnnexed (perform src) dest
|
|
start _ = error "specify a src file and a dest file"
|
|
|
|
perform :: FilePath -> FilePath -> Key -> CommandPerform
|
|
perform src _dest key = ifM move
|
|
( next $ cleanup key
|
|
, error "failed"
|
|
)
|
|
where
|
|
-- The file might be on a different filesystem,
|
|
-- so moveFile is used rather than simply calling
|
|
-- moveToObjectDir; disk space is also checked this way,
|
|
-- and the file's content is verified to match the key.
|
|
move = getViaTmp DefaultVerify key $ \tmp -> unVerified $
|
|
liftIO $ catchBoolIO $ do
|
|
moveFile src tmp
|
|
return True
|
|
|
|
cleanup :: Key -> CommandCleanup
|
|
cleanup key = do
|
|
logStatus key InfoPresent
|
|
return True
|