8e5ea28c26
The hoped for optimisation of CommandStart with -J did not materialize. In fact, not runnign CommandStart in parallel is slower than -J3. So, CommandStart are still run in parallel. (The actual bad performance I've been seeing with -J in my big repo has to do with building the remoteList.) But, this is still progress toward making -J faster, because it gets rid of the onlyActionOn roadblock in the way of making CommandCleanup jobs run separate from CommandPerform jobs. Added OnlyActionOn constructor for ActionItem which fixes the onlyActionOn breakage in the last commit. Made CustomOutput include an ActionItem, so even things using it can specify OnlyActionOn. In Command.Move and Command.Sync, there were CommandStarts that used includeCommandAction, so output messages, which is no longer allowed. Fixed by using startingCustomOutput, but that's still not quite right, since it prevents message display for the includeCommandAction run inside it too.
100 lines
2.8 KiB
Haskell
100 lines
2.8 KiB
Haskell
{- git-annex command
|
|
-
|
|
- Copyright 2010-2018 Joey Hess <id@joeyh.name>
|
|
-
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
|
-}
|
|
|
|
module Command.Find where
|
|
|
|
import Data.Default
|
|
import qualified Data.Map as M
|
|
|
|
import Command
|
|
import Annex.Content
|
|
import Limit
|
|
import Types.Key
|
|
import Git.FilePath
|
|
import qualified Utility.Format
|
|
import Utility.DataUnits
|
|
|
|
cmd :: Command
|
|
cmd = notBareRepo $ withGlobalOptions [annexedMatchingOptions] $ mkCommand $
|
|
command "find" SectionQuery "lists available files"
|
|
paramPaths (seek <$$> optParser)
|
|
|
|
mkCommand :: Command -> Command
|
|
mkCommand = noCommit . noMessages . withGlobalOptions [jsonOptions]
|
|
|
|
data FindOptions = FindOptions
|
|
{ findThese :: CmdParams
|
|
, formatOption :: Maybe Utility.Format.Format
|
|
, keyOptions :: Maybe KeyOptions
|
|
, batchOption :: BatchMode
|
|
}
|
|
|
|
optParser :: CmdParamsDesc -> Parser FindOptions
|
|
optParser desc = FindOptions
|
|
<$> cmdParams desc
|
|
<*> optional parseFormatOption
|
|
<*> optional parseBranchKeysOption
|
|
<*> parseBatchOption
|
|
|
|
parseFormatOption :: Parser Utility.Format.Format
|
|
parseFormatOption =
|
|
option (Utility.Format.gen <$> str)
|
|
( long "format" <> metavar paramFormat
|
|
<> help "control format of output"
|
|
)
|
|
<|> flag' (Utility.Format.gen "${file}\0")
|
|
( long "print0"
|
|
<> help "output filenames terminated with nulls"
|
|
)
|
|
|
|
seek :: FindOptions -> CommandSeek
|
|
seek o = case batchOption o of
|
|
NoBatch -> withKeyOptions (keyOptions o) False
|
|
(commandAction . startKeys o)
|
|
(withFilesInGit (commandAction . go))
|
|
=<< workTreeItems (findThese o)
|
|
Batch fmt -> batchFilesMatching fmt go
|
|
where
|
|
go = whenAnnexed $ start o
|
|
|
|
-- only files inAnnex are shown, unless the user has requested
|
|
-- others via a limit
|
|
start :: FindOptions -> FilePath -> Key -> CommandStart
|
|
start o file key =
|
|
stopUnless (limited <||> inAnnex key) $
|
|
startingCustomOutput key $ do
|
|
showFormatted (formatOption o) file $ ("file", file) : keyVars key
|
|
next $ return True
|
|
|
|
startKeys :: FindOptions -> (Key, ActionItem) -> CommandStart
|
|
startKeys o (key, ActionItemBranchFilePath (BranchFilePath _ topf) _) =
|
|
start o (getTopFilePath topf) key
|
|
startKeys _ _ = stop
|
|
|
|
showFormatted :: Maybe Utility.Format.Format -> String -> [(String, String)] -> Annex ()
|
|
showFormatted format unformatted vars =
|
|
unlessM (showFullJSON $ JSONChunk vars) $
|
|
case format of
|
|
Nothing -> liftIO $ putStrLn unformatted
|
|
Just formatter -> liftIO $ putStr $
|
|
Utility.Format.format formatter $
|
|
M.fromList vars
|
|
|
|
keyVars :: Key -> [(String, String)]
|
|
keyVars key =
|
|
[ ("key", serializeKey key)
|
|
, ("backend", decodeBS $ formatKeyVariety $ keyVariety key)
|
|
, ("bytesize", size show)
|
|
, ("humansize", size $ roughSize storageUnits True)
|
|
, ("keyname", decodeBS $ keyName key)
|
|
, ("hashdirlower", hashDirLower def key)
|
|
, ("hashdirmixed", hashDirMixed def key)
|
|
, ("mtime", whenavail show $ keyMtime key)
|
|
]
|
|
where
|
|
size c = whenavail c $ keySize key
|
|
whenavail = maybe "unknown"
|