/** * @return int|null|void */ protected function serve() { $package_file = $this->input->getArgument('package-file'); $helper = $this->getHelper('question'); $question = new ConfirmationQuestion('Are you sure you want to direct-install <cyan>' . $package_file . '</cyan> [y|N] ', false); $answer = $helper->ask($this->input, $this->output, $question); if (!$answer) { $this->output->writeln("exiting..."); $this->output->writeln(''); exit; } $tmp_dir = Grav::instance()['locator']->findResource('tmp://', true, true); $tmp_zip = $tmp_dir . '/Grav-' . uniqid(); $this->output->writeln(""); $this->output->writeln("Preparing to install <cyan>" . $package_file . "</cyan>"); if ($this->isRemote($package_file)) { $zip = $this->downloadPackage($package_file, $tmp_zip); } else { $zip = $this->copyPackage($package_file, $tmp_zip); } if (file_exists($zip)) { $tmp_source = $tmp_dir . '/Grav-' . uniqid(); $this->output->write(" |- Extracting package... "); $extracted = Installer::unZip($zip, $tmp_source); if (!$extracted) { $this->output->write("\r"); $this->output->writeln(" |- Extracting package... <red>failed</red>"); exit; } $this->output->write("\r"); $this->output->writeln(" |- Extracting package... <green>ok</green>"); $type = $this->getPackageType($extracted); if (!$type) { $this->output->writeln(" '- <red>ERROR: Not a valid Grav package</red>"); $this->output->writeln(''); exit; } $blueprint = $this->getBlueprints($extracted); if ($blueprint) { if (isset($blueprint['dependencies'])) { $depencencies = []; foreach ($blueprint['dependencies'] as $dependency) { if (is_array($dependency) && isset($dependency['name'])) { $depencencies[] = $dependency['name']; } else { $depencencies[] = $dependency; } } $this->output->writeln(" |- Dependencies found... <cyan>[" . implode(',', $depencencies) . "]</cyan>"); $question = new ConfirmationQuestion(" | '- Dependencies will not be satisfied. Continue ? [y|N] ", false); $answer = $helper->ask($this->input, $this->output, $question); if (!$answer) { $this->output->writeln("exiting..."); $this->output->writeln(''); exit; } } } if ($type == 'grav') { $this->output->write(" |- Checking destination... "); Installer::isValidDestination(GRAV_ROOT . '/system'); if (Installer::IS_LINK === Installer::lastErrorCode()) { $this->output->write("\r"); $this->output->writeln(" |- Checking destination... <yellow>symbolic link</yellow>"); $this->output->writeln(" '- <red>ERROR: symlinks found...</red> <yellow>" . GRAV_ROOT . "</yellow>"); $this->output->writeln(''); exit; } $this->output->write("\r"); $this->output->writeln(" |- Checking destination... <green>ok</green>"); $this->output->write(" |- Installing package... "); Installer::install($zip, GRAV_ROOT, ['sophisticated' => true, 'overwrite' => true, 'ignore_symlinks' => true], $extracted); } else { $name = $this->getPackageName($extracted); if (!$name) { $this->output->writeln("<red>ERROR: Name could not be determined.</red> Please specify with --name|-n"); $this->output->writeln(''); exit; } $install_path = $this->getInstallPath($type, $name); $is_update = file_exists($install_path); $this->output->write(" |- Checking destination... "); Installer::isValidDestination(GRAV_ROOT . DS . $install_path); if (Installer::lastErrorCode() == Installer::IS_LINK) { $this->output->write("\r"); $this->output->writeln(" |- Checking destination... <yellow>symbolic link</yellow>"); $this->output->writeln(" '- <red>ERROR: symlink found...</red> <yellow>" . GRAV_ROOT . DS . $install_path . '</yellow>'); $this->output->writeln(''); exit; } else { $this->output->write("\r"); $this->output->writeln(" |- Checking destination... <green>ok</green>"); } $this->output->write(" |- Installing package... "); Installer::install($zip, GRAV_ROOT, ['install_path' => $install_path, 'theme' => $type == 'theme', 'is_update' => $is_update], $extracted); } Folder::delete($tmp_source); $this->output->write("\r"); if (Installer::lastErrorCode()) { $this->output->writeln(" '- <red>Installation failed or aborted.</red>"); $this->output->writeln(''); } else { $this->output->writeln(" |- Installing package... <green>ok</green>"); $this->output->writeln(" '- <green>Success!</green> "); $this->output->writeln(''); } } else { $this->output->writeln(" '- <red>ERROR: ZIP package could not be found</red>"); } Folder::delete($tmp_zip); // clear cache after successful upgrade $this->clearCache(); return true; }