Takayuki Shimizukawa avatar Takayuki Shimizukawa committed 95a2a34

Fix again: NFC/NFD normalizing problem. Closes #1142

Comments (0)

Files changed (9)

sphinx/cmdline.py

 from sphinx.application import Sphinx
 from sphinx.util import Tee, format_exception_cut_frames, save_traceback
 from sphinx.util.console import red, nocolor, color_terminal
-from sphinx.util.osutil import fs_encoding
+from sphinx.util.osutil import abspath
 from sphinx.util.pycompat import terminal_safe, bytes
 
 
-def abspath(pathdir):
-    pathdir = path.abspath(pathdir)
-    if isinstance(pathdir, bytes):
-        pathdir = pathdir.decode(fs_encoding)
-    return pathdir
-
-
 def usage(argv, msg=None):
     if msg:
         print >>sys.stderr, msg

sphinx/setup_command.py

 
 from sphinx.application import Sphinx
 from sphinx.util.console import darkred, nocolor, color_terminal
+from sphinx.util.osutil import abspath
 
 
 class BuildDoc(Command):
         self.ensure_dirname('source_dir')
         if self.source_dir is None:
             self.source_dir = os.curdir
-        self.source_dir = os.path.abspath(self.source_dir)
+        self.source_dir = abspath(self.source_dir)
         if self.config_dir is None:
             self.config_dir = self.source_dir
+        self.config_dir = abspath(self.config_dir)
 
         if self.build_dir is None:
             build = self.get_finalized_command('build')
-            self.build_dir = os.path.join(build.build_base, 'sphinx')
+            self.build_dir = os.path.join(abspath(build.build_base), 'sphinx')
             self.mkpath(self.build_dir)
+        self.build_dir = abspath(self.build_dir)
         self.doctree_dir = os.path.join(self.build_dir, 'doctrees')
         self.mkpath(self.doctree_dir)
         self.builder_target_dir = os.path.join(self.build_dir, self.builder)

sphinx/util/__init__.py

 def path_stabilize(filepath):
     "normalize path separater and unicode string"
     newpath = filepath.replace(os.path.sep, SEP)
-    newpath = unicodedata.normalize('NFC', newpath)
+    if isinstance(newpath, unicode):
+        newpath = unicodedata.normalize('NFC', newpath)
     return newpath
 
 

sphinx/util/osutil.py

 
 
 fs_encoding = sys.getfilesystemencoding() or sys.getdefaultencoding()
+
+
+if sys.version_info < (3, 0):
+    bytes = str
+else:
+    bytes = bytes
+
+
+def abspath(pathdir):
+    pathdir = path.abspath(pathdir)
+    if isinstance(pathdir, bytes):
+        pathdir = pathdir.decode(fs_encoding)
+    return pathdir

tests/roots/test-setup/doc/conf.py

+# -*- coding: utf-8 -*-
+
+project = 'Sphinx smallest project'
+source_suffix = '.txt'
+keep_warnings = True

tests/roots/test-setup/doc/contents.txt

+contents
+=========
+
+spam egg ham
+

tests/roots/test-setup/setup.cfg

+[build_sphinx]
+project = 'My project'
+version = 1.2
+release = 1.2.0
+source-dir = doc

tests/roots/test-setup/setup.py

+from distutils.core import setup
+from sphinx.setup_command import BuildDoc
+
+cmdclass = {'build_sphinx': BuildDoc}
+
+setup(
+    name='sphinxdoc',
+    cmdclass=cmdclass,
+)

tests/test_setup_command.py

+# -*- coding: utf-8 -*-
+"""
+    test_setup_command
+    ~~~~~~~~~~~~~~~~~~~
+
+    Test setup_command for distutils.
+
+    :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import os
+import sys
+import subprocess
+from functools import wraps
+import tempfile
+
+from util import with_tempdir, test_roots
+from path import path
+from textwrap import dedent
+
+root = test_roots / 'test-setup'
+
+
+def with_setup_command(root, *args, **kwds):
+    """
+    Run `setup.py build_sphinx` with args and kwargs,
+    pass it to the test and clean up properly.
+    """
+    def generator(func):
+        @wraps(func)
+        def deco(*args2, **kwargs2):
+            tempdir = path(tempfile.mkdtemp())
+            pkgrootdir = (tempdir / 'root')
+            root.copytree(pkgrootdir)
+            cwd = os.getcwd()
+            os.chdir(pkgrootdir)
+            command = [sys.executable, 'setup.py', 'build_sphinx']
+            command.extend(args)
+            try:
+                proc = subprocess.Popen(
+                    command,
+                    stdout=subprocess.PIPE,
+                    stderr=subprocess.PIPE)
+                func(pkgrootdir, proc, *args, **kwds)
+            finally:
+                tempdir.rmtree()
+                os.chdir(cwd)
+        return deco
+    return generator
+
+
+@with_setup_command(root)
+def test_build_sphinx(pkgroot, proc):
+    out, err = proc.communicate()
+    print(out)
+    print(err)
+    assert proc.returncode == 0
+
+
+@with_setup_command(root)
+def test_build_sphinx_with_multibyte_path(pkgroot, proc):
+    mb_name = u'\u65e5\u672c\u8a9e'
+    srcdir = (pkgroot / 'doc')
+    (srcdir / mb_name).makedirs()
+    (srcdir / mb_name / (mb_name + '.txt')).write_text(dedent("""
+        multi byte file name page
+        ==========================
+        """))
+
+    master_doc = srcdir / 'contents.txt'
+    master_doc.write_bytes((master_doc.text() + dedent("""
+            .. toctree::
+
+               %(mb_name)s/%(mb_name)s
+            """ % locals())
+    ).encode('utf-8'))
+
+    out, err = proc.communicate()
+    print(out)
+    print(err)
+    assert proc.returncode == 0
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.