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) _) =