Merge pull request #20365 from owncloud/autoloader-fix

[autoloader] Make sure to load full paths
This commit is contained in:
Thomas Müller 2015-11-06 14:59:36 +01:00
commit 82f8374f63
3 changed files with 69 additions and 22 deletions

View File

@ -100,14 +100,30 @@ class Autoloader {
$paths[] = str_replace('apps/', '', \OC::$CLASSPATH[$class]); $paths[] = str_replace('apps/', '', \OC::$CLASSPATH[$class]);
} }
} elseif (strpos($class, 'OC_') === 0) { } elseif (strpos($class, 'OC_') === 0) {
// first check for legacy classes if underscores are used $paths[] = \OC::$SERVERROOT . '/lib/private/legacy/' . strtolower(str_replace('_', '/', substr($class, 3)) . '.php');
$paths[] = 'private/legacy/' . strtolower(str_replace('_', '/', substr($class, 3)) . '.php'); $paths[] = \OC::$SERVERROOT . '/lib/private/' . strtolower(str_replace('_', '/', substr($class, 3)) . '.php');
$paths[] = 'private/' . strtolower(str_replace('_', '/', substr($class, 3)) . '.php');
} elseif (strpos($class, 'OC\\') === 0) { } elseif (strpos($class, 'OC\\') === 0) {
$paths[] = 'private/' . strtolower(str_replace('\\', '/', substr($class, 3)) . '.php'); $split = explode('\\', $class, 3);
$paths[] = strtolower(str_replace('\\', '/', substr($class, 3)) . '.php');
if (count($split) === 3) {
$split[1] = strtolower($split[1]);
if ($split[1] === 'core') {
$paths[] = \OC::$SERVERROOT . '/core/' . strtolower(str_replace('\\', '/', $split[2])) . '.php';
} else if ($split[1] === 'settings') {
$paths[] = \OC::$SERVERROOT . '/settings/' . strtolower(str_replace('\\', '/', $split[2])) . '.php';
} else if ($split[1] === 'repair') {
$paths[] = \OC::$SERVERROOT . '/lib/repair/' . strtolower(str_replace('\\', '/', $split[2])) . '.php';
} else {
$paths[] = \OC::$SERVERROOT . '/lib/private/' . $split[1] . '/' . strtolower(str_replace('\\', '/', $split[2])) . '.php';
}
} else {
$paths[] = \OC::$SERVERROOT . '/lib/private/' . strtolower(str_replace('\\', '/', $split[1])) . '.php';
}
} elseif (strpos($class, 'OCP\\') === 0) { } elseif (strpos($class, 'OCP\\') === 0) {
$paths[] = 'public/' . strtolower(str_replace('\\', '/', substr($class, 4)) . '.php'); $paths[] = \OC::$SERVERROOT . '/lib/public/' . strtolower(str_replace('\\', '/', substr($class, 4)) . '.php');
} elseif (strpos($class, 'OCA\\') === 0) { } elseif (strpos($class, 'OCA\\') === 0) {
list(, $app, $rest) = explode('\\', $class, 3); list(, $app, $rest) = explode('\\', $class, 3);
$app = strtolower($app); $app = strtolower($app);
@ -118,9 +134,9 @@ class Autoloader {
$paths[] = $appPath . '/lib/' . strtolower(str_replace('\\', '/', $rest) . '.php'); $paths[] = $appPath . '/lib/' . strtolower(str_replace('\\', '/', $rest) . '.php');
} }
} elseif (strpos($class, 'Test_') === 0) { } elseif (strpos($class, 'Test_') === 0) {
$paths[] = 'tests/lib/' . strtolower(str_replace('_', '/', substr($class, 5)) . '.php'); $paths[] = \OC::$SERVERROOT . '/tests/lib/' . strtolower(str_replace('_', '/', substr($class, 5)) . '.php');
} elseif (strpos($class, 'Test\\') === 0) { } elseif (strpos($class, 'Test\\') === 0) {
$paths[] = 'tests/lib/' . strtolower(str_replace('\\', '/', substr($class, 5)) . '.php'); $paths[] = \OC::$SERVERROOT . '/tests/lib/' . strtolower(str_replace('\\', '/', substr($class, 5)) . '.php');
} }
return $paths; return $paths;
} }

View File

