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 $
{ findThese :: CmdParams
, formatOption :: Maybe Utility.Format.Format
, keyOptions :: Maybe KeyOptions
+ , inputsOption :: Bool
}
optParser :: CmdParamsDesc -> Parser FindComputedOptions
<$> cmdParams desc
<*> optional parseFormatOption
<*> optional parseBranchKeysOption
+ <*> switch
+ ( long "inputs"
+ <> help "display input files"
+ )
parseFormatOption :: Parser Utility.Format.Format
parseFormatOption =
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) _) =
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.