I have RhodeCode Community Edition, version 5.13.0 (just updated).
I would like to strip the last commit from a hg repository, as I have done in the past multiple times with the legacy 4.x branch. But now an error is shown:
{
"timestamp": "2026-08-07T11:20:47.224292+00:00",
"levelname": "ERROR",
"name": "rhodecode.config.middleware",
"message": "error occurred handling this request for path: /[REDACTED_REPOSITORY]/settings/strip_check,\n++ TRACEBACK ++\n\nTraceback (most recent call last):\nFile \"/home/rhodecode/venv/lib/python3.11/site-packages/pyramid/tweens.py\", line 41, in excview_tween\nresponse = handler(request)\nFile \"/home/rhodecode/venv/lib/python3.11/site-packages/pyramid/router.py\", line 142, in handle_request\nresponse = _call_view(\nFile \"/home/rhodecode/venv/lib/python3.11/site-packages/pyramid/view.py\", line 674, in _call_view\nresponse = view_callable(context, request)\nFile \"/home/rhodecode/venv/lib/python3.11/site-packages/pyramid/config/views.py\", line 169, in attr_view\nreturn view(context, request)\nFile \"/home/rhodecode/venv/lib/python3.11/site-packages/pyramid/config/views.py\", line 195, in predicate_wrapper\nreturn view(context, request)\nFile \"/home/rhodecode/venv/lib/python3.11/site-packages/pyramid/viewderivers.py\", line 437, in rendered_view\nresult = view(context, request)\nFile \"/home/rhodecode/venv/lib/python3.11/site-packages/pyramid/viewderivers.py\", line 129, in _class_view\nresponse = getattr(inst, attr)()\nFile \"/home/rhodecode/venv/lib/python3.11/site-packages/rhodecode/lib/auth.py\", line 2515, in local_wrapper\nreturn wrapper(func, *args, **kwds)\nFile \"/home/rhodecode/venv/lib/python3.11/site-packages/rhodecode/lib/auth.py\", line 1851, in __wrapper\nreturn func(*fargs, **fkwargs)\nFile \"/home/rhodecode/venv/lib/python3.11/site-packages/rhodecode/lib/auth.py\", line 2515, in local_wrapper\nreturn wrapper(func, *args, **kwds)\nFile \"/home/rhodecode/venv/lib/python3.11/site-packages/rhodecode/lib/auth.py\", line 1925, in __wrapper\nreturn func(*fargs, **fkwargs)\nFile \"/home/rhodecode/venv/lib/python3.11/site-packages/rhodecode/lib/auth.py\", line 2515, in local_wrapper\nreturn wrapper(func, *args, **kwds)\nFile \"/home/rhodecode/venv/lib/python3.11/site-packages/rhodecode/lib/auth.py\", line 1747, in __wrapper\nreturn func(*fargs, **fkwargs)\nFile \"/home/rhodecode/venv/lib/python3.11/site-packages/rhodecode/apps/repository/views/repo_strip.py\", line 67, in strip_check\n\"branch\": data[i].branch or rp_branch,\nAttributeError: 'MercurialCommit' object has no attribute 'branch'\n\n+++ DETAILS +++\n\nTraceback (most recent call last)\n/home/rhodecode/venv/lib/python3.11/site-packages/pyramid/tweens.py:41 in excview_tween\n\n38\n39 def excview_tween(request):\n40 try:\n❱ 41 response = handler(request)\n42 except Exception as exc:\n43 response = _error_handler(request, exc)\n44 return response\n\nlocals\nexc = AttributeError(\"'MercurialCommit' object has no attribute 'branch'\")\nhandler = <bound method Router.handle_request of <pyramid.router.Router object at 0x7ff5d974b8d0>>\nrequest = <Request at 0x7ff5d1911450 POST https://[REDACTED_HOST]/[REDACTED_REPOSITORY]/settings/strip_check>\n\n/home/rhodecode/venv/lib/python3.11/site-packages/pyramid/router.py:142 in handle_request\n\n139\n140 # find a view callable\n141 context_iface = providedBy(context)\n❱ 142 response = _call_view(\n143 registry, request, context, context_iface, view_name\n144 )\n145\n\nlocals\nadapters = <zope.interface.adapter.AdapterRegistry object at 0x7ff5d763fa90>\nattrs = {\n'environ': {\n'wsgi.errors': <gunicorn.http.wsgi.WSGIErrorsWrapper object at 0x7ff5d425e3e0>,\n'wsgi.version': (1, 0),\n'wsgi.multithread': True,\n'wsgi.multiprocess': True,\n'wsgi.run_once': False,\n'wsgi.file_wrapper': <class 'gunicorn.http.wsgi.FileWrapper'>,\n'wsgi.input_terminated': True,\n'SERVER_SOFTWARE': 'gunicorn/25.3.0',\n'wsgi.input': <_io.BytesIO object at 0x7ff5d31fc860>,\n'gunicorn.socket': <socket.socket fd=12, family=2, type=1, proto=0, laddr=('172.20.0.5', 10020), raddr=('172.20.0.15',\n42766)>,\n... +46\n},\n'registry': <Registry rhodecode.config>,\n'invoke_subrequest': <bound method Router.invoke_subrequest of <pyramid.router.Router object at 0x7ff5d974b8d0>>,\n'req_wrapper_start': 1786101646.7106504,\n'_charset': 'UTF-8',\n'request_iface': <InterfaceClass pyramid.request.strip_check_IRequest>,\n'_req_id_bucket': [],\n'db_repo': <Repository('691:[REDACTED_REPOSITORY]')>,\n'db_repo_name': '[REDACTED_REPOSITORY]',\n'matchdict': {'repo_name': '[REDACTED_REPOSITORY]'},\n... +17\n}\ncontext = <pyramid.traversal.DefaultRootFactory object at 0x7ff5d1910b10>\ncontext_iface = classImplements(DefaultRootFactory)\ndebug_routematch = False 2026-08-07T13:20:47.224611784+02:00\nhas_listeners = True\ninfo = {\n'match': {'repo_name': '[REDACTED_REPOSITORY]'},\n'route': <pyramid.urldispatch.Route object at 0x7ff5d3b9ca10>\n}\nlogger = <Logger rhodecode.config (DEBUG)>\nmatch = {'repo_name': '[REDACTED_REPOSITORY]'}\nnotify = <bound method Registry.notify of <Registry rhodecode.config>>\nregistry = <Registry rhodecode.config>\nrequest = <Request at 0x7ff5d1911450 POST https://[REDACTED_HOST]/[REDACTED_REPOSITORY]/settings/strip_check>\nroot = <pyramid.traversal.DefaultRootFactory object at 0x7ff5d1910b10>\nroute = <pyramid.urldispatch.Route object at 0x7ff5d3b9ca10>\nroutes_mapper = <pyramid.urldispatch.RoutesMapper object at 0x7ff5d6bfa110>\nself = <pyramid.router.Router object at 0x7ff5d974b8d0>\nsubpath = ()\ntdict = {\n'context': <pyramid.traversal.DefaultRootFactory object at 0x7ff5d1910b10>,\n'view_name': '',\n'subpath': (),\n'traversed': (),\n'virtual_root': <pyramid.traversal.DefaultRootFactory object at 0x7ff5d1910b10>,\n'virtual_root_path': (),\n'root': <pyramid.traversal.DefaultRootFactory object at 0x7ff5d1910b10>\n}\ntraversed = ()\ntraverser = <pyramid.traversal.ResourceTreeTraverser object at 0x7ff5d19138d0>\nview_name = ''\nvroot = <pyramid.traversal.DefaultRootFactory object at 0x7ff5d1910b10>\nvroot_path = ()\n\n/home/rhodecode/venv/lib/python3.11/site-packages/pyramid/view.py:674 in _call_view\n\n671 # if this view is secured, it will raise a Forbidden\n672 # appropriately if the executing user does not have the proper\n673 # permission\n❱ 674 response = view_callable(context, request)\n675 return response\n676 except PredicateMismatch as _pme:\n677 pme = _pme\n\nlocals\ncontext = <pyramid.traversal.DefaultRootFactory object at 0x7ff5d1910b10>\ncontext_iface = classImplements(DefaultRootFactory)\npme = None\nregistry = <Registry rhodecode.config>\nrequest = <Request at 0x7ff5d1911450 POST https://[REDACTED_HOST]/[REDACTED_REPOSITORY]/settings/strip_check>\nrequest_iface = <InterfaceClass pyramid.request.strip_check_IRequest>\nresponse = None\nsecure = True\nview_callables = [<function attr_wrapped_view.<locals>.attr_view at 0x7ff5d3b9aa20>]\nview_classifier = None\nview_name = ''\nview_types = None\n\n/home/rhodecode/venv/lib/python3.11/site-packages/pyramid/config/views.py:169 in attr_view\n\n166 return view # defaults\n167\n168 def attr_view(context, request):\n❱ 169 return view(context, request)\n170\n171 attr_view.__accept__ = accept\n172 attr_view.__order__ = order\n\nlocals\ncontext = <pyramid.traversal.DefaultRootFactory object at 0x7ff5d1910b10>\nrequest = <Request at 0x7ff5d1911450 POST https://[REDACTED_HOST]/[REDACTED_REPOSITORY]/settings/strip_check>\n26-08-07T13:20:47.224611784+02:00 00\n\n/home/rhodecode/venv/lib/python3.11/site-packages/pyramid/config/views.py:195 in predicate_wrapper\n\n192 'predicate mismatch for view %s (%s)'\n193 % (view_name, predicate.text())\n194 )\n❱ 195 return view(context, request)\n196\n197 def checker(context, request):\n198 return all(predicate(context, request) for predicate in preds)\n\nlocals\ncontext = <pyramid.traversal.DefaultRootFactory object at 0x7ff5d1910b10>\npredicate = <pyramid.predicates.RequestMethodPredicate object at 0x7ff5d3d90310>\npreds = [<pyramid.predicates.XHRPredicate object at 0x7ff5d3d80790>, <pyramid.predicates.RequestMethodPredicate object at 0x7ff5d3d90310>]\nrequest = <Request at 0x7ff5d1911450 POST https://[REDACTED_HOST]/[REDACTED_REPOSITORY]/settings/strip_check>\n\n/home/rhodecode/venv/lib/python3.11/site-packages/pyramid/viewderivers.py:437 in rendered_view\n\n434 return view\n435\n436 def rendered_view(context, request):\n❱ 437 result = view(context, request)\n438 if result.__class__ is Response: # potential common case\n439 response = result\n440 else:\n\nlocals\ncontext = <pyramid.traversal.DefaultRootFactory object at 0x7ff5d1910b10>\ninfo = <pyramid.config.views.ViewDeriverInfo object at 0x7ff5d3b9d590>\nrenderer = <pyramid.renderers.RendererHelper object at 0x7ff5d402ead0>\nrequest = <Request at 0x7ff5d1911450 POST https://[REDACTED_HOST]/[REDACTED_REPOSITORY]/settings/strip_check>\n\n/home/rhodecode/venv/lib/python3.11/site-packages/pyramid/viewderivers.py:129 in _class_view\n\n126 if attr is None:\n127 response = inst()\n128 else:\n❱ 129 response = getattr(inst, attr)()\n130 return response\n131\n132 return _class_view\n\nlocals\nattr = 'strip_check'\ncontext = <pyramid.traversal.DefaultRootFactory object at 0x7ff5d1910b10>\ninst = <rhodecode.apps.repository.views.repo_strip.RepoStripView object at 0x7ff5d22cadd0>\nrequest = <Request at 0x7ff5d1911450 POST https://[REDACTED_HOST]/[REDACTED_REPOSITORY]/settings/strip_check>\n\n/home/rhodecode/venv/lib/python3.11/site-packages/rhodecode/lib/auth.py:2515 in local_wrapper\n\n2512\n2513 @wraps(func)\n2514 def local_wrapper(*args, **kwds):\n❱ 2515 return wrapper(func, *args, **kwds)\n2516\n2517 local_wrapper.__wrapped__ = func\n2518 return local_wrapper\n\nlocals\nargs = (<rhodecode.apps.repository.views.repo_strip.RepoStripView object at 0x7ff5d22cadd0>,)\n2026-08-07T13:20:47.224611784+02:00 kwds = {}\nwrapper = <bound method LoginRequired.__wrapper of <rhodecode.lib.auth.LoginRequired object at 0x7ff5d4302b50>>\n\n/home/rhodecode/venv/lib/python3.11/site-packages/rhodecode/lib/auth.py:1851 in __wrapper\n\n1848 if ip_access_valid and (user.is_authenticated or auth_token_access_valid):\n1849 log.info(\"user %s authenticating with:%s IS authenticated on func %s\", user,\n1850\n❱ 1851 return func(*fargs, **fkwargs)\n1852 else:\n1853 log.warning(\n1854 \"user %s authenticating with:%s NOT authenticated on func: %s: IP_ACCESS\n\nlocals\n_ = <bound method RealRequest.translate of <Request at 0x7ff5d1911450 POST\nhttps://[REDACTED_HOST]/[REDACTED_REPOSITORY]/settings/strip_check>>\n_auth_token = None\nauth_token_access_valid = False\ncls = <rhodecode.apps.repository.views.repo_strip.RepoStripView object at 0x7ff5d22cadd0>\nfargs = (<rhodecode.apps.repository.views.repo_strip.RepoStripView object at 0x7ff5d22cadd0>,)\nfkwargs = {}\nh = <module 'rhodecode.lib.helpers' from '/home/rhodecode/venv/lib/python3.11/site-packages/rhodecode/lib/helpers.py'>\nip_access_valid = True\nloc = 'RepoStripView:strip_check'\nreason = 'RHODECODE_AUTH'\nrequest = <Request at 0x7ff5d1911450 POST\nhttps://[REDACTED_HOST]/[REDACTED_REPOSITORY]/settings/strip_check>\nself = <rhodecode.lib.auth.LoginRequired object at 0x7ff5d4302b50>\nuser = <AuthUser('id:3[[REDACTED_USERNAME]] ip:172.18.0.19 auth:True')>\nwhitelist = None\n\n/home/rhodecode/venv/lib/python3.11/site-packages/rhodecode/lib/auth.py:2515 in local_wrapper\n\n2512\n2513 @wraps(func)\n2514 def local_wrapper(*args, **kwds):\n❱ 2515 return wrapper(func, *args, **kwds)\n2516\n2517 local_wrapper.__wrapped__ = func\n2518 return local_wrapper\n\nlocals\nargs = (<rhodecode.apps.repository.views.repo_strip.RepoStripView object at 0x7ff5d22cadd0>,)\nkwds = {}\nwrapper = <bound method PermsDecorator.__wrapper of <rhodecode.lib.auth.HasRepoPermissionAnyDecorator object at 0x7ff5d4302b90>>\n\n/home/rhodecode/venv/lib/python3.11/site-packages/rhodecode/lib/auth.py:1925 in __wrapper\n\n1922\n1923 if self.check_permissions(_user):\n1924 log.debug(\"Permission granted for %s %s\", cls, _user)\n❱ 1925 return func(*fargs, **fkwargs)\n1926\n1927 else:\n1928 log.debug(\"Permission denied for %s %s\", cls, _user)\n\nlocals\n_ = <bound method RealRequest.translate of <Request at 0x7ff5d1911450 POST\nhttps://[REDACTED_HOST]/[REDACTED_REPOSITORY]/settings/strip_check>>\n_user = <AuthUser('id:3[[REDACTED_USERNAME]] ip:172.18.0.19 auth:True')>\ncls = <rhodecode.apps.repository.views.repo_strip.RepoStripView object at 0x7ff5d22cadd0>\nfargs = (<rhodecode.apps.repository.views.repo_strip.RepoStripView object at 0x7ff5d22cadd0>,)\nfkwargs = {}\nrequest = <Request at 0x7ff5d1911450 POST https://[REDACTED_HOST]/[REDACTED_REPOSITORY]/settings/strip_check>\nself = <rhodecode.lib.auth.HasRepoPermissionAnyDecorator object at 0x7ff5d4302b90>\n26-08-07T13:20:47.224611784+02:00 00\n\n/home/rhodecode/venv/lib/python3.11/site-packages/rhodecode/lib/auth.py:2515 in local_wrapper\n\n2512\n2513 @wraps(func)\n2514 def local_wrapper(*args, **kwds):\n❱ 2515 return wrapper(func, *args, **kwds)\n2516\n2517 local_wrapper.__wrapped__ = func\n2518 return local_wrapper\n\nlocals\nargs = (<rhodecode.apps.repository.views.repo_strip.RepoStripView object at 0x7ff5d22cadd0>,)\nkwds = {}\nwrapper = <bound method CSRFRequired.__wrapper of <rhodecode.lib.auth.CSRFRequired object at 0x7ff5d4302bd0>>\n\n/home/rhodecode/venv/lib/python3.11/site-packages/rhodecode/lib/auth.py:1747 in __wrapper\n\n1744 if self.check_csrf(request, cur_token):\n1745 if request.POST.get(self.token):\n1746 del request.POST[self.token]\n❱ 1747 return func(*fargs, **fkwargs)\n1748 else:\n1749 reason = \"token-missing\"\n1750 supplied_token = self._get_csrf(request)\n\nlocals\ncls = <rhodecode.apps.repository.views.repo_strip.RepoStripView object at 0x7ff5d22cadd0>\ncur_token = '4058d59ac572c6f192ad47ea8f59ebc7d5feeca3'\nfargs = (<rhodecode.apps.repository.views.repo_strip.RepoStripView object at 0x7ff5d22cadd0>,)\nfkwargs = {}\nrequest = <Request at 0x7ff5d1911450 POST https://[REDACTED_HOST]/[REDACTED_REPOSITORY]/settings/strip_check>\nself = <rhodecode.lib.auth.CSRFRequired object at 0x7ff5d4302bd0>\n\n/home/rhodecode/venv/lib/python3.11/site-packages/rhodecode/apps/repository/views/repo_strip.py:67 in strip_check\n\n64 rp_branch = rp.get(changeset_id_branch_key)\n65 data[i] = {\n66 \"rev\": data[i].raw_id,\n❱ 67 \"branch\": data[i].branch or rp_branch,\n68 \"author\": h.escape(data[i].author),\n69 \"comment\": h.escape(data[i].message),\n70 }\n\nlocals\nchangeset_id_branch_key = 'changeset_id_branch-1'\nchangeset_id_key = 'changeset_id-1'\ncheck = 'a31436d6dd60ecaffcb892d90167402e826ea018'\ndata = {1: <MercurialCommit at 22:a31436d6dd60>}\ni = 1\nrp = MultiDict([('changeset_id-1', 'a31436d6dd60ecaffcb892d90167402e826ea018')])\nrp_branch = None\nself = <rhodecode.apps.repository.views.repo_strip.RepoStripView object at 0x7ff5d22cadd0>\n\nAttributeError: 'MercurialCommit' object has no attribute 'branch'\n",
"req_id": "8be71bae-aa12-4731-9bea-0153cb3c32fa"
}
I have managed to strip the commit with hg from a bash console. But it would be nice to be able to have this feature working again.
Thank you for your support