use existing debug machinery for explain
authorJoey Hess <joeyh@joeyh.name>
Tue, 25 Jul 2023 19:47:58 +0000 (15:47 -0400)
committerJoey Hess <joeyh@joeyh.name>
Tue, 25 Jul 2023 19:47:58 +0000 (15:47 -0400)
explain is a kind of debug message, but not formatted in the same way.
So it makes sense to reuse the debug machinery for it, since that is
already quite optimised.

Sponsored-by: Dartmouth College's DANDI project
Annex/Debug.hs
Messages.hs
Utility/Debug.hs

index f3626ffaa119880be68643a70c44cb0cb5d0b7ce..e2f04b4f9addcb7017da3719447695124134c47f 100644 (file)
@@ -1,6 +1,6 @@
 {- git-annex debugging
  -
- - Copyright 2021 Joey Hess <id@joeyh.name>
+ - Copyright 2021-2023 Joey Hess <id@joeyh.name>
  -
  - Licensed under the GNU AGPL version 3 or higher.
  -}
@@ -8,8 +8,11 @@
 module Annex.Debug (
        DebugSelector(..),
        DebugSource(..),
+       RawDebugMessage(..),
        debug,
+       debug',
        fastDebug,
+       fastDebug',
        configureDebug,
        debugSelectorFromGitConfig,
        parseDebugSelector,
@@ -17,7 +20,7 @@ module Annex.Debug (
 
 import Common
 import qualified Annex
-import Utility.Debug hiding (fastDebug)
+import Utility.Debug hiding (fastDebug, fastDebug')
 import qualified Utility.Debug
 import Annex.Debug.Utility
 
@@ -25,7 +28,11 @@ import Annex.Debug.Utility
 -- is read from the Annex monad, which avoids any IORef access overhead
 -- when debugging is not enabled.
 fastDebug :: DebugSource -> String -> Annex.Annex ()
-fastDebug src msg = do
+fastDebug = fastDebug'
+
+fastDebug' :: DebugMessage msg => DebugSource -> msg -> Annex.Annex ()
+fastDebug' src msg = do
        rd <- Annex.getRead id
        when (Annex.debugenabled rd) $
-               liftIO $ Utility.Debug.fastDebug (Annex.debugselector rd) src msg
+               liftIO $ Utility.Debug.fastDebug' (Annex.debugselector rd) src msg
+       
index 7d865b29d63174dfaca59979a55767e50397afb6..5a318a2c687f3260a15de1f38a5a2eea6cec2a98 100644 (file)
@@ -50,6 +50,7 @@ module Messages (
        outputMessage,
        withMessageState,
        MessageState,
+       explain,
        prompt,
        mkPrompter,
        sanitizeTopLevelExceptionMessages,
@@ -281,6 +282,11 @@ debugDisplayer = do
                S.hPutStr stderr (safeOutput s <> "\n")
                hFlush stderr
 
+explain :: Maybe String -> String -> Annex ()
+explain Nothing _ = return ()
+explain (Just f) msg = fastDebug' "explain" $ 
+       RawDebugMessage ('[' : f ++ " " ++ msg ++ "]")
+
 {- Should commands that normally output progress messages have that
  - output disabled? -}
 commandProgressDisabled :: Annex Bool
index 6e6e701162773cd5c194b3d1936fe0640fae1457..b7fe471f2e70602242ae8ca4fac285a768713f46 100644 (file)
@@ -1,6 +1,6 @@
 {- Debug output
  -
- - Copyright 2021 Joey Hess <id@joeyh.name>
+ - Copyright 2021-2023 Joey Hess <id@joeyh.name>
  -
  - License: BSD-2-clause
  -}
 module Utility.Debug (
        DebugSource(..),
        DebugSelector(..),
+       DebugMessage,
+       RawDebugMessage(..),
        configureDebug,
        getDebugSelector,
        debug,
-       fastDebug
+       debug',
+       fastDebug,
+       fastDebug'
 ) where
 
 import qualified Data.ByteString as S
@@ -50,6 +54,22 @@ instance Sem.Semigroup DebugSelector where
 instance Monoid DebugSelector where
        mempty = NoDebugSelector
 
+class DebugMessage msg where
+       formatDebugMessage :: DebugSource -> msg -> IO S.ByteString
+
+instance DebugMessage String where
+       formatDebugMessage (DebugSource src) msg = do
+               t <- encodeBS . formatTime defaultTimeLocale "[%F %X%Q]"
+                       <$> getZonedTime
+               return (t <> " (" <> src <> ") " <> encodeBS msg)
+
+-- Debug message to be displayed without the usual time stamp 
+-- and source information.
+newtype RawDebugMessage = RawDebugMessage String
+
+instance DebugMessage RawDebugMessage where
+       formatDebugMessage _ (RawDebugMessage msg) = pure (encodeBS msg)
+
 -- | Configures debugging.
 configureDebug
        :: (S.ByteString -> IO ())
@@ -76,7 +96,10 @@ debugConfigGlobal = unsafePerformIO $ newIORef (dontshow, selectnone)
 -- have to consult a IORef each time, using it in a tight loop may slow
 -- down the program.
 debug :: DebugSource -> String -> IO ()
-debug src msg = readIORef debugConfigGlobal >>= \case
+debug = debug'
+
+debug' :: DebugMessage msg => DebugSource -> msg -> IO ()
+debug' src msg = readIORef debugConfigGlobal >>= \case
        (displayer, NoDebugSelector) ->
                displayer =<< formatDebugMessage src msg
        (displayer, DebugSelector p)
@@ -88,15 +111,12 @@ debug src msg = readIORef debugConfigGlobal >>= \case
 -- When the DebugSelector does not let the message be displayed, this runs
 -- very quickly, allowing it to be used inside tight loops.
 fastDebug :: DebugSelector -> DebugSource -> String -> IO ()
-fastDebug NoDebugSelector src msg = do
+fastDebug = fastDebug'
+
+fastDebug' :: DebugMessage msg => DebugSelector -> DebugSource -> msg -> IO ()
+fastDebug' NoDebugSelector src msg = do
        (displayer, _) <- readIORef debugConfigGlobal
        displayer =<< formatDebugMessage src msg
-fastDebug (DebugSelector p) src msg
-       | p src = fastDebug NoDebugSelector src msg
+fastDebug' (DebugSelector p) src msg
+       | p src = fastDebug' NoDebugSelector src msg
        | otherwise = return ()
-
-formatDebugMessage :: DebugSource -> String -> IO S.ByteString
-formatDebugMessage (DebugSource src) msg = do
-       t <- encodeBS . formatTime defaultTimeLocale "[%F %X%Q]"
-               <$> getZonedTime
-       return (t <> " (" <> src <> ") " <> encodeBS msg)