When Sphinx couldn't decode multibyte filename, now Sphinx notices UnicodeError and continuing if possible instead of raise exception. Closes #703

This commit is contained in:
Takayuki Shimizukawa 2013-09-28 12:51:20 +00:00
parent 445bb5daec
commit 58be2f19b3
6 changed files with 41 additions and 8 deletions

View File

@ -18,6 +18,8 @@ Bugs fixed
named target. named target.
* A wrong conditoin check break search feature on first page that is usually * A wrong conditoin check break search feature on first page that is usually
index.rst. This issue was introduced at 1.2b1 index.rst. This issue was introduced at 1.2b1
* #703: When Sphinx couldn't decode multibyte filename, now Sphinx notices
UnicodeError and continuing if possible instead of raise exception.
Release 1.2 beta2 (released Sep 17, 2013) Release 1.2 beta2 (released Sep 17, 2013)

View File

@ -22,7 +22,7 @@ from sphinx.errors import SphinxError
from sphinx.application import Sphinx from sphinx.application import Sphinx
from sphinx.util import Tee, format_exception_cut_frames, save_traceback from sphinx.util import Tee, format_exception_cut_frames, save_traceback
from sphinx.util.console import red, nocolor, color_terminal from sphinx.util.console import red, nocolor, color_terminal
from sphinx.util.osutil import abspath from sphinx.util.osutil import abspath, fs_encoding
from sphinx.util.pycompat import terminal_safe, bytes from sphinx.util.pycompat import terminal_safe, bytes
@ -112,6 +112,11 @@ def main(argv):
except IndexError: except IndexError:
usage(argv, 'Error: Insufficient arguments.') usage(argv, 'Error: Insufficient arguments.')
return 1 return 1
except UnicodeError:
print >>sys.stderr, (
'Error: Multibyte filename did not support on this filesystem '
'encoding: %s' % fs_encoding)
return 1
filenames = args[2:] filenames = args[2:]
err = 0 err = 0

View File

@ -77,7 +77,14 @@ def walk(top, topdown=True, followlinks=False):
dirs, nondirs = [], [] dirs, nondirs = [], []
for name in names: for name in names:
if path.isdir(path.join(top, name)): try:
fullpath = path.join(top, name)
except UnicodeError:
print >>sys.stderr, (
'%s:: ERROR: multibyte filename did not support on this filesystem '
'encoding %r, skipped.' % (name, fs_encoding))
continue
if path.isdir(fullpath):
dirs.append(name) dirs.append(name)
else: else:
nondirs.append(name) nondirs.append(name)

View File

@ -9,7 +9,7 @@
:license: BSD, see LICENSE for details. :license: BSD, see LICENSE for details.
""" """
from util import with_app, test_root, path from util import with_app, test_root, path, SkipTest
from textwrap import dedent from textwrap import dedent
@ -76,7 +76,14 @@ def test_pseudoxml(app):
def test_multibyte_path(app): def test_multibyte_path(app):
srcdir = path(app.srcdir) srcdir = path(app.srcdir)
mb_name = u'\u65e5\u672c\u8a9e' mb_name = u'\u65e5\u672c\u8a9e'
(srcdir / mb_name).makedirs() try:
(srcdir / mb_name).makedirs()
except UnicodeEncodeError:
from path import FILESYSTEMENCODING
raise SkipTest(
'multibyte filename did not support on this filesystem encoding: '
'%s', FILESYSTEMENCODING)
(srcdir / mb_name / (mb_name + '.txt')).write_text(dedent(""" (srcdir / mb_name / (mb_name + '.txt')).write_text(dedent("""
multi byte file name page multi byte file name page
========================== ==========================

View File

@ -14,7 +14,7 @@ import time
from StringIO import StringIO from StringIO import StringIO
import tempfile import tempfile
from util import raises, with_tempdir, with_app from util import raises, with_tempdir, with_app, SkipTest
from sphinx import application from sphinx import application
from sphinx import quickstart as qs from sphinx import quickstart as qs
@ -114,7 +114,12 @@ def test_do_prompt_with_multibyte():
'Q1': u'\u30c9\u30a4\u30c4', 'Q1': u'\u30c9\u30a4\u30c4',
} }
qs.term_input = mock_raw_input(answers) qs.term_input = mock_raw_input(answers)
qs.do_prompt(d, 'k1', 'Q1', default=u'\u65e5\u672c') try:
qs.do_prompt(d, 'k1', 'Q1', default=u'\u65e5\u672c')
except UnicodeEncodeError:
raise SkipTest(
'multibyte console input did not support on this encoding: %s',
qs.TERM_ENCODING)
assert d['k1'] == u'\u30c9\u30a4\u30c4' assert d['k1'] == u'\u30c9\u30a4\u30c4'

View File

@ -15,7 +15,7 @@ import subprocess
from functools import wraps from functools import wraps
import tempfile import tempfile
from util import with_tempdir, test_roots from util import with_tempdir, test_roots, SkipTest
from path import path from path import path
from textwrap import dedent from textwrap import dedent
@ -62,7 +62,14 @@ def test_build_sphinx(pkgroot, proc):
def test_build_sphinx_with_multibyte_path(pkgroot, proc): def test_build_sphinx_with_multibyte_path(pkgroot, proc):
mb_name = u'\u65e5\u672c\u8a9e' mb_name = u'\u65e5\u672c\u8a9e'
srcdir = (pkgroot / 'doc') srcdir = (pkgroot / 'doc')
(srcdir / mb_name).makedirs() try:
(srcdir / mb_name).makedirs()
except UnicodeEncodeError:
from path import FILESYSTEMENCODING
raise SkipTest(
'multibyte filename did not support on this filesystem encoding: '
'%s', FILESYSTEMENCODING)
(srcdir / mb_name / (mb_name + '.txt')).write_text(dedent(""" (srcdir / mb_name / (mb_name + '.txt')).write_text(dedent("""
multi byte file name page multi byte file name page
========================== ==========================