initial implementation of --explain

Currently it only displays explanations of options like --in and --copies.

In the future, it should explain preferred content expression evaluation
and other decisions.

The explanations of a few things could be better. In particular,
"standard" will just appear as-is (or as "!standard" if it doesn't
match), rather than explaining why the standard preferred content expression
for the group matches or not.

Currently as implemented, it goes to stdout, and so commands like
git-annex find that have custom output will not display --explain
information. Perhaps that should change, dunno.

Sponsored-by: Dartmouth College's DANDI project
This commit is contained in:
Joey Hess 2023-07-25 16:11:06 -04:00
parent cf40e2d4b6
commit f25eeedeac
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
12 changed files with 122 additions and 46 deletions

View file

@ -50,6 +50,7 @@ module Messages (
outputMessage,
withMessageState,
MessageState,
explain,
prompt,
mkPrompter,
sanitizeTopLevelExceptionMessages,
@ -299,6 +300,14 @@ jsonOutputEnabled = withMessageState $ \s -> return $
JSONOutput _ -> True
_ -> False
explain :: Maybe RawFilePath -> StringContainingQuotedPath -> Annex ()
explain Nothing _ = return ()
explain (Just f) msg = do
rd <- Annex.getRead id
when (Annex.explainenabled rd) $
outputMessage JSON.none id $
"[" <> QuotedPath f <> " " <> msg <> "]\n"
{- Prevents any concurrent console access while running an action, so
- that the action is the only thing using the console, and can eg prompt
- the user.