#11696 closed defect (fixed)
TypeError: 'Logger' object is not callable
| Reported by: | Owned by: | ||
|---|---|---|---|
| Priority: | normal | Milestone: | plugin - mercurial |
| Component: | plugin/mercurial | Version: | 1.0 |
| Severity: | normal | Keywords: | |
| Cc: | Branch: | ||
| Release Notes: |
compatibility fix for Mercurial 3.0 |
||
| API Changes: | |||
| Internal Changes: | |||
Description (last modified by )
How to Reproduce
While doing a GET operation on /timeline, Trac issued an internal error.
Additional details:
This error also occurs when accessing the /browser URL. The issue appears to be caused by a member name collision in the tracext.hg.backend.trac_ui class. The trac_ui class uses trac_ui.log to store a Logger object, but the mercurial.ui base class is using log as a member function:
def log(self, service, *msg, **opts):
'''hook for logging facility extensions
service should be a readily-identifiable subsystem, which will
allow filtering.
message should be a newline-terminated string to log.
'''
pass
The exception is raised when the mercurial.tags._readtagcache function is expecting trac_ui.log to be a function, when it is an instance of Logger. Here is the code from _readtagcache:
ui.log('tagscache',
'resolved %d tags cache entries from %d manifests in %0.4f '
'seconds\n',
len(cachefnode), len(newheads), duration)
I was able to fix the error by altering the code in backend.py to rename the trac_ui.log member to trac_ui._log:
-
backend.py
old new 181 181 def __init__(self, *args, **kwargs): 182 182 ui.__init__(self, *args) 183 183 self.setconfig('ui', 'interactive', 'off') 184 self. log = kwargs.get('log', args and args[0].log or None)184 self._log = kwargs.get('log', args and args[0]._log or None) 185 185 186 186 def write(self, *args, **opts): 187 187 for a in args: 188 self. log.info('(mercurial status) %s', a)188 self._log.info('(mercurial status) %s', a) 189 189 190 190 def write_err(self, *args, **opts): 191 191 for a in args: 192 self. log.warn('(mercurial warning) %s', a)192 self._log.warn('(mercurial warning) %s', a) 193 193 194 194 def plain(self, *args, **kw): 195 195 return False # so that '[hg] hgrc' file can specify [ui] options
Request parameters:
{}
User agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36
System Information
Trac | 1.0
|
Docutils | 0.11
|
Genshi | 0.7 (with speedups)
|
Mercurial | 3.0
|
mod_wsgi | 3.4 (WSGIProcessGroup WSGIApplicationGroup %{GLOBAL})
|
Pygments | 1.6
|
pysqlite | 2.6.0
|
Python | 2.7.6 (default, May 15 2014, 18:23:58) [GCC 4.2.1 Compatible FreeBSD Clang 3.3 (tags/RELEASE_33/final 183502)]
|
pytz | 2014.3
|
setuptools | 2.0.1
|
SQLite | 3.8.4.3
|
jQuery | 1.7.2
|
Enabled Plugins
TracMercurial | 1.0.0.3dev
|
Python Traceback
Traceback (most recent call last):
File "build/bdist.freebsd-10.0-RELEASE-i386/egg/trac/web/main.py", line 497, in _dispatch_request
dispatcher.dispatch(req)
File "build/bdist.freebsd-10.0-RELEASE-i386/egg/trac/web/main.py", line 233, in dispatch
content_type)
File "build/bdist.freebsd-10.0-RELEASE-i386/egg/trac/web/chrome.py", line 1000, in render_template
encoding='utf-8')
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/core.py", line 184, in render
return encode(generator, method=method, encoding=encoding, out=out)
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/output.py", line 58, in encode
for chunk in iterator:
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/output.py", line 350, in __call__
for kind, data, pos in stream:
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/output.py", line 829, in __call__
for kind, data, pos in stream:
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/output.py", line 669, in __call__
for kind, data, pos in stream:
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/output.py", line 774, in __call__
for kind, data, pos in chain(stream, [(None, None, None)]):
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/output.py", line 594, in __call__
for ev in stream:
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/core.py", line 289, in _ensure
for event in stream:
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/core.py", line 289, in _ensure
for event in stream:
File "build/bdist.freebsd-10.0-RELEASE-i386/egg/trac/web/chrome.py", line 1137, in _strip_accesskeys
for kind, data, pos in stream:
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/core.py", line 289, in _ensure
for event in stream:
File "build/bdist.freebsd-10.0-RELEASE-i386/egg/trac/web/chrome.py", line 1126, in _generate
for kind, data, pos in stream:
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/template/base.py", line 618, in _include
for event in stream:
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/template/markup.py", line 378, in _match
ctxt, start=idx + 1, **vars):
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/template/markup.py", line 378, in _match
ctxt, start=idx + 1, **vars):
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/template/markup.py", line 326, in _match
for event in stream:
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/template/base.py", line 558, in _flatten
for kind, data, pos in stream:
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/core.py", line 289, in _ensure
for event in stream:
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/path.py", line 588, in _generate
subevent = next()
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/template/base.py", line 618, in _include
for event in stream:
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/template/markup.py", line 315, in _strip
event = next()
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/template/base.py", line 558, in _flatten
for kind, data, pos in stream:
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/core.py", line 289, in _ensure
for event in stream:
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/path.py", line 588, in _generate
subevent = next()
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/template/base.py", line 618, in _include
for event in stream:
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/template/markup.py", line 315, in _strip
event = next()
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/template/base.py", line 578, in _flatten
result = _eval_expr(data, ctxt, vars)
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/template/base.py", line 289, in _eval_expr
retval = expr.evaluate(ctxt)
File "/usr/local/lib/python2.7/site-packages/Genshi-0.7-py2.7-freebsd-10.0-RELEASE-p3-i386.egg/genshi/template/eval.py", line 177, in evaluate
return eval(self.code, _globals, {'__data__': data})
File "/usr/local/www/apache22/trac/eggs/Trac-1.0-py2.7.egg-tmp/trac/timeline/templates/timeline.html", line 49, in <Expression u"event.render('title', context)">
<span class="time">${format_time(event.date, 'short')}</span> ${event.render('title', context)}
File "build/bdist.freebsd-10.0-RELEASE-i386/egg/trac/timeline/web_ui.py", line 355, in <lambda>
provider.render_timeline_event(context, field, event)
File "build/bdist.freebsd-10.0-RELEASE-i386/egg/trac/versioncontrol/web_ui/changeset.py", line 1037, in render_timeline_event
for name in cset.get_tags():
File "/usr/home/jshue/working/mercurial-plugin/tracext/hg/backend.py", line 1322, in get_tags
return [self.repos.to_u(t) for t in self.ctx.tags()]
File "/usr/local/lib/python2.7/site-packages/mercurial/context.py", line 369, in tags
return self._repo.nodetags(self._node)
File "/usr/local/lib/python2.7/site-packages/mercurial/localrepo.py", line 675, in nodetags
if not self._tagscache.nodetagscache:
File "/usr/local/lib/python2.7/site-packages/mercurial/util.py", line 287, in __get__
result = self.func(obj)
File "/usr/local/lib/python2.7/site-packages/mercurial/localrepo.py", line 598, in _tagscache
cache.tags, cache.tagtypes = self._findtags()
File "/usr/local/lib/python2.7/site-packages/mercurial/localrepo.py", line 635, in _findtags
tagsmod.findglobaltags(self.ui, self, alltags, tagtypes)
File "/usr/local/lib/python2.7/site-packages/mercurial/tags.py", line 31, in findglobaltags
(heads, tagfnode, cachetags, shouldwrite) = _readtagcache(ui, repo)
File "/usr/local/lib/python2.7/site-packages/mercurial/tags.py", line 261, in _readtagcache
len(cachefnode), len(newheads), duration)
TypeError: 'Logger' object is not callable
Attachments (0)
Change History (5)
comment:1 by , 11 years ago
comment:2 by , 11 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
Fix pushed in [211357abe5c0/mercurial-plugin] (0.12) and [3bf996dd58c7/mercurial-plugin] (1.0).
Thanks!
comment:3 by , 11 years ago
| Owner: | set to |
|---|



Nice catch!
I upgraded to Mercurial 3.1-rc this morning and now I also see this, after forcing a tag cache update (
touch .hg/tags.cache).That
ui.log()method is there since 1.7 apparently… but this is the first time we get caught by this (3.0 introduced this precise call).Thanks for the patch, which works for me as well.