diff --git a/utils/Commands/RepositoryextensionCommand.php b/utils/Commands/RepositoryextensionCommand.php index 26d10ed65..f50e5d247 100644 --- a/utils/Commands/RepositoryextensionCommand.php +++ b/utils/Commands/RepositoryextensionCommand.php @@ -8,6 +8,8 @@ use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Helper\Table; +use Symfony\Component\Console\Helper\QuestionHelper; +use Symfony\Component\Console\Question\Question; use Seeddms\Seeddms\Settings; use Seeddms\Seeddms\Translator; diff --git a/utils/Commands/UpdateextensionCommand.php b/utils/Commands/UpdateextensionCommand.php new file mode 100644 index 000000000..e6ee4dd4e --- /dev/null +++ b/utils/Commands/UpdateextensionCommand.php @@ -0,0 +1,156 @@ +settings = $settings; + $this->logger = $logger; + $this->translator = $translator; + $this->extmgr = $extmgr; + parent::__construct(); + } + + protected function configure() + { + $this->setName('ext:update') + ->setDescription('Check for extension upates') + ->setHelp('') + ->addOption('url', '', InputOption::VALUE_REQUIRED, 'Url of repository.', null) + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) : int + { + $settings = $this->settings; + $logger = $this->logger; + $translator = $this->translator; + $extmgr = $this->extmgr; + + $output->writeln("Using configuration from '".$settings->_configFilePath."'.", OutputInterface::VERBOSITY_VERBOSE); + + $reposurl = $input->getOption('url'); + if($reposurl) + $extmgr->setRepositoryUrl($reposurl); + + $updates = []; + $installs = []; + /* Get a list of available extensions from the repository */ + if($ret = $extmgr->updateExtensionList('', true)) { +// $output->writeln(sprintf("Updated extension list from repository.")); + // list of installed extensions + $extconfs = $extmgr->getExtensionConfiguration(); + // list of extensions in repository, this will just return the + // latest version of an extension + $list = $extmgr->getExtensionList(); +// print_r($list); + foreach($list as $extname=>$data) { + $extversions = $extmgr->getExtensionListByName($extname); +// print_r($extversions); + $updates[$extname] = []; + $installs[$extname] = []; + $allowedversions = []; + foreach($extversions as $version=>$extversion) { + $check = $extmgr->checkExtensionByName($extname, $extversion); + if ($check) { + $allowedversions[] = ''.$version.''; + if (isset($extconfs[$extname])) { + if (\Seeddms\Seeddms\ExtensionMgr::cmpVersion($version, $extconfs[$extname]['version']) > 0) { + $updates[$extname][$version] = $extversion; + } + } else { + $installs[$extname][$version] = $extversion; + } + } else { + $allowedversions[] = ''.$version.''; + } + } + } + $helper = new QuestionHelper(); + foreach($updates as $extname=>$update) { + $availableversions = array_keys($update); + if ($update) { + $output->writeln(sprintf("Extension '%s' can be updated from %s to %s.", $extname, $extconfs[$extname]['version'], implode(', ', $availableversions))); + $question = new Question(sprintf("Enter version to update: "), ''); + if ($answer = $helper->ask($input, $output, $question)) { + if (in_array($answer, $availableversions)) { + $output->writeln(sprintf("Update extension '%s' to version %s.", $extname, $answer)); + if ($tmpfile = $extmgr->getExtensionFromRepository($update[$answer]['filename'])) { + + if (0&&!$extmgr->updateExtension($tmpfile)) { + foreach ($extmgr->getErrorMsgs() as $msg) { + $output->writeln(sprintf("%s", $msg)); + } + unlink($tmpfile); + return Command::FAILURE; + } else { + unlink($tmpfile); + } + } + } else { + $output->writeln(sprintf("Invalid version %s.", $answer)); + } + } + } + } + foreach($installs as $extname=>$install) { + $availableversions = array_keys($install); + if ($install) { + $output->writeln(sprintf("Extension '%s' can be installed as version %s.", $extname, implode(', ', $availableversions))); + $question = new Question(sprintf("Enter version to install: "), ''); + if ($answer = $helper->ask($input, $output, $question)) { + if (in_array($answer, $availableversions)) { + $output->writeln(sprintf("Install extension '%s' to version %s.", $extname, $answer)); + if ($tmpfile = $extmgr->getExtensionFromRepository($install[$answer]['filename'])) { + + if (0&&!$extmgr->updateExtension($tmpfile)) { + foreach ($extmgr->getErrorMsgs() as $msg) { + $output->writeln(sprintf("%s", $msg)); + } + unlink($tmpfile); + return Command::FAILURE; + } else { + unlink($tmpfile); + } + } + } else { + $output->writeln(sprintf("Invalid version %s.", $answer)); + } + } + } + } + return Command::SUCCESS; + } else { + $output->writeln(sprintf("Could not get extension list from repository.")); + return Command::FAILURE; + } + } +} + +// vim: ts=4 sw=4 expandtab diff --git a/utils/console b/utils/console index 9dc4c8c4b..ed7d3c0d8 100755 --- a/utils/console +++ b/utils/console @@ -21,6 +21,7 @@ use Seeddms\Console\Commands\PackageextensionCommand; use Seeddms\Console\Commands\ReloadextensionCommand; use Seeddms\Console\Commands\CheckextensionCommand; use Seeddms\Console\Commands\RepositoryextensionCommand; +use Seeddms\Console\Commands\UpdateextensionCommand; use Seeddms\Console\Commands\DownloadextensionCommand; use Seeddms\Seeddms\Settings; use Seeddms\Seeddms\Translator; @@ -58,6 +59,7 @@ $application->add(new PackageextensionCommand($settings, $logger, $translator, $ $application->add(new ReloadextensionCommand($settings, $logger, $translator, $extmgr)); $application->add(new CheckextensionCommand($settings, $logger, $translator, $extmgr)); $application->add(new RepositoryextensionCommand($settings, $logger, $translator, $extmgr)); +$application->add(new UpdateextensionCommand($settings, $logger, $translator, $extmgr)); $application->add(new DownloadextensionCommand($settings, $logger, $translator, $extmgr)); if(isset($GLOBALS['SEEDDMS_HOOKS']['console'])) {