Browse Source

extra conf path handling now OS-agnostic

It used to work incorrectly on Windows.

Fixes #490.
Strahinja Val Markovic 11 years ago
parent
commit
a077f85ecd
2 changed files with 55 additions and 5 deletions
  1. 15 5
      python/ycm/extra_conf_store.py
  2. 40 0
      python/ycm/tests/extra_conf_store_test.py

+ 15 - 5
python/ycm/extra_conf_store.py

@@ -152,14 +152,24 @@ def _ExtraConfModuleSourceFilesForFile( filename ):
 
 def _PathsToAllParentFolders( filename ):
   """Build a list of all parent folders of a file.
-  The neares files will be returned first.
+  The nearest folders will be returned first.
   Example: _PathsToAllParentFolders( '/home/user/projects/test.c' )
     [ '/home/user/projects', '/home/user', '/home', '/' ]"""
 
-  parent_folders = os.path.abspath(
-    os.path.dirname( filename ) ).split( os.path.sep )
-  if not parent_folders[0]:
-    parent_folders[0] = os.path.sep
+  def PathFolderComponents( filename ):
+    folders = []
+    path = os.path.dirname( filename )
+    while True:
+      path, folder = os.path.split( path )
+      if folder:
+        folders.append( folder )
+      else:
+        if path:
+          folders.append( path )
+        break
+    return list( reversed( folders ) )
+
+  parent_folders = PathFolderComponents( filename )
   parent_folders = [ os.path.join( *parent_folders[:i + 1] )
                      for i in xrange( len( parent_folders ) ) ]
   return reversed( parent_folders )

+ 40 - 0
python/ycm/tests/extra_conf_store_test.py

@@ -0,0 +1,40 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2013  Strahinja Val Markovic  <val@markovic.io>
+#
+# This file is part of YouCompleteMe.
+#
+# YouCompleteMe is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# YouCompleteMe is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with YouCompleteMe.  If not, see <http://www.gnu.org/licenses/>.
+
+from nose.tools import eq_
+from ycm.test_utils import MockVimModule
+vim_mock = MockVimModule()
+from ycm.extra_conf_store import _PathsToAllParentFolders
+
+
+def PathsToAllParentFolders_Basic_test():
+  eq_( [ '/home/user/projects', '/home/user', '/home', '/' ],
+       list( _PathsToAllParentFolders( '/home/user/projects/test.c' ) ) )
+
+def PathsToAllParentFolders_FileAtRoot_test():
+  eq_( [ '/' ],
+       list( _PathsToAllParentFolders( '/test.c' ) ) )
+
+# We can't use backwards slashes in the paths because then the test would fail
+# on Unix machines
+def PathsToAllParentFolders_WindowsPath_test():
+  eq_( [ r'C:/foo/goo/zoo', r'C:/foo/goo', r'C:/foo', 'C:' ],
+       list( _PathsToAllParentFolders( r'C:/foo/goo/zoo/test.c' ) ) )
+
+