From 2ce635567533439808952a7094a22783a6460daa Mon Sep 17 00:00:00 2001
From: Ankur Kaneria <akaneria@ebay.com>
Date: Thu, 3 Mar 2016 10:58:19 -0600
Subject: [PATCH] MAGETWO-49955: [GITHUB] There are no commands defined in the
 "cron" namespace. #2335

---
 .../Magento/Framework/Console/Cli.php         | 17 +++++++++++++
 .../Framework/Setup}/FilePermissions.php      | 25 +++++++++++++++++--
 .../Setup/Test/Unit}/FilePermissionsTest.php  |  8 +++---
 .../Magento/Setup/Controller/Environment.php  |  4 +--
 setup/src/Magento/Setup/Model/ConfigModel.php |  1 +
 setup/src/Magento/Setup/Model/Installer.php   |  1 +
 .../Magento/Setup/Model/InstallerFactory.php  |  2 +-
 .../Test/Unit/Controller/EnvironmentTest.php  |  4 +--
 .../Setup/Test/Unit/Model/ConfigModelTest.php |  4 +--
 .../Test/Unit/Model/InstallerFactoryTest.php  |  4 +--
 .../Setup/Test/Unit/Model/InstallerTest.php   |  4 +--
 11 files changed, 57 insertions(+), 17 deletions(-)
 rename {setup/src/Magento/Setup/Model => lib/internal/Magento/Framework/Setup}/FilePermissions.php (91%)
 rename {setup/src/Magento/Setup/Test/Unit/Model => lib/internal/Magento/Framework/Setup/Test/Unit}/FilePermissionsTest.php (96%)

diff --git a/lib/internal/Magento/Framework/Console/Cli.php b/lib/internal/Magento/Framework/Console/Cli.php
index 299c42eb006..df9b59bad90 100644
--- a/lib/internal/Magento/Framework/Console/Cli.php
+++ b/lib/internal/Magento/Framework/Console/Cli.php
@@ -13,6 +13,7 @@ use Magento\Framework\Shell\ComplexParameter;
 use Symfony\Component\Console\Input\ArgvInput;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
