4716: Unicode not support in filenames for Mercurial

Misery

What version are you running?

3.0.7

What's the URL of the page containing the problem?

https://reviewboard/r/15845/diff/1/

What steps will reproduce the problem?

  1. Create a patch of a file with a filename that contains an ü ö ä
  2. Look into /diff/1
  3. Reviewboard will send an error 500 as mail

What is the expected output? What do you see instead?

The correct diff

What operating system are you using? What browser?

Linux

Please provide any additional information below.

Filename contains an ü and cannot be fetched with http (HgWebClient). Maybe it needs to be URL encoded?

xades/06_Certipost_B_QCP_cert_gr\xfcn_math_rot.xades
xades/06_Certipost_B_QCP_cert_grün_math_rot.xades

Traceback (most recent call last):

File "/opt/reviewboard/dist/lib/python2.7/site-packages/django/core/handlers/base.py", line 112, in get_response
response = wrapped_callback(request, callback_args, *callback_kwargs)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/django/views/decorators/cache.py", line 52, in _wrapped_view_func
response = view_func(request, args, *kwargs)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/django/views/decorators/vary.py", line 19, in inner_func
response = func(args, *kwargs)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/djblets/webapi/resources/base.py", line 243, in call
request, method, view, api_format=api_format, args, *kwargs)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/reviewboard/webapi/base.py", line 338, in call_method_view
request, method, view, args, *kwargs)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/djblets/webapi/resources/mixins/api_tokens.py", line 66, in call_method_view
request, method, view, args, *kwargs)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/djblets/webapi/resources/mixins/oauth2_tokens.py", line 102, in call_method_view
request, method, view, args, *kwargs)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/djblets/webapi/resources/base.py", line 368, in call_method_view
return view(request, args, *kwargs)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/djblets/webapi/decorators.py", line 125, in _call
return view_func(args, *kwargs)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/reviewboard/webapi/decorators.py", line 39, in _check
return view_func(args, *kwargs)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/djblets/webapi/decorators.py", line 125, in _call
return view_func(args, *kwargs)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/reviewboard/webapi/decorators.py", line 169, in _check
return view_func(args, *kwargs)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/reviewboard/webapi/resources/filediff.py", line 389, in get
return self._get_diff_data(request, mimetype, args, *kwargs)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/reviewboard/webapi/resources/filediff.py", line 457, in _get_diff_data
populate_diff_chunks(files, highlighting, request=request)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/reviewboard/diffviewer/diffutils.py", line 785, in populate_diff_chunks
chunks = list(generator.get_chunks())

File "/opt/reviewboard/dist/lib/python2.7/site-packages/reviewboard/diffviewer/chunk_generator.py", line 786, in get_chunks
for chunk in super(DiffChunkGenerator, self).get_chunks(cache_key):

File "/opt/reviewboard/dist/lib/python2.7/site-packages/reviewboard/diffviewer/chunk_generator.py", line 107, in get_chunks
large_data=True)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/djblets/cache/backend.py", line 299, in cache_memoize
compress_large_data))

File "/opt/reviewboard/dist/lib/python2.7/site-packages/djblets/cache/backend.py", line 253, in cache_memoize_iter
items = items_or_callable()

File "/opt/reviewboard/dist/lib/python2.7/site-packages/djblets/cache/backend.py", line 296, in <lambda>
lambda: [lookup_callable()],

File "/opt/reviewboard/dist/lib/python2.7/site-packages/reviewboard/diffviewer/chunk_generator.py", line 106, in <lambda>
lambda: list(self.get_chunks_uncached()),

File "/opt/reviewboard/dist/lib/python2.7/site-packages/reviewboard/diffviewer/chunk_generator.py", line 792, in get_chunks_uncached
self.encoding_list)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/reviewboard/diffviewer/diffutils.py", line 274, in get_original_file
request=request)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/reviewboard/scmtools/models.py", line 404, in get_file
large_data=True)[0]

File "/opt/reviewboard/dist/lib/python2.7/site-packages/djblets/cache/backend.py", line 299, in cache_memoize
compress_large_data))

File "/opt/reviewboard/dist/lib/python2.7/site-packages/djblets/cache/backend.py", line 253, in cache_memoize_iter
items = items_or_callable()

File "/opt/reviewboard/dist/lib/python2.7/site-packages/djblets/cache/backend.py", line 296, in <lambda>
lambda: [lookup_callable()],

File "/opt/reviewboard/dist/lib/python2.7/site-packages/reviewboard/scmtools/models.py", line 403, in <lambda>
request)],

File "/opt/reviewboard/dist/lib/python2.7/site-packages/reviewboard/scmtools/models.py", line 597, in _get_file_uncached
base_commit_id=base_commit_id)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/reviewboard/scmtools/hg.py", line 48, in get_file
base_commit_id=base_commit_id)

File "/opt/reviewboard/dist/lib/python2.7/site-packages/reviewboard/scmtools/hg.py", line 289, in cat_file
raise FileNotFoundError(path, rev)

FileNotFoundError: The file "xades/06_Certipost_B_QCP_cert_gr\xfcn_math_rot.xades" (revision 3da64b8725201d3efaf6b3016959d5c4de57436f) could not be found in the repository

<WSGIRequest
path:/api/review-requests/15845/diffs/1/files/282432/,
GET:<QueryDict: {}>,
POST:<QueryDict: {}>,
COOKIES:{'rbsessionid': '433gy5ytw60b8dsdzx2bp4hl19tkcojn'},
META:{'CONTENT_LENGTH': '0',
'CONTENT_TYPE': '',
'DOCUMENT_ROOT': '/var/lib/nginx/html',
'HTTPS': 'on',
'HTTP_ACCEPT': 'application/vnd.reviewboard.org.diff.data+json',
'HTTP_ACCEPT_ENCODING': 'identity',
'HTTP_CONNECTION': 'close',
'HTTP_CONTENT_LENGTH': '0',
'HTTP_COOKIE': 'rbsessionid=x',
'HTTP_HOST': 'reviewboard',
'HTTP_USER_AGENT': 'RBTools/0.7.11',
u'LOCAL_SITE': None,
'PATH_INFO': u'/api/review-requests/15845/diffs/1/files/282432/',
'QUERY_STRING': '',
'REMOTE_ADDR': '10.211.1.85',
'REMOTE_PORT': '38301',
'REQUEST_METHOD': 'GET',
'REQUEST_SCHEME': 'https',
'REQUEST_URI': '/api/review-requests/15845/diffs/1/files/282432/',
u'SCRIPT_NAME': u'',
'SERVER_NAME': 'rb',
'SERVER_PORT': '443',
'SERVER_PROTOCOL': 'HTTP/1.1',
u'USERNAME': u'Bot',
u'USER_EMAIL': u'bot@XYZ',
'uwsgi.node': 'vpi-rb',
'uwsgi.version': '2.0.17',
'wsgi.errors': <open file 'wsgi_errors', mode 'w' at 0x7f82dbeb61e0>,
'wsgi.file_wrapper': <built-in function uwsgi_sendfile>,
'wsgi.input': <uwsgi._Input object at 0x7f82d6cb0408>,
'wsgi.multiprocess': True,
'wsgi.multithread': False,
'wsgi.run_once': False,
'wsgi.url_scheme': u'https',
'wsgi.version': (1, 0)}>