diff --git a/hgext/color.py b/hgext/color.py --- a/hgext/color.py +++ b/hgext/color.py @@ -349,8 +349,9 @@ def uisetup(ui): 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) diff --git a/tests/test-ui-color.py b/tests/test-ui-color.py --- a/tests/test-ui-color.py +++ b/tests/test-ui-color.py @@ -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.write('buffered\n') 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)) diff --git a/tests/test-ui-color.py.out b/tests/test-ui-color.py.out --- a/tests/test-ui-color.py.out +++ b/tests/test-ui-color.py.out @@ -1,3 +1,5 @@ warning error 'buffered\n' +colored? True +colored? True