reinject: Added --guesskeys option
authorJoey Hess <joeyh@joeyh.name>
Mon, 26 Jun 2023 18:05:31 +0000 (14:05 -0400)
committerJoey Hess <joeyh@joeyh.name>
Mon, 26 Jun 2023 18:05:31 +0000 (14:05 -0400)
Sponsored-by: Noam Kremen on Patreon
CHANGELOG
Command/Reinject.hs
doc/git-annex-reinject.mdwn

index 3bace7647004c1a8726dd49be86b1095eb352e73..f5ec8192765fc403c340f74f1bcfde765e470ef7 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,9 @@
+git-annex (10.20230627) UNRELEASED; urgency=medium
+
+  * reinject: Added --guesskeys option.
+
+ -- Joey Hess <id@joeyh.name>  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.
index b414ef2ee2469fc1b9402dc5b0b15b473882bf90..4fba771b1edc5f4d0e7338db19debc82b506fee3 100644 (file)
@@ -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
index 98fbbfc22e7181198e4d5b6857ecedef971c65ed..1202d0d339a1a4743852c7bdbbf5e475cb04b5bf 100644 (file)
@@ -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