@ -117,12 +117,6 @@ class OC {
* the app path list is empty or contains an invalid path * the app path list is empty or contains an invalid path
*/ */
public static function initPaths() { public static function initPaths() {
// ensure we can find OC_Config
set_include_path(
OC::$SERVERROOT . '/lib' . PATH_SEPARATOR .
get_include_path()
);
if(defined('PHPUNIT_CONFIG_DIR')) { if(defined('PHPUNIT_CONFIG_DIR')) {
self::$configDir = OC::$SERVERROOT . '/' . PHPUNIT_CONFIG_DIR . '/'; self::$configDir = OC::$SERVERROOT . '/' . PHPUNIT_CONFIG_DIR . '/';
} elseif(defined('PHPUNIT_RUN') and PHPUNIT_RUN and is_dir(OC::$SERVERROOT . '/tests/config/')) { } elseif(defined('PHPUNIT_RUN') and PHPUNIT_RUN and is_dir(OC::$SERVERROOT . '/tests/config/')) {

View File

@ -20,41 +20,78 @@ class AutoLoader extends TestCase {
} }
public function testLeadingSlashOnClassName() { public function testLeadingSlashOnClassName() {
$this->assertEquals(array('private/files/storage/local.php', 'files/storage/local.php'), $this->loader->findClass('\OC\Files\Storage\Local')); $this->assertEquals([
\OC::$SERVERROOT . '/lib/private/files/storage/local.php',
], $this->loader->findClass('\OC\Files\Storage\Local'));
} }
public function testNoLeadingSlashOnClassName() { public function testNoLeadingSlashOnClassName() {
$this->assertEquals(array('private/files/storage/local.php', 'files/storage/local.php'), $this->loader->findClass('OC\Files\Storage\Local')); $this->assertEquals([
\OC::$SERVERROOT . '/lib/private/files/storage/local.php',
], $this->loader->findClass('OC\Files\Storage\Local'));
} }
public function testLegacyPath() { public function testLegacyPath() {
$this->assertEquals(array('private/legacy/files.php', 'private/files.php'), $this->loader->findClass('OC_Files')); $this->assertEquals([
\OC::$SERVERROOT . '/lib/private/legacy/files.php',
\OC::$SERVERROOT . '/lib/private/files.php',
], $this->loader->findClass('OC_Files'));
} }
public function testLoadTestNamespace() { public function testLoadTestNamespace() {
$this->assertEquals(array('tests/lib/foo/bar.php'), $this->loader->findClass('Test\Foo\Bar')); $this->assertEquals([
\OC::$SERVERROOT . '/tests/lib/foo/bar.php'
], $this->loader->findClass('Test\Foo\Bar'));
} }
public function testLoadTest() { public function testLoadTest() {
$this->assertEquals(array('tests/lib/foo/bar.php'), $this->loader->findClass('Test_Foo_Bar')); $this->assertEquals([
\OC::$SERVERROOT . '/tests/lib/foo/bar.php'
], $this->loader->findClass('Test_Foo_Bar'));
} }
public function testLoadCoreNamespace() { public function testLoadCoreNamespace() {
$this->assertEquals(array('private/foo/bar.php', 'foo/bar.php'), $this->loader->findClass('OC\Foo\Bar')); $this->assertEquals([
\OC::$SERVERROOT . '/lib/private/foo/bar.php',
], $this->loader->findClass('OC\Foo\Bar'));
} }
public function testLoadCore() { public function testLoadCore() {
$this->assertEquals(array('private/legacy/foo/bar.php', 'private/foo/bar.php'), $this->loader->findClass('OC_Foo_Bar')); $this->assertEquals([
\OC::$SERVERROOT . '/lib/private/legacy/foo/bar.php',
\OC::$SERVERROOT . '/lib/private/foo/bar.php',
], $this->loader->findClass('OC_Foo_Bar'));
} }
public function testLoadPublicNamespace() { public function testLoadPublicNamespace() {
$this->assertEquals(array('public/foo/bar.php'), $this->loader->findClass('OCP\Foo\Bar')); $this->assertEquals([
\OC::$SERVERROOT . '/lib/public/foo/bar.php',
], $this->loader->findClass('OCP\Foo\Bar'));
} }
public function testLoadAppNamespace() { public function testLoadAppNamespace() {
$result = $this->loader->findClass('OCA\Files\Foobar'); $result = $this->loader->findClass('OCA\Files\Foobar');
print_r($result);
$this->assertEquals(2, count($result)); $this->assertEquals(2, count($result));
$this->assertStringEndsWith('apps/files/foobar.php', $result[0]); $this->assertStringEndsWith('apps/files/foobar.php', $result[0]);
$this->assertStringEndsWith('apps/files/lib/foobar.php', $result[1]); $this->assertStringEndsWith('apps/files/lib/foobar.php', $result[1]);
} }
public function testLoadCoreNamespaceCore() {
$this->assertEquals([
\OC::$SERVERROOT . '/core/foo/bar.php',
], $this->loader->findClass('OC\Core\Foo\Bar'));
}
public function testLoadCoreNamespaceSettings() {
$this->assertEquals([
\OC::$SERVERROOT . '/settings/foo/bar.php',
], $this->loader->findClass('OC\Settings\Foo\Bar'));
}
public function testLoadCoreNamespaceRepair() {
$this->assertEquals([
\OC::$SERVERROOT . '/lib/repair/foo/bar.php',
], $this->loader->findClass('OC\Repair\Foo\Bar'));
}
} }