changeset 14516:842a9179132c

color: check if ui is already a subclass of colorui before wrapping it since it's possible to reuse the ui object (see 80c599eee3f3) between dispatch calls, the ui might have been wrapped already. we could probably move this test up a bit but leaving it here allows updates to take effect by extstyles() and configstyles().
author Idan Kamara <idankk86@gmail.com>
date Thu, 02 Jun 2011 00:43:34 +0300
parents 76f295eaed86
children 5a931246afc5
files hgext/color.py tests/test-ui-color.py tests/test-ui-color.py.out
diffstat 3 files changed, 29 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/color.py	Thu Jun 02 00:43:34 2011 +0300
+++ b/hgext/color.py	Thu Jun 02 00:43:34 2011 +0300
@@ -349,8 +349,9 @@
         mode = _modesetup(ui_, opts)
         if mode:
             colorui._colormode = mode
-            colorui.__bases__ = (ui_.__class__,)
-            ui_.__class__ = colorui
+            if not issubclass(ui_.__class__, colorui):
+                colorui.__bases__ = (ui_.__class__,)
+                ui_.__class__ = colorui
             extstyles()
             configstyles(ui_)
         return orig(ui_, opts, cmd, cmdfunc)
--- a/tests/test-ui-color.py	Thu Jun 02 00:43:34 2011 +0300
+++ b/tests/test-ui-color.py	Thu Jun 02 00:43:34 2011 +0300
@@ -1,4 +1,6 @@
+import os, sys
 from hgext import color
+from mercurial import dispatch, ui
 
 # ensure errors aren't buffered
 testui = color.colorui()
@@ -7,3 +9,25 @@
 testui.warn('warning\n')
 testui.write_err('error\n')
 print repr(testui.popbuffer())
+
+# test dispatch.dispatch with the same ui object
+hgrc = open(os.environ["HGRCPATH"], 'w')
+hgrc.write('[extensions]\n')
+hgrc.write('color=\n')
+hgrc.close()
+
+ui_ = ui.ui()
+ui_.setconfig('ui', 'formatted', 'True')
+
+# call some arbitrary command just so we go through
+# color's wrapped _runcommand twice.
+# we're not interested in the output, so write that to devnull
+def runcmd():
+    sys.stdout = open(os.devnull, 'w')
+    dispatch.dispatch(dispatch.request(['version', '-q'], ui_))
+    sys.stdout = sys.__stdout__
+
+runcmd()
+print "colored? " + str(issubclass(ui_.__class__, color.colorui))
+runcmd()
+print "colored? " + str(issubclass(ui_.__class__, color.colorui))
--- a/tests/test-ui-color.py.out	Thu Jun 02 00:43:34 2011 +0300
+++ b/tests/test-ui-color.py.out	Thu Jun 02 00:43:34 2011 +0300
@@ -1,3 +1,5 @@
 warning
 error
 'buffered\n'
+colored? True
+colored? True