Defect #28725
closedMercurial 4.6 compatibility
0%
Description
Hello,
My Redmine 3.4.5 can't display any info when checking a mercurial repository when I upgrade Mercurial from 4.5.3 to 4.6.
The following error is shown in production.log:
Started GET "/redmine/projects/nerdsarmy/repository" for aaa.bbb.ccc.ddd at 2018-05-09 21:07:37 +0200
Processing by RepositoriesController#show as HTML Parameters: {"id"=>"nerdsarmy"}
Current user: me@mydot.com (id=86)
hg: error during getting info: hg exited with non-zero status: 1
Rendered common/error.html.erb within layouts/base (1.6ms)
Rendered plugins/redmine_code_review/app/views/code_review/_html_header.html.erb (5.3ms)
Rendered plugins/redmine_code_review/app/views/code_review/_change_repository_view.html.erb (0.1ms)
Rendered plugins/redmine_code_review/app/views/code_review/_body_bottom.html.erb (2.2ms)
Completed 404 Not Found in 524ms (Views: 77.3ms | ActiveRecord: 10.2ms)
The command that triggers the error:
hg -R/hg/gl1718-nerdsarmy-model --encoding=utf-8 --config extensions.redminehelper=/redmine-3.4.5/lib/redmine/scm/adapters/mercurial/redminehelper.py --config diff.git=false rhsummary
whose result is:
<?xml version="1.0"?>
<rhsummary>
<repository root="/hg/gl1718-nerdsarmy-model">
</repository>
</rhsummary>
** Unknown exception encountered with possibly-broken third-party extension redminehelper
** which supports versions unknown of Mercurial.
** Please disable redminehelper and try your action again.
** If that fixes the bug please report it to the extension author.
** Python 2.7.15 (default, May 9 2018, 19:47:00) [GCC 7.2.1 20170829 (Red Hat 7.2.1-1)]
** Mercurial version 4.6, système de gestion de sources distribué
** Extensions chargées : highlight, strip, redminehelper
Traceback (most recent call last):
File "/usr/local/bin/hg", line 41, in <module>
dispatch.run()
File "/usr/local/lib/python2.7/site-packages/mercurial/dispatch.py", line 90, in run
status = (dispatch(req) or 0)
File "/usr/local/lib/python2.7/site-packages/mercurial/dispatch.py", line 210, in dispatch
ret = _runcatch(req)
File "/usr/local/lib/python2.7/site-packages/mercurial/dispatch.py", line 351, in _runcatch
return _callcatch(ui, _runcatchfunc)
File "/usr/local/lib/python2.7/site-packages/mercurial/dispatch.py", line 359, in _callcatch
return scmutil.callcatch(ui, func)
File "/usr/local/lib/python2.7/site-packages/mercurial/scmutil.py", line 160, in callcatch
return func()
File "/usr/local/lib/python2.7/site-packages/mercurial/dispatch.py", line 341, in _runcatchfunc
return _dispatch(req)
File "/usr/local/lib/python2.7/site-packages/mercurial/dispatch.py", line 971, in _dispatch
cmdpats, cmdoptions)
File "/usr/local/lib/python2.7/site-packages/mercurial/dispatch.py", line 727, in runcommand
ret = _runcommand(ui, options, cmd, d)
File "/usr/local/lib/python2.7/site-packages/mercurial/dispatch.py", line 979, in _runcommand
return cmdfunc()
File "/usr/local/lib/python2.7/site-packages/mercurial/dispatch.py", line 968, in <lambda>
d = lambda: util.checksignature(func)(ui, *args, **strcmdopt)
File "/usr/local/lib/python2.7/site-packages/mercurial/util.py", line 1553, in check
return func(*args, **kwargs)
File "/usr/share/redmine-3.4.5/lib/redmine/scm/adapters/mercurial/redminehelper.py", line 219, in rhsummary
_tip(ui, repo)
File "/usr/share/redmine-3.4.5/lib/redmine/scm/adapters/mercurial/redminehelper.py", line 64, in _tip
tipctx = repo.changectx(tiprev())
File "/usr/local/lib/python2.7/site-packages/mercurial/repoview.py", line 255, in __getattr
return getattr(self._unfilteredrepo, attr)
AttributeError: 'localrepository' object has no attribute 'changectx'
All of this is back to normal when downgrading mercurial to 4.5.3
Regards
Files
Updated by Marc Schlaich over 7 years ago
Here is a patch.
BTW, the correct way communicating with Mercurial would be using the Command Server and not the internal API (see https://www.mercurial-scm.org/wiki/MercurialApi and https://www.mercurial-scm.org/wiki/CommandServer).
# HG changeset patch
# User schlamar <marc.schlaich@gmail.com>
# Date 1527142395 -7200
# Thu May 24 08:13:15 2018 +0200
# Branch 3.4-stable
# Node ID ecbaecb1254177457490746a20060732b17fa642
# Parent 487d3d81d8a89f719f5e3d340472a13a29e1df62
diff -r 487d3d81d8a8 -r ecbaecb12541 lib/redmine/scm/adapters/mercurial/redminehelper.py
--- a/lib/redmine/scm/adapters/mercurial/redminehelper.py Sat Apr 07 12:26:31 2018 +0000
+++ b/lib/redmine/scm/adapters/mercurial/redminehelper.py Thu May 24 08:13:15 2018 +0200
@@ -54,6 +54,12 @@
_x = cgi.escape
_u = lambda s: cgi.escape(urllib.quote(s))
+def _changectx(repo, rev):
+ if hasattr(repo, 'changectx'):
+ return repo.changectx(rev)
+ else:
+ return repo[rev]
+
def _tip(ui, repo):
# see mercurial/commands.py:tip
def tiprev():
@@ -61,7 +67,7 @@
return len(repo) - 1
except TypeError: # Mercurial < 1.1
return repo.changelog.count() - 1
- tipctx = repo.changectx(tiprev())
+ tipctx = _changectx(repo, tiprev())
ui.write('<tip revision="%d" node="%s"/>\n'
% (tipctx.rev(), _x(node.hex(tipctx.node()))))
@@ -94,13 +100,18 @@
return repo.branchheads(branch, closed=False)
except TypeError: # Mercurial < 1.2
return repo.branchheads(branch)
+ def lookup(rev):
+ try:
+ return repo.lookup(rev)
+ except RuntimeError:
+ return repo[rev]
for t, n, r in sorted(iterbranches(), key=lambda e: e[2], reverse=True):
- if repo.lookup(r) in branchheads(t):
+ if lookup(r) in branchheads(t):
ui.write('<branch revision="%d" node="%s" name="%s"/>\n'
% (r, _x(node.hex(n)), _x(t)))
def _manifest(ui, repo, path, rev):
- ctx = repo.changectx(rev)
+ ctx = _changectx(repo, rev)
ui.write('<manifest revision="%d" path="%s">\n'
% (ctx.rev(), _u(path)))
@@ -155,7 +166,7 @@
"""diff repository (or selected files)"""
change = opts.pop('change', None)
if change: # add -c option for Mercurial<1.1
- base = repo.changectx(change).parents()[0].rev()
+ base = _changectx(repo, change).parents()[0].rev()
opts['rev'] = [str(base), change]
opts['nodates'] = True
return commands.diff(ui, repo, *map(urllib.unquote_plus, pats), **opts)
Updated by Go MAEDA over 7 years ago
- Target version set to Candidate for next minor release
Marc Schlaich, thank you for posting the patch. I will test with the latest version of Mercurial.
Updated by Frédéric Fondement over 7 years ago
Thanks a lot !
Redmine seems back to normal using this patch with HG 4.6 !
Updated by Go MAEDA over 7 years ago
Some tests still fail after applying the patch. Could you look into this?
Updated by Frédéric Fondement over 7 years ago
Indeed, branches are not shown in 4.6
I got branches back with the following change in the patch:
+ def lookup(rev, n):
+ try:
+ return repo.lookup(rev)
+ except RuntimeError:
+ return n
for t, n, r in sorted(iterbranches(), key=lambda e: e[2], reverse=True):
- if repo.lookup(r) in branchheads(t):
+ if lookup(r, n) in branchheads(t):
But I have no idea whether this is correct !
Updated by Go MAEDA over 7 years ago
- File fix-28725.diff fix-28725.diff added
- Subject changed from Mercurial 4.6 to Mercurial 4.6 compatibility
- Target version changed from Candidate for next minor release to 3.3.8
Frédéric Fondement wrote:
Indeed, branches are not shown in 4.6
I got branches back with the following change in the patch:
[...]
Great, the updated patch passed all tests.
Setting target version to 3.3.8.
Updated by Go MAEDA over 7 years ago
- Status changed from New to Resolved
- Assignee set to Go MAEDA
Updated by Go MAEDA over 7 years ago
- Status changed from Resolved to Closed
- Resolution set to Fixed
Committed to the trunk and stable branches.
Thank you all for reporting and fixing this issue.