From 9438724f28b387484283f18deb1b73ca44d17c9a Mon Sep 17 00:00:00 2001 From: John S Long Date: Tue, 25 Apr 2017 22:48:06 -0500 Subject: [PATCH 1/4] Cache source packages when reference/revision is available Fixes #366 --- src/Indexer.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Indexer.php b/src/Indexer.php index 34ad618..00043cb 100644 --- a/src/Indexer.php +++ b/src/Indexer.php @@ -149,15 +149,23 @@ class Indexer $cacheKey = null; $index = null; foreach (array_merge($this->composerLock->packages, $this->composerLock->{'packages-dev'}) as $package) { - // Check if package name matches and version is absolute - // Dynamic constraints are not cached, because they can change every time + // Check if package can be cached. $packageVersion = ltrim($package->version, 'v'); + // If package is anchored to a version if ($package->name === $packageName && strpos($packageVersion, 'dev') === false) { $packageKey = $packageName . ':' . $packageVersion; $cacheKey = self::CACHE_VERSION . ':' . $packageKey; // Check cache $index = yield $this->cache->get($cacheKey); break; + + // If package is checked out + } elseif ($package->name === $packageName && isset($package->source->reference)) { + $packageKey = $packageName . ':' . $package->source->reference; + $cacheKey = self::CACHE_VERSION . ':' . $packageKey; + // Check cache + $index = yield $this->cache->get($cacheKey); + break; } } if ($index !== null) { From 929ea30724973cc45badd80a2b019942f8bca483 Mon Sep 17 00:00:00 2001 From: John S Long Date: Sat, 29 Apr 2017 23:11:49 -0500 Subject: [PATCH 2/4] Refactor duplicate check for package name, fix syntax violation --- src/Indexer.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Indexer.php b/src/Indexer.php index 00043cb..4558431 100644 --- a/src/Indexer.php +++ b/src/Indexer.php @@ -149,10 +149,13 @@ class Indexer $cacheKey = null; $index = null; foreach (array_merge($this->composerLock->packages, $this->composerLock->{'packages-dev'}) as $package) { + if ($package->name !== $packageName) { + continue; + } // Check if package can be cached. $packageVersion = ltrim($package->version, 'v'); // If package is anchored to a version - if ($package->name === $packageName && strpos($packageVersion, 'dev') === false) { + if (strpos($packageVersion, 'dev') === false) { $packageKey = $packageName . ':' . $packageVersion; $cacheKey = self::CACHE_VERSION . ':' . $packageKey; // Check cache @@ -160,7 +163,7 @@ class Indexer break; // If package is checked out - } elseif ($package->name === $packageName && isset($package->source->reference)) { + } else if (isset($package->source->reference)) { $packageKey = $packageName . ':' . $package->source->reference; $cacheKey = self::CACHE_VERSION . ':' . $packageKey; // Check cache From ad077ba34348b7717d613d87824b2a4414db0a10 Mon Sep 17 00:00:00 2001 From: John S Long Date: Sun, 30 Apr 2017 11:43:33 -0500 Subject: [PATCH 3/4] Remove hard-coded file count in language server test. --- tests/LanguageServerTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/LanguageServerTest.php b/tests/LanguageServerTest.php index fb52ef6..2e4d892 100644 --- a/tests/LanguageServerTest.php +++ b/tests/LanguageServerTest.php @@ -57,7 +57,7 @@ class LanguageServerTest extends TestCase if ($msg->body->method === 'window/logMessage' && $promise->state === Promise::PENDING) { if ($msg->body->params->type === MessageType::ERROR) { $promise->reject(new Exception($msg->body->params->message)); - } else if (strpos($msg->body->params->message, 'All 27 PHP files parsed') !== false) { + } else if (preg_match('/All [0-9]+ PHP files parsed/', $msg->body->params->message)) { $promise->fulfill(); } } @@ -103,7 +103,7 @@ class LanguageServerTest extends TestCase if ($promise->state === Promise::PENDING) { $promise->reject(new Exception($msg->body->params->message)); } - } else if (strpos($msg->body->params->message, 'All 27 PHP files parsed') !== false) { + } else if (preg_match('/All [0-9]+ PHP files parsed/', $msg->body->params->message)) { $promise->fulfill(); } } From ee5a7d79a7199b6309ef99f81a447b10bdfc42d9 Mon Sep 17 00:00:00 2001 From: John S Long Date: Sun, 30 Apr 2017 11:44:12 -0500 Subject: [PATCH 4/4] Add tests for caching packages based on version, reference/revision --- fixtures/composer.json | 6 ++ fixtures/composer.lock | 55 +++++++++++++++++++ .../vendor/example/example-reference/test.php | 1 + .../vendor/example/example-version/test.php | 3 + tests/LanguageServerTest.php | 10 +++- 5 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 fixtures/composer.json create mode 100644 fixtures/composer.lock create mode 100644 fixtures/vendor/example/example-reference/test.php create mode 100644 fixtures/vendor/example/example-version/test.php diff --git a/fixtures/composer.json b/fixtures/composer.json new file mode 100644 index 0000000..6ec2e92 --- /dev/null +++ b/fixtures/composer.json @@ -0,0 +1,6 @@ +{ + "require": { + "example/example-version": "1.0.7", + "example/example-reference": "dev-master" + } +} \ No newline at end of file diff --git a/fixtures/composer.lock b/fixtures/composer.lock new file mode 100644 index 0000000..6d84154 --- /dev/null +++ b/fixtures/composer.lock @@ -0,0 +1,55 @@ +{ + "_readme": [ + "This is a mock lock file for composer" + ], + "content-hash": "3da868eb11c9a94f957057f73d2936ef", + "packages": [ + { + "name": "example/example-version", + "version": "1.0.7", + "source": { + "type": "git", + "url": "https://example.com", + "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12" + }, + "require": {}, + "require-dev": {}, + "suggest": {}, + "type": "library", + "extra": {}, + "autoload": {}, + "license": [], + "authors": [], + "description": "", + "keywords": [], + "time": "2017-03-06T11:59:08+00:00" + }, + { + "name": "example/example-reference", + "version": "1.0.7", + "source": { + "type": "git", + "url": "https://example.com", + "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12" + }, + "require": {}, + "require-dev": {}, + "suggest": {}, + "type": "library", + "extra": {}, + "autoload": {}, + "license": [], + "authors": [], + "description": "", + "keywords": [], + "time": "2017-03-06T11:59:08+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "prefer-stable": true, + "prefer-lowest": false, + "platform": {}, + "platform-dev": [] +} diff --git a/fixtures/vendor/example/example-reference/test.php b/fixtures/vendor/example/example-reference/test.php new file mode 100644 index 0000000..b3d9bbc --- /dev/null +++ b/fixtures/vendor/example/example-reference/test.php @@ -0,0 +1 @@ +on('message', function (Message $msg) use ($promise) { + $cacheVersionCalled = false; + $cacheReferenceCalled = false; + $output->on('message', function (Message $msg) use ($promise, &$cacheVersionCalled, &$cacheReferenceCalled) { if ($msg->body->method === 'window/logMessage' && $promise->state === Promise::PENDING) { if ($msg->body->params->type === MessageType::ERROR) { $promise->reject(new Exception($msg->body->params->message)); } else if (preg_match('/All [0-9]+ PHP files parsed/', $msg->body->params->message)) { $promise->fulfill(); + } else if (preg_match('#(Storing|Restored) example/example-version:.* (in|from) cache#', $msg->body->params->message)) { + $cacheVersionCalled = true; + } else if (preg_match('#(Storing|Restored) example/example-reference:.* (in|from) cache#', $msg->body->params->message)) { + $cacheReferenceCalled = true; } } }); @@ -66,6 +72,8 @@ class LanguageServerTest extends TestCase $capabilities = new ClientCapabilities; $server->initialize($capabilities, realpath(__DIR__ . '/../fixtures'), getmypid()); $promise->wait(); + $this->assertTrue($cacheVersionCalled); + $this->assertTrue($cacheReferenceCalled); } public function testIndexingWithFilesAndContentRequests()