Issue #308: Internal server error when showing full diff for file that contains '{' in its name when using Mercurial repository (conservancy/kallithea)

Branko Majic issues-reply at bitbucket.org
Sat Feb 10 00:11:02 UTC 2018


New issue 308: Internal server error when showing full diff for file that contains '{' in its name when using Mercurial repository
https://bitbucket.org/conservancy/kallithea/issues/308/internal-server-error-when-showing-full

Branko Majic:

When trying to view a full diff for a file that contains '{' in its name, an internal server error will be thrown. This happens with Mercurial repository. Reproduction steps within this issue are provided for the `default` branch (changeset `228dd29e79da` as of this writing), but same issue happens with stable branch/version `0.3.3` as well (with different traceback).

# Reproduction steps #

1. Set-up Kallithea (minimal development environment described in `contributing.rst` should suffice. Below instructions assume the user will be called `admin` for simplicity sake.

2. Log-in into Kallithea and create a new Mercurial repository called `test-diff-filename-with-bracket`.

3. Clone the empty repository:

        cd /tmp/
        hg clone http://admin@localhost:5000/test-diff-filename-with-bracket

4. Add a file to repository that includes curly bracket (`{`) in its name, and push the changes:

        cd /tmp/test-diff-filename-with-bracket
        echo "This is a funny README file." > 'README{'
        hg add 'README{'
        hg commit -m "Added a funny README file with bracket"
        hg push

5. Log-in into Kallithea and open [the repository page](http://localhost:5000/test-diff-filename-with-bracket).

6. Click on the top revision in the list of latest changes.

7. Click on the **Show full diff for this file** link right next to the `README{` filename (icon should resemble a paper sheet with `<>` symbols in it).

# Expected results #

1. In step **(7)**, a full diff is shown for the file.

# Actual results #

1. In step **(7)**, an internal server error is thrown with the following traceback:

        2018-02-10 01:05:42.099 DEBUG [backlash] Traceback (most recent call last):
          File "/home/user/.virtualenvs/kallithea/lib/python2.7/site-packages/tg/appwrappers/session.py", line 71, in __call__
            response = self.next_handler(controller, environ, context)
          File "/home/user/.virtualenvs/kallithea/lib/python2.7/site-packages/tg/appwrappers/i18n.py", line 71, in __call__
            return self.next_handler(controller, environ, context)
          File "/home/user/.virtualenvs/kallithea/lib/python2.7/site-packages/tg/wsgiapp.py", line 285, in _dispatch
            return controller(environ, context)
          File "/home/user/projects/kallithea/kallithea/lib/base.py", line 553, in __call__
            return super(BaseController, self).__call__(environ, context)
          File "/home/user/.virtualenvs/kallithea/lib/python2.7/site-packages/tg/controllers/dispatcher.py", line 119, in __call__
            response = self._perform_call(context)
          File "/home/user/.virtualenvs/kallithea/lib/python2.7/site-packages/tg/controllers/dispatcher.py", line 108, in _perform_call
            r = self._call(action, params, remainder=remainder, context=context)
          File "/home/user/.virtualenvs/kallithea/lib/python2.7/site-packages/tg/controllers/decoratedcontroller.py", line 119, in _call
            output = controller_caller(context_config, bound_controller_callable, remainder, params)
          File "/home/user/.virtualenvs/kallithea/lib/python2.7/site-packages/tg/decorators.py", line 44, in _decorated_controller_caller
            return application_controller_caller(tg_config, controller, remainder, params)
          File "/home/user/.virtualenvs/kallithea/lib/python2.7/site-packages/tg/configuration/app_config.py", line 127, in call_controller
            return controller(*remainder, **params)
          File "<decorator-gen-88>", line 2, in diff
            
          File "/home/user/projects/kallithea/kallithea/lib/auth.py", line 810, in __wrapper
            return func(*fargs, **fkwargs)
          File "<decorator-gen-87>", line 2, in diff
            
          File "/home/user/projects/kallithea/kallithea/lib/auth.py", line 860, in __wrapper
            return func(*fargs, **fkwargs)
          File "/home/user/projects/kallithea/kallithea/controllers/files.py", line 682, in diff
            enable_comments=False)
          File "/home/user/projects/kallithea/kallithea/lib/diffs.py", line 202, in wrapped_diff
            context=line_context)
          File "/home/user/projects/kallithea/kallithea/lib/diffs.py", line 252, in get_gitdiff
            ignore_whitespace, context)
          File "/home/user/projects/kallithea/kallithea/lib/diffs.py", line 262, in get_diff
            ignore_whitespace=ignore_whitespace, context=context)
          File "/home/user/projects/kallithea/kallithea/lib/vcs/backends/hg/repository.py", line 260, in get_diff
            file_filter = match(self.path, '', [path])
          File "/home/user/.virtualenvs/kallithea/lib/python2.7/site-packages/mercurial/match.py", line 158, in match
            listsubrepos=listsubrepos, badfn=badfn)
          File "/home/user/.virtualenvs/kallithea/lib/python2.7/site-packages/mercurial/match.py", line 385, in __init__
            root)
          File "/home/user/.virtualenvs/kallithea/lib/python2.7/site-packages/mercurial/match.py", line 838, in _buildmatch
            regex, mf = _buildregexmatch(kindpats, globsuffix)
          File "/home/user/.virtualenvs/kallithea/lib/python2.7/site-packages/mercurial/match.py", line 874, in _buildregexmatch
            raise error.Abort(_("invalid pattern (%s): %s") % (k, p))
        Abort: invalid pattern (glob): README{

# Additional information #

The error occurs in `kallithea.lib.vcs.backends.hg.repository.MercurialRepository.get_diff`, in call `file_filter = match(self.path, '', [path])`.

The `match` function comes from `mercurial.match` module, and treats the passed-in patterns (`[path]`) as extended glob patterns *by default*.

In order to make this call work for paths that include globbing characters, the `path` must be either escaped, or (more easily), the `match` function should be told to treat all provided patterns as plain paths by passing-in additional `default='path'` parameter to it.




More information about the kallithea-general mailing list