Edgewall Software

Opened 12 years ago

Last modified 12 years ago

#10545 closed defect

Mercurial plugin fails with IndexError — at Version 4

Reported by: Mitar Owned by:
Priority: normal Milestone:
Component: version control Version: 0.12.2
Severity: normal Keywords: verify
Cc: mmitar@… Branch:
Release Notes:
API Changes:
Internal Changes:

Description (last modified by Christian Boos)

I am getting IndexError: list index out of range when I am trying to search Trac with Mercurial repository.

File "/usr/lib/python2.6/dist-packages/trac/web/main.py", line 511, in _dispatch_request
  dispatcher.dispatch(req)
File "/usr/lib/python2.6/dist-packages/trac/web/main.py", line 237, in dispatch
  resp = chosen_handler.process_request(req)
File "/usr/lib/python2.6/dist-packages/trac/search/web_ui.py", line 103, in process_request
  results = self._do_search(req, terms, filters)
File "/usr/lib/python2.6/dist-packages/trac/search/web_ui.py", line 208, in _do_search
  or [])
File "/usr/lib/python2.6/dist-packages/trac/versioncontrol/web_ui/changeset.py", line 1153, in get_search_results
  if 'CHANGESET_VIEW' in req.perm(cset):
File "/usr/lib/python2.6/dist-packages/trac/perm.py", line 553, in has_permission
  return self._has_permission(action, resource)
File "/usr/lib/python2.6/dist-packages/trac/perm.py", line 567, in _has_permission
  check_permission(action, perm.username, resource, perm)
File "/usr/lib/python2.6/dist-packages/trac/perm.py", line 454, in check_permission
  perm)
File "/usr/lib/python2.6/dist-packages/trac/versioncontrol/svn_authz.py", line 204, in check_permission
  changes = list(repos.get_changeset(resource.id).get_changes())
File "build/bdist.linux-x86_64/egg/tracext/hg/backend.py", line 653, in get_changeset
  return MercurialChangeset(self, self.changectx(rev))
File "build/bdist.linux-x86_64/egg/tracext/hg/backend.py", line 537, in changectx
  return self.repo[self.short_rev(rev)]
File "/usr/lib/python2.6/dist-packages/mercurial/localrepo.py", line 205, in __getitem__
  return context.changectx(self, changeid)
File "/usr/lib/python2.6/dist-packages/mercurial/context.py", line 26, in __init__
  self._node = self._repo.changelog.node(changeid)
File "/usr/lib/python2.6/dist-packages/mercurial/revlog.py", line 309, in node
  return self.index[rev][7]

To get this error I first have to change error reporting by removing

 <td><code>${shorten_line(repr(value))}</code></td>

from error.html. If I do not remove it, I get this error instead:

  File "/usr/lib/pymodules/python2.6/genshi/template/eval.py", line 178, in evaluate
    return eval(self.code, _globals, {'__data__': data})
  File "/usr/lib/python2.6/dist-packages/trac/templates/error.html", line 165, in <Expression u'shorten_line(repr(value))'>
    <td><code>${shorten_line(repr(value))}</code></td>
  File "/usr/lib/python2.6/dist-packages/mercurial/context.py", line 38, in __repr__
    return "<changectx %s>" % str(self)
  File "/usr/lib/python2.6/dist-packages/mercurial/context.py", line 32, in __str__
    return short(self.node())
  File "/usr/lib/python2.6/dist-packages/mercurial/context.py", line 101, in node
    return self._node
AttributeError: 'changectx' object has no attribute '_node'

I am using Mercurial 2.0.1 and 10899 revision of Mercurial plugin for Trac.

Change History (4)

comment:1 by Christian Boos, 12 years ago

Description: modified (diff)

Looks like a nasty one…

Btw, how did you manage to search on Mercurial changesets? ;-)

comment:2 by Mitar, 12 years ago

Hm. This thing magically disappeared now once I have played a bit more with it.

I have no idea how I managed to search on Mercurial changesets. We went from SVN to Mercurial and I just wanted to search over whole Trac for svn keyword to update URLs and such, and BAM. It blew.

BTW, description still does not render correctly.

comment:3 by Mitar, 12 years ago

It is possible that the problem was me having repository_dir set. Now I moved to repository defined through the admin interface and not config file anymore. And about there is suspicious /usr/lib/python2.6/dist-packages/trac/versioncontrol/svn_authz.py entry in the backtrace. It seems it somehow searched over Mercurial changesets through SVN?

comment:4 by Christian Boos, 12 years ago

Description: modified (diff)
Keywords: verify added

No, the svn_authz is for the AuthzSourcePolicy.

I think that simply there were still the old svn changesets in the cache, and they were associated with the repos id which is now a mercurial one. We should probably try to reproduce such a scenrio (changing type from svn to hg) and check if the advice given is correct (and see if a resync works correctly in such situation, i.e. that it removes the old svn changesets).

Sorry to still not have the DB backend for Mercurial (#8417), hence no possibility to search for now. Incidentally I'm working in this area today, but no promise as the when this might become available in a branch near you ;-)

Also, the problem you had with the repr was already mentioned in #10174 and I think that we should indeed use some kind of safe_repr in the error reporting code.

Note: See TracTickets for help on using tickets.