findcompute --inputs
authorJoey Hess <joeyh@joeyh.name>
Wed, 19 Mar 2025 19:39:05 +0000 (15:39 -0400)
committerJoey Hess <joeyh@joeyh.name>
Wed, 19 Mar 2025 19:39:05 +0000 (15:39 -0400)
Useful for eg, generating dependency graphs.

Command/FindComputed.hs
Command/WhereUsed.hs
doc/git-annex-findcomputed.mdwn

index d9064b23905cf16cd71e73d36874d2385effb73e..83f9a3cddd4dad2543eb708bd770a05003f08725 100644 (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) _) =
index bfe49d1a736e9ec01e57fdafdcf51224e8c43ba6..1a7e7033d8d3ee2e9f498b0961f17e48ef517e4b 100644 (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
index 8e1bafe7d0fc6beec668045643d42173cfb3476a..aa3ae07db17a252f21bdea22e3ee4e6ad6c871ba 100644 (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.