[PATCH V2] profiling: allow logging profile to the blackbox

Durham Goode durham at fb.com
Tue Sep 8 18:41:47 UTC 2015


# HG changeset patch
# User Durham Goode <durham at fb.com>
# Date 1441737592 25200
#      Tue Sep 08 11:39:52 2015 -0700
# Node ID a8eeffb15ed4bf1e55bc3b36baa64c8f2b5d0739
# Parent  2cd61d6e66c1034c97b7095fdf1d7908dd437b26
profiling: allow logging profile to the blackbox

This allows specifying '--config profiling.output=blackbox' which will log the
profile output to the blackbox (if enabled). This is useful for doing profiling
on the server since it allows us to record the command, it's result, any
exceptions, and it's profile, all in one spot.  And we get log rotation for
free.

diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py
--- a/mercurial/dispatch.py
+++ b/mercurial/dispatch.py
@@ -1021,7 +1021,10 @@ def _runcommand(ui, options, cmd, cmdfun
 
         output = ui.config('profiling', 'output')
 
-        if output:
+        if output == 'blackbox':
+            import StringIO
+            fp = StringIO.StringIO()
+        elif output:
             path = ui.expandpath(output)
             fp = open(path, 'wb')
         else:
@@ -1036,6 +1039,12 @@ def _runcommand(ui, options, cmd, cmdfun
                 return statprofile(ui, checkargs, fp)
         finally:
             if output:
+                if output == 'blackbox':
+                    val = "Profile:\n%s" % fp.getvalue()
+                    # ui.log treats the input as a format string,
+                    # so we need to escape any % signs.
+                    val = val.replace('%', '%%')
+                    ui.log('profile', val)
                 fp.close()
     else:
         return checkargs()
diff --git a/tests/test-profile.t b/tests/test-profile.t
--- a/tests/test-profile.t
+++ b/tests/test-profile.t
@@ -14,6 +14,9 @@ test --profile
   $ hg --profile --config profiling.output=../out st
   $ grep CallCount ../out > /dev/null || cat ../out
 
+  $ hg --profile --config profiling.output=blackbox --config extensions.blackbox= st
+  $ grep CallCount .hg/blackbox.log > /dev/null || cat .hg/blackbox.log
+
   $ hg --profile --config profiling.format=text st 2>../out
   $ grep CallCount ../out > /dev/null || cat ../out
 


More information about the Mercurial-devel mailing list