+use Magento\Framework\Setup\FilePermissions;
 
 /**
  * Magento2 CLI Application. This is the hood for all command line tools supported by Magento.
@@ -46,6 +47,22 @@ class Cli extends SymfonyApplication
      */
     public function doRun(InputInterface $input, OutputInterface $output)
     {
+        // Check to make sure var/generation/Magento folder dir have read/execute permission for the current user
+        /** @var \Magento\Setup\Model\ObjectManagerProvider $omProvider */
+        $omProvider = $this->serviceManager->get('Magento\Setup\Model\ObjectManagerProvider');
+        /** @var \Magento\Framework\ObjectManagerInterface $objectManager */
+        $objectManager = $omProvider->get();
+        /** @var \Magento\Framework\Setup\Filepermissions $filePermissions */
+        $filePermissions = $objectManager->get('Magento\Framework\Setup\FilePermissions');
+        if ($filePermissions->checkDirectoryPermissionForCLIUser() === false) {
+            $output->writeln(
+                "<error>Command line user ("
+                . get_current_user()
+                . ") does not have proper permissions for var/generation/Magento directory. "
+                . "Please address this issue before using Magento command line."
+            );
+        }
+
         $exitCode = parent::doRun($input, $output);
         if ($this->initException) {
             $output->writeln(
diff --git a/setup/src/Magento/Setup/Model/FilePermissions.php b/lib/internal/Magento/Framework/Setup/FilePermissions.php
similarity index 91%
rename from setup/src/Magento/Setup/Model/FilePermissions.php
rename to lib/internal/Magento/Framework/Setup/FilePermissions.php
index f1878599078..1e26f9e136d 100644
--- a/setup/src/Magento/Setup/Model/FilePermissions.php
+++ b/lib/internal/Magento/Framework/Setup/FilePermissions.php
@@ -4,7 +4,7 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\Setup\Model;
+namespace Magento\Framework\Setup;
 
 use Magento\Framework\App\Filesystem\DirectoryList;
 use Magento\Framework\Backup\Filesystem\Iterator\Filter;
@@ -203,6 +203,25 @@ class FilePermissions
         return $this->isReadableDirectory($directory) && !$directory->isWritable();
     }
 
+    /**
+     * Checks if var/generation/Magento has
+     * @return bool
+     */
+    public function checkDirectoryPermissionForCLIUser()
+    {
+        $varGenerationMagentoPath = $this->directoryList->getPath(DirectoryList::VAR_DIR)
+            . '/'
+            . DirectoryList::GENERATION
+            . '/'
+            . 'Magento';
+        if (is_dir($varGenerationMagentoPath)
+            && is_readable($varGenerationMagentoPath)
+            && is_executable($varGenerationMagentoPath)) {
+            return true;
+        }
+        return false;
+    }
+
     /**
      * Checks if directory exists and is readable
      *
@@ -211,7 +230,9 @@ class FilePermissions
      */
     protected function isReadableDirectory($directory)
     {
-        if (!$directory->isExist() || !$directory->isDirectory() || !$directory->isReadable()) {
+        if (!$directory->isExist()
+            || !$directory->isDirectory()
+            || !$directory->isReadable()) {
             return false;
         }
         return true;
diff --git a/setup/src/Magento/Setup/Test/Unit/Model/FilePermissionsTest.php b/lib/internal/Magento/Framework/Setup/Test/Unit/FilePermissionsTest.php
similarity index 96%
rename from setup/src/Magento/Setup/Test/Unit/Model/FilePermissionsTest.php
rename to lib/internal/Magento/Framework/Setup/Test/Unit/FilePermissionsTest.php
index 4d803be8ff5..ed4692e7895 100644
--- a/setup/src/Magento/Setup/Test/Unit/Model/FilePermissionsTest.php
+++ b/lib/internal/Magento/Framework/Setup/Test/Unit/FilePermissionsTest.php
@@ -4,9 +4,9 @@
  * See COPYING.txt for license details.
  */
 
-namespace Magento\Setup\Test\Unit\Model;
+namespace Magento\Framework\Setup\Test\Unit;
 
-use \Magento\Setup\Model\FilePermissions;
+use \Magento\Framework\Setup\FilePermissions;
 
 use Magento\Framework\App\Filesystem\DirectoryList;
 
@@ -132,8 +132,8 @@ class FilePermissionsTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * @covers \Magento\Setup\Model\FilePermissions::getMissingWritableDirectoriesForInstallation
-     * @covers \Magento\Setup\Model\FilePermissions::getMissingWritablePathsForInstallation
+     * @covers \Magento\Framework\FilePermissions::getMissingWritableDirectoriesForInstallation
+     * @covers \Magento\Framework\FilePermissions::getMissingWritablePathsForInstallation
      */
     public function testGetMissingWritableDirectoriesAndPathsForInstallation()
     {
diff --git a/setup/src/Magento/Setup/Controller/Environment.php b/setup/src/Magento/Setup/Controller/Environment.php
index 939d2c459ba..ee521072459 100644
--- a/setup/src/Magento/Setup/Controller/Environment.php
+++ b/setup/src/Magento/Setup/Controller/Environment.php
@@ -47,13 +47,13 @@ class Environment extends AbstractActionController
     /**
      * Constructor
      *
-     * @param \Magento\Setup\Model\FilePermissions $permissions
+     * @param \Magento\Framework\Setup\FilePermissions $permissions
      * @param \Magento\Framework\Filesystem $filesystem
      * @param \Magento\Setup\Model\CronScriptReadinessCheck $cronScriptReadinessCheck
      * @param \Magento\Setup\Model\PhpReadinessCheck $phpReadinessCheck
      */
     public function __construct(
-        \Magento\Setup\Model\FilePermissions $permissions,
+        \Magento\Framework\Setup\FilePermissions $permissions,
         \Magento\Framework\Filesystem $filesystem,
         \Magento\Setup\Model\CronScriptReadinessCheck $cronScriptReadinessCheck,
         \Magento\Setup\Model\PhpReadinessCheck $phpReadinessCheck
diff --git a/setup/src/Magento/Setup/Model/ConfigModel.php b/setup/src/Magento/Setup/Model/ConfigModel.php
index 51aefaa354e..f17e2d42d83 100644
--- a/setup/src/Magento/Setup/Model/ConfigModel.php
+++ b/setup/src/Magento/Setup/Model/ConfigModel.php
@@ -10,6 +10,7 @@ use Magento\Framework\App\DeploymentConfig;
 use Magento\Framework\Config\Data\ConfigData;
 use Magento\Framework\App\DeploymentConfig\Writer;
 use Magento\Framework\Setup\Option\AbstractConfigOption;
+use Magento\Framework\Setup\FilePermissions;
 
 class ConfigModel
 {
diff --git a/setup/src/Magento/Setup/Model/Installer.php b/setup/src/Magento/Setup/Model/Installer.php
index 63606fdc811..56d80fbf4c9 100644
--- a/setup/src/Magento/Setup/Model/Installer.php
+++ b/setup/src/Magento/Setup/Model/Installer.php
@@ -38,6 +38,7 @@ use Magento\Setup\Console\Command\InstallCommand;
 use Magento\Setup\Validator\DbValidator;
 use \Magento\Backend\Setup\ConfigOptionsList as BackendConfigOptionsList;
 use Magento\SampleData;
+use Magento\Framework\Setup\FilePermissions;
 
 /**
  * Class Installer contains the logic to install Magento application.
diff --git a/setup/src/Magento/Setup/Model/InstallerFactory.php b/setup/src/Magento/Setup/Model/InstallerFactory.php
index 253c62ef626..05d5783c785 100644
--- a/setup/src/Magento/Setup/Model/InstallerFactory.php
+++ b/setup/src/Magento/Setup/Model/InstallerFactory.php
@@ -50,7 +50,7 @@ class InstallerFactory
     public function create(LoggerInterface $log)
     {
         return new Installer(
-            $this->serviceLocator->get('Magento\Setup\Model\FilePermissions'),
+            $this->serviceLocator->get('Magento\Framework\Setup\FilePermissions'),
             $this->serviceLocator->get('Magento\Framework\App\DeploymentConfig\Writer'),
             $this->serviceLocator->get('Magento\Framework\App\DeploymentConfig\Reader'),
             $this->serviceLocator->get('Magento\Framework\App\DeploymentConfig'),
diff --git a/setup/src/Magento/Setup/Test/Unit/Controller/EnvironmentTest.php b/setup/src/Magento/Setup/Test/Unit/Controller/EnvironmentTest.php
index 205ec1b2682..e92656404ba 100644
--- a/setup/src/Magento/Setup/Test/Unit/Controller/EnvironmentTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Controller/EnvironmentTest.php
@@ -14,7 +14,7 @@ use Zend\View\Model\JsonModel;
 class EnvironmentTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Setup\Model\FilePermissions|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\Setup\FilePermissions|\PHPUnit_Framework_MockObject_MockObject
      */
     private $permissions;
 
@@ -41,7 +41,7 @@ class EnvironmentTest extends \PHPUnit_Framework_TestCase
     public function setUp()
     {
         $this->filesystem = $this->getMock('Magento\Framework\Filesystem', [], [], '', false);
-        $this->permissions = $this->getMock('Magento\Setup\Model\FilePermissions', [], [], '', false);
+        $this->permissions = $this->getMock('Magento\Framework\Setup\FilePermissions', [], [], '', false);
         $this->cronScriptReadinessCheck = $this->getMock(
             'Magento\Setup\Model\CronScriptReadinessCheck',
             [],
diff --git a/setup/src/Magento/Setup/Test/Unit/Model/ConfigModelTest.php b/setup/src/Magento/Setup/Test/Unit/Model/ConfigModelTest.php
index bd162eb1f60..3954da210a7 100644
--- a/setup/src/Magento/Setup/Test/Unit/Model/ConfigModelTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Model/ConfigModelTest.php
@@ -37,7 +37,7 @@ class ConfigModelTest extends \PHPUnit_Framework_TestCase
     private $configData;
 
     /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Setup\Model\FilePermissions
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Setup\FilePermissions
      */
     private $filePermissions;
 
@@ -53,7 +53,7 @@ class ConfigModelTest extends \PHPUnit_Framework_TestCase
         $this->deploymentConfig = $this->getMock('Magento\Framework\App\DeploymentConfig', [], [], '', false);
         $this->configOptionsList = $this->getMock('Magento\Backend\Setup\ConfigOptionsList', [], [], '', false);
         $this->configData = $this->getMock('Magento\Framework\Config\Data\ConfigData', [], [], '', false);
-        $this->filePermissions = $this->getMock('\Magento\Setup\Model\FilePermissions', [], [], '', false);
+        $this->filePermissions = $this->getMock('\Magento\Framework\Setup\FilePermissions', [], [], '', false);
 
         $this->deploymentConfig->expects($this->any())->method('get');
 
diff --git a/setup/src/Magento/Setup/Test/Unit/Model/InstallerFactoryTest.php b/setup/src/Magento/Setup/Test/Unit/Model/InstallerFactoryTest.php
index c2927df015d..aeb5d00f3bd 100644
--- a/setup/src/Magento/Setup/Test/Unit/Model/InstallerFactoryTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Model/InstallerFactoryTest.php
@@ -14,8 +14,8 @@ class InstallerFactoryTest extends \PHPUnit_Framework_TestCase
     {
         $returnValueMap = [
             [
-                'Magento\Setup\Model\FilePermissions',
-                $this->getMock('Magento\Setup\Model\FilePermissions', [], [], '', false),
+                'Magento\Framework\Setup\FilePermissions',
+                $this->getMock('Magento\Framework\Setup\FilePermissions', [], [], '', false),
             ],
             [
                 'Magento\Framework\App\DeploymentConfig\Writer',
diff --git a/setup/src/Magento/Setup/Test/Unit/Model/InstallerTest.php b/setup/src/Magento/Setup/Test/Unit/Model/InstallerTest.php
index f415c5c19db..ebd999a84d6 100644
--- a/setup/src/Magento/Setup/Test/Unit/Model/InstallerTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Model/InstallerTest.php
@@ -27,7 +27,7 @@ class InstallerTest extends \PHPUnit_Framework_TestCase
     private $object;
 
     /**
-     * @var \Magento\Setup\Model\FilePermissions|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\Setup\FilePermissions|\PHPUnit_Framework_MockObject_MockObject
      */
     private $filePermissions;
 
@@ -150,7 +150,7 @@ class InstallerTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
-        $this->filePermissions = $this->getMock('Magento\Setup\Model\FilePermissions', [], [], '', false);
+        $this->filePermissions = $this->getMock('Magento\Framework\Setup\FilePermissions', [], [], '', false);
         $this->configWriter = $this->getMock('Magento\Framework\App\DeploymentConfig\Writer', [], [], '', false);
         $this->configReader = $this->getMock('Magento\Framework\App\DeploymentConfig\Reader', [], [], '', false);
         $this->config = $this->getMock('Magento\Framework\App\DeploymentConfig', [], [], '', false);
-- 
GitLab