findcompute --inputs

Useful for eg, generating dependency graphs.
This commit is contained in:
Joey Hess 2025-03-19 15:39:05 -04:00
parent a669b7f3ec
commit 74457b6b93
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
3 changed files with 80 additions and 16 deletions

View file

@ -17,6 +17,10 @@ import Command.Find (showFormatted, formatVars)
import Remote.Compute (isComputeRemote, getComputeState, ComputeState(..))
import qualified Remote
import qualified Types.Remote as Remote
import Database.Keys
import Annex.CatFile
import qualified Data.Map as M
cmd :: Command
cmd = withAnnexOptions [annexedMatchingOptions] $ noCommit $ noMessages $
@ -28,6 +32,7 @@ data FindComputedOptions = FindComputedOptions
{ findThese :: CmdParams
, formatOption :: Maybe Utility.Format.Format
, keyOptions :: Maybe KeyOptions
, inputsOption :: Bool
}
optParser :: CmdParamsDesc -> Parser FindComputedOptions
@ -35,6 +40,10 @@ optParser desc = FindComputedOptions
<$> cmdParams desc
<*> optional parseFormatOption
<*> optional parseBranchKeysOption
<*> switch
( long "inputs"
<> help "display input files"
)
parseFormatOption :: Parser Utility.Format.Format
parseFormatOption =
@ -69,22 +78,51 @@ start o isterminal computeremotes _ file key = do
if null rcs
then stop
else startingCustomOutput key $ do
forM_ rcs $ \(r, c) -> do
let computation = unwords (computeParams c)
let unformatted = fromOsPath file
<> " (" <> encodeBS (Remote.name r)
<> ") -- "
<> encodeBS computation
let formatvars =
[ ("remote", Remote.name r)
, ("computation", computation)
] ++ formatVars key (AssociatedFile (Just file))
showFormatted isterminal (formatOption o)
unformatted formatvars
forM_ rcs display
next $ return True
where
get r = fmap (r, )
<$> getComputeState (Remote.remoteStateHandle r) key
showformatted = showFormatted isterminal (formatOption o)
unformatted r computation = fromOsPath file
<> " (" <> encodeBS (Remote.name r)
<> ") -- "
<> encodeBS computation
unformattedinputs (Right inputfile) = fromOsPath file
<> " " <> fromOsPath inputfile
unformattedinputs (Left inputkey) = fromOsPath file
<> " " <> serializeKey' inputkey
display (r, c) = do
let computation = unwords (computeParams c)
let formatvars =
[ ("remote", Remote.name r)
, ("computation", computation)
] ++ formatVars key (AssociatedFile (Just file))
if inputsOption o
then forM_ (M.elems $ computeInputs c) $ \inputkey -> do
input <- maybe (Left inputkey) Right
<$> getassociated inputkey
showformatted (unformattedinputs input) $
[ ("input", either serializeKey fromOsPath input)
, ("inputkey", serializeKey inputkey)
, ("inputfile", either (const "") fromOsPath input)
] ++ formatvars
else showformatted (unformatted r computation) formatvars
getassociated inputkey =
getAssociatedFiles inputkey
>>= mapM (fromRepo . fromTopFilePath)
>>= firstM (stillassociated inputkey)
-- Some associated files that are in the keys database may no
-- longer correspond to files in the repository.
stillassociated k f = catKeyFile f >>= return . \case
Just k' | k' == k -> True
_ -> False
startKeys :: FindComputedOptions -> IsTerminal -> [Remote] -> (SeekInput, Key, ActionItem) -> CommandStart
startKeys o isterminal computeremotes (si, key, ActionItemBranchFilePath (BranchFilePath _ topf) _) =

View file

@ -70,9 +70,9 @@ start o (_, key, _) = startingCustomOutput key $ do
where
-- Some associated files that are in the keys database may no
-- longer correspond to files in the repository.
stillassociated f = catKeyFile f >>= \case
Just k | k == key -> return True
_ -> return False
stillassociated f = catKeyFile f >>= return . \case
Just k | k == key -> True
_ -> False
display :: Key -> StringContainingQuotedPath -> Annex ()
display key loc = do

View file

@ -32,18 +32,44 @@ For example:
List computed files in the specified branch or treeish.
* `--inputs`
Display each computed file followed by the input that is used to
produce it. The current location of the input file in the work tree is
displayed, but if the input file is not in the work tree, the key
is displayed instead.
For example:
foo.jpeg file.raw
bar.gz bar
When multiple input files are needed to compute a file, outputs multiple
lines for that file:
foo bar
foo baz
* `--format=value`
Use custom output formatting.
This option works the same as in [[git-annex-find]](1), with these
additional variables available for use in it:
remote, computation
"${remote}", "${computation}"
The default output format is the same as
`--format='${file} (${remote}) -- ${computation}\\n'`,
except when outputting to a terminal, control characters will be escaped.
When `--inputs` is used, there are additional variables "${inputfile}"
which is the input filename, "${inputkey}" which is the input key,
and "${input}" which is either the filename or the key.
The default output format for `--inputs`
is the same as `--format='${file} ${input}\\n'`
To separate the pair of files by nulls instead, use eg
`--format='${file}\\000${input}\\n'
* `--json`
Output the list of files in JSON format.