VersionCommand.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. /**
  3. * @package Grav\Console\Gpm
  4. *
  5. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
  6. * @license MIT License; see LICENSE file for details.
  7. */
  8. namespace Grav\Console\Gpm;
  9. use Grav\Common\GPM\GPM;
  10. use Grav\Common\GPM\Upgrader;
  11. use Grav\Console\ConsoleCommand;
  12. use RocketTheme\Toolbox\File\YamlFile;
  13. use Symfony\Component\Console\Input\InputArgument;
  14. use Symfony\Component\Console\Input\InputOption;
  15. class VersionCommand extends ConsoleCommand
  16. {
  17. /** @var GPM */
  18. protected $gpm;
  19. protected function configure()
  20. {
  21. $this
  22. ->setName('version')
  23. ->addOption(
  24. 'force',
  25. 'f',
  26. InputOption::VALUE_NONE,
  27. 'Force re-fetching the data from remote'
  28. )
  29. ->addArgument(
  30. 'package',
  31. InputArgument::IS_ARRAY | InputArgument::OPTIONAL,
  32. 'The package or packages that is desired to know the version of. By default and if not specified this would be grav'
  33. )
  34. ->setDescription('Shows the version of an installed package. If available also shows pending updates.')
  35. ->setHelp('The <info>version</info> command displays the current version of a package installed and, if available, the available version of pending updates');
  36. }
  37. /**
  38. * @return int|null|void
  39. */
  40. protected function serve()
  41. {
  42. $this->gpm = new GPM($this->input->getOption('force'));
  43. $packages = $this->input->getArgument('package');
  44. $installed = false;
  45. if (!count($packages)) {
  46. $packages = ['grav'];
  47. }
  48. foreach ($packages as $package) {
  49. $package = strtolower($package);
  50. $name = null;
  51. $version = null;
  52. $updatable = false;
  53. if ($package === 'grav') {
  54. $name = 'Grav';
  55. $version = GRAV_VERSION;
  56. $upgrader = new Upgrader();
  57. if ($upgrader->isUpgradable()) {
  58. $updatable = " [upgradable: v<green>{$upgrader->getRemoteVersion()}</green>]";
  59. }
  60. } else {
  61. // get currently installed version
  62. $locator = \Grav\Common\Grav::instance()['locator'];
  63. $blueprints_path = $locator->findResource('plugins://' . $package . DS . 'blueprints.yaml');
  64. if (!file_exists($blueprints_path)) { // theme?
  65. $blueprints_path = $locator->findResource('themes://' . $package . DS . 'blueprints.yaml');
  66. if (!file_exists($blueprints_path)) {
  67. continue;
  68. }
  69. }
  70. $file = YamlFile::instance($blueprints_path);
  71. $package_yaml = $file->content();
  72. $file->free();
  73. $version = $package_yaml['version'];
  74. if (!$version) {
  75. continue;
  76. }
  77. $installed = $this->gpm->findPackage($package);
  78. if ($installed) {
  79. $name = $installed->name;
  80. if ($this->gpm->isUpdatable($package)) {
  81. $updatable = " [updatable: v<green>{$installed->available}</green>]";
  82. }
  83. }
  84. }
  85. $updatable = $updatable ?: '';
  86. if ($installed || $package === 'grav') {
  87. $this->output->writeln("You are running <white>{$name}</white> v<cyan>{$version}</cyan>{$updatable}");
  88. } else {
  89. $this->output->writeln("Package <red>{$package}</red> not found");
  90. }
  91. }
  92. }
  93. }