/** * Test that the base functionality works. * * @return void */ public function testAll() { // Redirect composer config and cache into the test temp dir. putenv('COMPOSER_HOME=' . $this->getTempDir() . DIRECTORY_SEPARATOR . '.composer'); $this->createFixture('.composer' . DIRECTORY_SEPARATOR . 'config.json', str_replace('##URL##', str_replace('\\', '/', $this->getTempDir() . DIRECTORY_SEPARATOR . 'test-repository' . DIRECTORY_SEPARATOR), $this->readFixture('composer' . DIRECTORY_SEPARATOR . 'config.json'))); $this->createFixture('test-repository' . DIRECTORY_SEPARATOR . 'packages.json', str_replace('##URL##', str_replace('\\', '/', $this->getTempDir() . DIRECTORY_SEPARATOR . 'test-repository' . DIRECTORY_SEPARATOR), $this->readFixture('test-repository' . DIRECTORY_SEPARATOR . 'packages.json'))); $this->provideFixture('test-repository' . DIRECTORY_SEPARATOR . 'vendor-package-name-1.0.0.zip'); $this->provideFixture('test-repository' . DIRECTORY_SEPARATOR . 'vendor-dependency-name-1.0.0.zip'); $this->provideFixture($newZip = 'test-repository' . DIRECTORY_SEPARATOR . 'vendor-dependency-name-1.1.0.zip'); // First we need a proper installation. $task = new InstallTask(new JsonArray([InstallTask::SETTING_TYPE => 'install', InstallTask::SETTING_ID => 'install-task-id', InstallTask::SETTING_PACKAGE => 'vendor/package-name', InstallTask::SETTING_VERSION => '1.0.0', InstallTask::SETTING_DESTINATION_DIR => $this->getTempDir(), 'status' => InstallTask::STATE_PENDING])); $task->perform($this->getTempFile('logs/install-task.log')); if ($task->getStatus() !== InstallTask::STATE_FINISHED) { $this->markTestSkipped('Upgrade task can not be tested, test installation failed.'); return; } // Now the upgrade. $file = new JsonFile($this->getTempDir() . DIRECTORY_SEPARATOR . 'composer.json'); $file->set('repositories', ['packagist' => false]); $file->set('require/' . $file->escape('vendor/dependency-name'), '~1.0'); unset($file); $task = new UpgradeTask(new JsonArray([UpgradeTask::SETTING_TYPE => 'upgrade', UpgradeTask::SETTING_ID => 'upgrade-task-id', UpgradeTask::SETTING_HOME => $this->getTempDir(), UpgradeTask::SETTING_PACKAGES => ['vendor/dependency-name'], 'status' => UpgradeTask::STATE_PENDING])); $task->perform($this->getTempFile('logs/task.log')); $this->assertEquals('upgrade-task-id', $task->getId()); $this->assertEquals(UpgradeTask::STATE_FINISHED, $task->getStatus()); $this->assertContains('Installing vendor/dependency-name (1.1.0)', $task->getOutput()); $this->assertZipHasBeenUnpackedTo($this->getFixturesDirectory() . DIRECTORY_SEPARATOR . $newZip, 'vendor' . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'dependency-name'); }
/** * Add the task to the list. * * @param string $type The type name. * * @param JsonArray|null $metaData The (optional) meta data. * * @return string * * @throws \InvalidArgumentException When no task instance can be created from the meta data. */ public function queue($type, JsonArray $metaData = null) { $taskId = $this->generateId(); if (null === $metaData) { $metaData = new JsonArray(); } $metaData->set(Task::SETTING_ID, $taskId)->set(Task::SETTING_TYPE, $type)->set('status', Task::STATE_PENDING)->set(Task::SETTING_CREATED_AT, date('c')); $taskFile = new JsonFile($this->taskIdToFileName($taskId), null); $taskFile->setData($metaData->getData()); $taskFile->save(); if (!$this->createTaskFromMetaData($taskFile)) { unlink($taskFile->getFilename()); throw new \InvalidArgumentException('Could not create task of type "' . $metaData->get('type') . '"'); } $this->getConfig()->set($taskId, $metaData->getData()); return $taskId; }
/** * Load a repository containing available upgrades. * * @return null|RepositoryInterface */ private function getUpgradeRepository() { $upgradeFile = $this->getTensideDataDir() . DIRECTORY_SEPARATOR . 'upgrades.json'; if (!file_exists($upgradeFile)) { return null; } $packageLoader = new ArrayLoader(); $packageChanges = new WritableArrayRepository(); $upgrades = new JsonFile($upgradeFile, null); foreach ($upgrades->getEntries('/') as $packageName) { if ($pkgData = $upgrades->get($packageName . '/target')) { $packageChanges->addPackage($packageLoader->load($pkgData)); } } return $packageChanges; }