From d98aa35b3b8bd7ee6c81f39bede0f669ec82daeb Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 26 Jun 2023 14:05:31 -0400 Subject: [PATCH] reinject: Added --guesskeys option Sponsored-by: Noam Kremen on Patreon --- CHANGELOG | 6 ++++++ Command/Reinject.hs | 26 ++++++++++++++++++++++++++ doc/git-annex-reinject.mdwn | 14 ++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 3bace76470..f5ec819276 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,9 @@ +git-annex (10.20230627) UNRELEASED; urgency=medium + + * reinject: Added --guesskeys option. + + -- Joey Hess Mon, 26 Jun 2023 13:10:40 -0400 + git-annex (10.20230626) upstream; urgency=medium * Split out two new commands, git-annex pull and git-annex push. diff --git a/Command/Reinject.hs b/Command/Reinject.hs index b414ef2ee2..4fba771b1e 100644 --- a/Command/Reinject.hs +++ b/Command/Reinject.hs @@ -29,6 +29,7 @@ cmd = withAnnexOptions [backendOption, jsonOptions] $ data ReinjectOptions = ReinjectOptions { params :: CmdParams , knownOpt :: Bool + , guessKeysOpt :: Bool } optParser :: CmdParamsDesc -> Parser ReinjectOptions @@ -39,9 +40,16 @@ optParser desc = ReinjectOptions <> help "inject all known files" <> hidden ) + <*> switch + ( long "guesskeys" + <> help "inject files that are named like keys" + <> hidden + ) seek :: ReinjectOptions -> CommandSeek seek os + | guessKeysOpt os && knownOpt os = giveup "Cannot combine --known with --guesskeys" + | guessKeysOpt os = withStrings (commandAction . startGuessKeys) (params os) | knownOpt os = withStrings (commandAction . startKnown) (params os) | otherwise = withPairs (commandAction . startSrcDest) (params os) @@ -66,6 +74,24 @@ startSrcDest (si, (src, dest)) src' = toRawFilePath src ai = ActionItemOther (Just (QuotedPath src')) +startGuessKeys :: FilePath -> CommandStart +startGuessKeys src = starting "reinject" ai si $ notAnnexed src' $ + case fileKey (toRawFilePath (takeFileName src)) of + Just key -> ifM (verifyKeyContent key src') + ( perform src' key + , do + qp <- coreQuotePath <$> Annex.getGitConfig + giveup $ decodeBS $ quote qp $ QuotedPath src' + <> " does not have expected content" + ) + Nothing -> do + warning "Not named like an object file; skipping" + next $ return True + where + src' = toRawFilePath src + ai = ActionItemOther (Just (QuotedPath src')) + si = SeekInput [src] + startKnown :: FilePath -> CommandStart startKnown src = starting "reinject" ai si $ notAnnexed src' $ do (key, _) <- genKey ks nullMeterUpdate =<< defaultBackend diff --git a/doc/git-annex-reinject.mdwn b/doc/git-annex-reinject.mdwn index 98fbbfc22e..1202d0d339 100644 --- a/doc/git-annex-reinject.mdwn +++ b/doc/git-annex-reinject.mdwn @@ -54,6 +54,20 @@ needing to specify the dest file. Specify the key-value backend to use when checking if a file is known with the `--known` option. +* `--guesskeys` + + With this option, each specified source file is checked to see if it + has the name of a git-annex key, and if so it is imported as the content + of that key. + + This can be used to pluck git-annex objects out of `lost+found`, + as long as the original filename has not been lost, + and is particularly useful when using key-value backends that don't hash + to the content of a file. + + When the key-value backend does support hashing, the content of the file + is verified before importing it. + * `--json` Enable JSON output. This is intended to be parsed by programs that use -- 2.30.2