From 1a3b0681ccee5db70cc9756be9f78307a5e3d2cb Mon Sep 17 00:00:00 2001
From: Thomas Steur <thomas.steur@gmail.com>
Date: Mon, 11 Nov 2013 00:16:15 +0000
Subject: [PATCH] refs #4241 let plugins add new console commands

---
 config/global.ini.php               |  1 +
 console                             |  3 ++
 core/Console.php                    | 76 ++++++++++++++---------------
 plugins/CoreConsole/CoreConsole.php | 50 +++++++++++++++++++
 4 files changed, 91 insertions(+), 39 deletions(-)
 create mode 100644 plugins/CoreConsole/CoreConsole.php

diff --git a/config/global.ini.php b/config/global.ini.php
index 52f267fac7..50c8097d46 100644
--- a/config/global.ini.php
+++ b/config/global.ini.php
@@ -528,6 +528,7 @@ Plugins[] = UsersManager
 Plugins[] = SitesManager
 Plugins[] = Installation
 Plugins[] = CoreUpdater
+Plugins[] = CoreConsole
 Plugins[] = ScheduledReports
 Plugins[] = UserCountryMap
 Plugins[] = Live
diff --git a/console b/console
index a1a51328b4..dc971e5e1a 100755
--- a/console
+++ b/console
@@ -8,6 +8,9 @@ require_once PIWIK_INCLUDE_PATH . '/vendor/autoload.php';
 require_once PIWIK_INCLUDE_PATH . '/core/Loader.php';
 require_once PIWIK_INCLUDE_PATH . '/libs/upgradephp/upgrade.php';
 
+// load all plugins
+Piwik\Plugin\Manager::getInstance()->returnLoadedPluginsInfo();
+
 if (!Piwik\Common::isPhpCliMode()) {
     exit;
 }
diff --git a/core/Console.php b/core/Console.php
index 8dc924f01d..f938c8826a 100644
--- a/core/Console.php
+++ b/core/Console.php
@@ -10,53 +10,51 @@
  */
 namespace Piwik;
 
-use Piwik\Plugins\CoreConsole\CodeCoverage;
-use Piwik\Plugins\CoreConsole\GenerateApi;
-use Piwik\Plugins\CoreConsole\GenerateController;
-use Piwik\Plugins\CoreConsole\GeneratePlugin;
-use Piwik\Plugins\CoreConsole\GenerateSettings;
-use Piwik\Plugins\CoreConsole\GenerateVisualizationPlugin;
-use Piwik\Plugins\CoreConsole\GitCommit;
-use Piwik\Plugins\CoreConsole\GitPull;
-use Piwik\Plugins\CoreConsole\GitPush;
-use Piwik\Plugins\CoreConsole\RunTests;
-use Piwik\Plugins\CoreConsole\Translations\CreatePull;
-use Piwik\Plugins\CoreConsole\Translations\FetchFromOTrance;
-use Piwik\Plugins\CoreConsole\Translations\LanguageCodes;
-use Piwik\Plugins\CoreConsole\Translations\LanguageNames;
-use Piwik\Plugins\CoreConsole\Translations\PluginsWithTranslations;
-use Piwik\Plugins\CoreConsole\Translations\SetTranslations;
-use Piwik\Plugins\CoreConsole\Translations\Update;
-use Piwik\Plugins\CoreConsole\WatchLog;
-use Piwik\Plugins\CoreConsole\GenerateTest;
 use Symfony\Component\Console\Application;
 
 class Console
 {
     public function run()
     {
-        $console = new Application();
+        $console  = new Application();
+        $commands = $this->getAvailableCommands();
 
-        $console->add(new RunTests());
-        $console->add(new GeneratePlugin());
-        $console->add(new GenerateApi());
-        $console->add(new GenerateSettings());
-        $console->add(new GenerateController());
-        $console->add(new GenerateVisualizationPlugin());
-        $console->add(new GenerateTest());
-        $console->add(new WatchLog());
-        $console->add(new GitPull());
-        $console->add(new GitCommit());
-        $console->add(new GitPush());
-        $console->add(new PluginsWithTranslations());
-        $console->add(new LanguageCodes());
-        $console->add(new LanguageNames());
-        $console->add(new FetchFromOTrance());
-        $console->add(new SetTranslations());
-        $console->add(new Update());
-        $console->add(new CreatePull());
-        $console->add(new CodeCoverage());
+        foreach ($commands as $command) {
+            if (class_exists($command)) {
+                $console->add(new $command);
+            } else {
+                Log::warning(sprintf('Cannot add command %s, class does not exist.', $command));
+            }
+        }
 
         $console->run();
     }
+
+    /**
+     * Returns a list of available command classnames.
+     *
+     * @return string[]
+     */
+    private function getAvailableCommands()
+    {
+        $commands = array();
+
+        /**
+         * Triggered when gathering all available console commands. Plugins that want to expose new console commands
+         * should subscribe to this event and add commands to the incoming array.
+         *
+         * **Example**
+         * ```
+         * public function addConsoleCommands(&$commands)
+         * {
+         *     $commands[] = 'Piwik\Plugins\MyPlugin\Commands\MyCommand';
+         * }
+         * ```
+         *
+         * @param array &$commands An array containing a list of command classnames.
+         */
+        Piwik::postEvent('Console.addCommands', array(&$commands));
+
+        return $commands;
+    }
 }
