mirror of
https://github.com/getgrav/grav.git
synced 2026-02-22 14:38:13 +01:00
Fixed InstallCommand to use the new Installer class
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
namespace Grav\Console\Gpm;
|
||||
|
||||
use Grav\Common\GPM\GPM;
|
||||
use Grav\Common\GPM\Installer;
|
||||
use Grav\Common\GPM\Response;
|
||||
use Grav\Console\ConsoleTrait;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
@@ -11,7 +12,8 @@ use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Question\ConfirmationQuestion;
|
||||
|
||||
class InstallCommand extends Command {
|
||||
class InstallCommand extends Command
|
||||
{
|
||||
use ConsoleTrait;
|
||||
|
||||
protected $data;
|
||||
@@ -19,38 +21,40 @@ class InstallCommand extends Command {
|
||||
protected $destination;
|
||||
protected $file;
|
||||
|
||||
protected function configure() {
|
||||
protected function configure()
|
||||
{
|
||||
$this
|
||||
->setName("install")
|
||||
->addOption(
|
||||
'force',
|
||||
'f',
|
||||
InputOption::VALUE_NONE,
|
||||
'Force re-fetching the data from remote'
|
||||
)
|
||||
'force',
|
||||
'f',
|
||||
InputOption::VALUE_NONE,
|
||||
'Force re-fetching the data from remote'
|
||||
)
|
||||
->addOption(
|
||||
'all-yes',
|
||||
'y',
|
||||
InputOption::VALUE_NONE,
|
||||
'Assumes yes (or best approach) instead of prompting'
|
||||
)
|
||||
'all-yes',
|
||||
'y',
|
||||
InputOption::VALUE_NONE,
|
||||
'Assumes yes (or best approach) instead of prompting'
|
||||
)
|
||||
->addOption(
|
||||
'destination',
|
||||
'd',
|
||||
InputOption::VALUE_OPTIONAL,
|
||||
'The destination where the package should be installed at. By default this would be where the grav instance has been launched from',
|
||||
GRAV_ROOT
|
||||
)
|
||||
'destination',
|
||||
'd',
|
||||
InputOption::VALUE_OPTIONAL,
|
||||
'The destination where the package should be installed at. By default this would be where the grav instance has been launched from',
|
||||
GRAV_ROOT
|
||||
)
|
||||
->addArgument(
|
||||
'package',
|
||||
InputArgument::IS_ARRAY|InputArgument::REQUIRED,
|
||||
'The package of which more informations are desired. Use the "index" command for a list of packages'
|
||||
)
|
||||
'package',
|
||||
InputArgument::IS_ARRAY|InputArgument::REQUIRED,
|
||||
'The package of which more informations are desired. Use the "index" command for a list of packages'
|
||||
)
|
||||
->setDescription("Performs the installation of plugins and themes")
|
||||
->setHelp('The <info>install</info> command allows to install plugins and themes');
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output) {
|
||||
protected function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$this->setupConsole($input, $output);
|
||||
|
||||
$this->gpm = new GPM($this->input->getOption('force'));
|
||||
@@ -59,7 +63,17 @@ class InstallCommand extends Command {
|
||||
$packages = array_map('strtolower', $this->input->getArgument('package'));
|
||||
$this->data = $this->gpm->findPackages($packages);
|
||||
|
||||
$this->isGravInstance($this->destination);
|
||||
if (
|
||||
!Installer::isGravInstance($this->destination) ||
|
||||
!Installer::isValidDestination($this->destination, [Installer::EXISTS, Installer::IS_LINK])
|
||||
) {
|
||||
$this->output->writeln('');
|
||||
$this->output->writeln("<red>ERROR</red>: " . Installer::lastErrorMsg());
|
||||
$this->output->writeln(" <white>".$this->destination."</white>");
|
||||
$this->output->writeln('');
|
||||
|
||||
exit;
|
||||
}
|
||||
|
||||
$this->output->writeln('');
|
||||
|
||||
@@ -76,8 +90,8 @@ class InstallCommand extends Command {
|
||||
unset($this->data['not_found']);
|
||||
unset($this->data['total']);
|
||||
|
||||
foreach ($this->data as $type => $data) {
|
||||
foreach ($data as $slug => $package) {
|
||||
foreach ($this->data as $data) {
|
||||
foreach ($data as $package) {
|
||||
$this->output->writeln("Preparing to install <cyan>" . $package->name . "</cyan> [v" . $package->version . "]");
|
||||
|
||||
$this->output->write(" |- Downloading package... 0%");
|
||||
@@ -108,8 +122,8 @@ class InstallCommand extends Command {
|
||||
$this->rrmdir($this->destination . DS . 'tmp-gpm');
|
||||
}
|
||||
|
||||
private function downloadPackage($package) {
|
||||
|
||||
private function downloadPackage($package)
|
||||
{
|
||||
$tmp = $this->destination . DS . 'tmp-gpm';
|
||||
$filename = $package->slug . basename($package->download);
|
||||
$output = Response::get($package->download, [], [$this, 'progress']);
|
||||
@@ -128,12 +142,14 @@ class InstallCommand extends Command {
|
||||
return $tmp . DS . $filename;
|
||||
}
|
||||
|
||||
private function checkDestination($package) {
|
||||
$destination = $this->destination . DS . $package->install_path;
|
||||
private function checkDestination($package)
|
||||
{
|
||||
$questionHelper = $this->getHelper('question');
|
||||
$skipPrompt = $this->input->getOption('all-yes');
|
||||
|
||||
if (is_dir($destination) && !is_link($destination)) {
|
||||
Installer::isValidDestination($this->destination . DS . $package->install_path);
|
||||
|
||||
if (Installer::lastErrorCode() == Installer::EXISTS) {
|
||||
if (!$skipPrompt) {
|
||||
$this->output->write("\x0D");
|
||||
$this->output->writeln(" |- Checking destination... <yellow>exists</yellow>");
|
||||
@@ -143,20 +159,19 @@ class InstallCommand extends Command {
|
||||
|
||||
if (!$answer) {
|
||||
$this->output->writeln(" | '- <red>You decided to not overwrite the already installed package.</red>");
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
$this->rrmdir($destination);
|
||||
@mkdir($destination, 0777, true);
|
||||
}
|
||||
|
||||
if (is_link($destination)) {
|
||||
if (Installer::lastErrorCode() == Installer::IS_LINK) {
|
||||
$this->output->write("\x0D");
|
||||
$this->output->writeln(" |- Checking destination... <yellow>symbolic link</yellow>");
|
||||
|
||||
if ($skipPrompt) {
|
||||
$this->output->writeln(" | '- <yellow>Skipped automatically.</yellow>");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -165,10 +180,9 @@ class InstallCommand extends Command {
|
||||
|
||||
if (!$answer) {
|
||||
$this->output->writeln(" | '- <red>You decided to not delete the symlink automatically.</red>");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@unlink($destination);
|
||||
}
|
||||
|
||||
$this->output->write("\x0D");
|
||||
@@ -177,46 +191,42 @@ class InstallCommand extends Command {
|
||||
return true;
|
||||
}
|
||||
|
||||
private function installPackage($package) {
|
||||
$destination = $this->destination . DS . $package->install_path;
|
||||
$zip = new \ZipArchive;
|
||||
$openZip = $zip->open($this->file);
|
||||
$tmp = $this->destination . DS . 'tmp-gpm';
|
||||
private function installPackage($package)
|
||||
{
|
||||
$installer = Installer::install($this->file, $this->destination, ['install_path' => $package->install_path]);
|
||||
$errorCode = Installer::lastErrorCode();
|
||||
|
||||
if (!$openZip) {
|
||||
if ($errorCode & (Installer::ZIP_OPEN_ERROR | Installer::ZIP_EXTRACT_ERROR)) {
|
||||
$this->output->write("\x0D");
|
||||
// extra white spaces to clear out the buffer properly
|
||||
$this->output->writeln(" |- Installing package... <red>error</red> ");
|
||||
$this->output->writeln(" | '- Unable to open the downloaded package: <yellow>" . $package->download . "</yellow>");
|
||||
$this->output->writeln(" | '- " . $installer->lastErrorMsg());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
$innerFolder = $zip->getNameIndex(0);
|
||||
|
||||
$zip->extractTo($tmp);
|
||||
$zip->close();
|
||||
|
||||
rename($tmp . DS . $innerFolder, $destination);
|
||||
|
||||
$this->output->write("\x0D");
|
||||
// extra white spaces to clear out the buffer properly
|
||||
$this->output->writeln(" |- Installing package... <green>ok</green> ");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function progress($progress) {
|
||||
public function progress($progress)
|
||||
{
|
||||
$this->output->write("\x0D");
|
||||
$this->output->write(" |- Downloading package... " . str_pad($progress['percent'], 5, " ", STR_PAD_LEFT) . '%');
|
||||
}
|
||||
|
||||
// Recursively Delete folder - DANGEROUS! USE WITH CARE!!!!
|
||||
private function rrmdir($dir) {
|
||||
private function rrmdir($dir)
|
||||
{
|
||||
if (is_dir($dir)) {
|
||||
$objects = scandir($dir);
|
||||
foreach ($objects as $object) {
|
||||
if ($object != "." && $object != "..") {
|
||||
if (filetype($dir . "/" . $object) == "dir") {$this->rrmdir($dir . "/" . $object);
|
||||
if (filetype($dir . "/" . $object) == "dir") {
|
||||
$this->rrmdir($dir . "/" . $object);
|
||||
} else {
|
||||
unlink($dir . "/" . $object);
|
||||
}
|
||||
@@ -225,6 +235,7 @@ class InstallCommand extends Command {
|
||||
|
||||
reset($objects);
|
||||
rmdir($dir);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user