summaryrefslogtreecommitdiff
path: root/Command/Reinject.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2016-04-22 13:49:32 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2016-04-22 13:49:32 -0400
commitb48a044d26bb607da9962b9086e9da2db9e11620 (patch)
tree0a5b94be74befcbf51431ea4a0d7da31cbdcf357 /Command/Reinject.hs
parent475f9475f162c1c1f9aee727fa3f3a471ebe2506 (diff)
reinject: Added new mode which can reinject known files into the annex.
For example: git-annex reinject --known /mnt/backup/*
Diffstat (limited to 'Command/Reinject.hs')
-rw-r--r--Command/Reinject.hs67
1 files changed, 50 insertions, 17 deletions
diff --git a/Command/Reinject.hs b/Command/Reinject.hs
index 0b1b0e2e2..ce18c7cb6 100644
--- a/Command/Reinject.hs
+++ b/Command/Reinject.hs
@@ -1,6 +1,6 @@
{- git-annex command
-
- - Copyright 2011 Joey Hess <id@joeyh.name>
+ - Copyright 2011-2016 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU GPL version 3 or higher.
-}
@@ -10,30 +10,63 @@ module Command.Reinject where
import Command
import Logs.Location
import Annex.Content
+import Backend
+import Types.KeySource
cmd :: Command
cmd = command "reinject" SectionUtility
- "sets content of annexed file"
- (paramPair "SRC" "DEST") (withParams seek)
+ "inject content of file back into annex"
+ (paramRepeating (paramPair "SRC" "DEST")
+ `paramOr` "--known " ++ paramRepeating "SRC")
+ (seek <$$> optParser)
-seek :: CmdParams -> CommandSeek
-seek = withWords start
+data ReinjectOptions = ReinjectOptions
+ { params :: CmdParams
+ , knownOpt :: Bool
+ }
-start :: [FilePath] -> CommandStart
-start (src:dest:[])
+optParser :: CmdParamsDesc -> Parser ReinjectOptions
+optParser desc = ReinjectOptions
+ <$> cmdParams desc
+ <*> switch
+ ( long "known"
+ <> help "inject all known files"
+ <> hidden
+ )
+
+seek :: ReinjectOptions -> CommandSeek
+seek os
+ | knownOpt os = withStrings startKnown (params os)
+ | otherwise = withWords startSrcDest (params os)
+
+startSrcDest :: [FilePath] -> CommandStart
+startSrcDest (src:dest:[])
| src == dest = stop
- | otherwise =
- ifAnnexed src
- (error $ "cannot used annexed file as src: " ++ src)
- go
- where
- go = do
+ | otherwise = notAnnexed src $ do
showStart "reinject" dest
- next $ whenAnnexed (perform src) dest
-start _ = error "specify a src file and a dest file"
+ next $ ifAnnexed dest
+ (perform src)
+ stop
+startSrcDest _ = error "specify a src file and a dest file"
+
+startKnown :: FilePath -> CommandStart
+startKnown src = notAnnexed src $ do
+ showStart "reinject" src
+ mkb <- genKey (KeySource src src Nothing) Nothing
+ case mkb of
+ Nothing -> error "Failed to generate key"
+ Just (key, _) -> ifM (isKnownKey key)
+ ( next $ perform src key
+ , do
+ warning "Not known content; skipping"
+ next $ next $ return True
+ )
+
+notAnnexed :: FilePath -> CommandStart -> CommandStart
+notAnnexed src = ifAnnexed src (error $ "cannot used annexed file as src: " ++ src)
-perform :: FilePath -> FilePath -> Key -> CommandPerform
-perform src _dest key = ifM move
+perform :: FilePath -> Key -> CommandPerform
+perform src key = ifM move
( next $ cleanup key
, error "failed"
)