diff --git a/plugins/CoreConsole/CoreConsole.php b/plugins/CoreConsole/CoreConsole.php
new file mode 100644
index 0000000000..9d3a29f93c
--- /dev/null
+++ b/plugins/CoreConsole/CoreConsole.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ * @category Piwik_Plugins
+ * @package CoreConsole
+ */
+namespace Piwik\Plugins\CoreConsole;
+
+/**
+ * @package CoreConsole
+ */
+class CoreConsole extends \Piwik\Plugin
+{
+    /**
+     * @see Piwik_Plugin::getListHooksRegistered
+     */
+    public function getListHooksRegistered()
+    {
+        return array(
+            'Console.addCommands' => 'addConsoleCommands'
+        );
+    }
+
+    public function addConsoleCommands(&$commands)
+    {
+        $commands[] = 'Piwik\Plugins\CoreConsole\CodeCoverage';
+        $commands[] = 'Piwik\Plugins\CoreConsole\GenerateApi';
+        $commands[] = 'Piwik\Plugins\CoreConsole\GenerateController';
+        $commands[] = 'Piwik\Plugins\CoreConsole\GeneratePlugin';
+        $commands[] = 'Piwik\Plugins\CoreConsole\GenerateSettings';
+        $commands[] = 'Piwik\Plugins\CoreConsole\GenerateVisualizationPlugin';
+        $commands[] = 'Piwik\Plugins\CoreConsole\GitCommit';
+        $commands[] = 'Piwik\Plugins\CoreConsole\GitPull';
+        $commands[] = 'Piwik\Plugins\CoreConsole\GitPush';
+        $commands[] = 'Piwik\Plugins\CoreConsole\RunTests';
+        $commands[] = 'Piwik\Plugins\CoreConsole\Translations\CreatePull';
+        $commands[] = 'Piwik\Plugins\CoreConsole\Translations\FetchFromOTrance';
+        $commands[] = 'Piwik\Plugins\CoreConsole\Translations\LanguageCodes';
+        $commands[] = 'Piwik\Plugins\CoreConsole\Translations\LanguageNames';
+        $commands[] = 'Piwik\Plugins\CoreConsole\Translations\PluginsWithTranslations';
+        $commands[] = 'Piwik\Plugins\CoreConsole\Translations\SetTranslations';
+        $commands[] = 'Piwik\Plugins\CoreConsole\Translations\Update';
+        $commands[] = 'Piwik\Plugins\CoreConsole\WatchLog';
+        $commands[] = 'Piwik\Plugins\CoreConsole\GenerateTest';
+    }
+}
\ No newline at end of file
-- 
GitLab