Beispiel #1
0
 protected function interact(InputInterface $input, OutputInterface $output)
 {
     $helper = $this->getHelper('question');
     $this->selectedSchema = $input->getArgument('name');
     if (!array_key_exists($this->selectedSchema, $this->schemaList)) {
         $question = new ChoiceQuestion('Please select of of the following templates:', array_keys($this->schemaList));
         $validator = function ($answer) use($output) {
             if (!array_key_exists($answer, $this->schemaList)) {
                 throw new \RuntimeException('The name of the template not found');
             }
             return $answer;
         };
         $question->setValidator($validator);
         $question->setMaxAttempts(2);
         $this->selectedSchema = $helper->ask($input, $output, $question);
     }
     $schema = $this->schemaList[$this->selectedSchema];
     foreach ($schema->getUndefinedVariables() as $var) {
         $question = new Question(sprintf('Please enter value for variable %s:', $var));
         $answer = $helper->ask($input, $output, $question);
         $schema->setVariable($var, $answer);
     }
     $dir = $input->getOption('dir');
     if (!$dir) {
         $dir = str_replace('\\', '/', $schema->getVariable('NAMESPACE'));
     }
     $this->selectedDir = trim($dir, '/\\');
 }
 protected function interact(InputInterface $input, OutputInterface $output)
 {
     $this->metadata = [];
     $dialog = $this->getDialogHelper();
     $moduleHandler = $this->getModuleHandler();
     $drupal = $this->getDrupalHelper();
     $questionHelper = $this->getQuestionHelper();
     // --module option
     $module = $input->getOption('module');
     if (!$module) {
         // @see Drupal\Console\Command\ModuleTrait::moduleQuestion
         $module = $this->moduleQuestion($output, $dialog);
     }
     $input->setOption('module', $module);
     // --class-name option
     $form_id = $input->getOption('form-id');
     if (!$form_id) {
         $forms = [];
         // Get form ids from webprofiler
         if ($moduleHandler->moduleExists('webprofiler')) {
             $output->writeln('[-] <info>' . $this->trans('commands.generate.form.alter.messages.loading-forms') . '</info>');
             $forms = $this->getWebprofilerForms();
         }
         if (!empty($forms)) {
             $form_id = $dialog->askAndValidate($output, $dialog->getQuestion($this->trans('commands.generate.form.alter.options.form-id'), current(array_keys($forms))), function ($form) {
                 return $form;
             }, false, '', array_combine(array_keys($forms), array_keys($forms)));
         }
     }
     if ($moduleHandler->moduleExists('webprofiler') && isset($forms[$form_id])) {
         $this->metadata['class'] = $forms[$form_id]['class']['class'];
         $this->metadata['method'] = $forms[$form_id]['class']['method'];
         $this->metadata['file'] = str_replace($drupal->getRoot(), '', $forms[$form_id]['class']['file']);
         $formItems = array_keys($forms[$form_id]['form']);
         $question = new ChoiceQuestion($this->trans('commands.generate.form.alter.messages.hide-form-elements'), array_combine($formItems, $formItems), '0');
         $question->setMultiselect(true);
         $question->setValidator(function ($answer) {
             return $answer;
         });
         $formItemsToHide = $questionHelper->ask($input, $output, $question);
         $this->metadata['unset'] = array_filter(array_map('trim', explode(',', $formItemsToHide)));
     }
     $input->setOption('form-id', $form_id);
     $output->writeln($this->trans('commands.generate.form.alter.messages.inputs'));
     // @see Drupal\Console\Command\FormTrait::formQuestion
     $form = $this->formQuestion($output, $dialog);
     $input->setOption('inputs', $form);
 }
 /**
  * Interacts with the user.
  *
  * @param InputInterface $input The input
  * @param OutputInterface $output The output
  *
  * @throws \InvalidArgumentException
  *
  * @return void
  */
 protected function interact(InputInterface $input, OutputInterface $output)
 {
     if (!$input->getArgument('username')) {
         $question = new Question('Please choose a username:'******'Username can not be empty');
             }
             return $username;
         });
         $username = $this->getHelper('question')->ask($input, $output, $question);
         $input->setArgument('username', $username);
     }
     if (!$input->getArgument('email')) {
         $question = new Question('Please choose an email:');
         $question->setValidator(function ($email) {
             //TODO: we might want to check if its an actual email address ..?
             if (null === $email) {
                 throw new \InvalidArgumentException('Email can not be empty');
             }
             return $email;
         });
         $email = $this->getHelper('question')->ask($input, $output, $question);
         $input->setArgument('email', $email);
     }
     if (!$input->getArgument('password')) {
         $question = new Question('Please choose a password:'******'Password can not be empty');
             }
             return $password;
         });
         $password = $this->getHelper('question')->ask($input, $output, $question);
         $input->setArgument('password', $password);
     }
     if (!$input->getArgument('locale')) {
         $locale = $this->getHelper('question')->ask($input, $output, new Question('Please enter the locale (or leave empty for default admin locale):'));
         $input->setArgument('locale', $locale);
     }
     $groups = $this->getContainer()->get('fos_user.group_manager')->findGroups();
     if (!$input->getOption('group')) {
         $question = new ChoiceQuestion('Please enter the group(s) the user should be a member of (multiple possible, separated by comma):', $groups, '');
         $question->setMultiselect(true);
         $question->setValidator(function ($groups) {
             if ($groups === '') {
                 throw new \RuntimeException('Group(s) must be of type integer and can not be empty');
             }
             return $groups;
         });
         // Group has to be imploded because $input->setOption expects a string
         $groups = $this->getHelper('question')->ask($input, $output, $question);
         $input->setOption('group', $groups);
     }
 }
Beispiel #4
0
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        // -> We check if there is already an app instance, else we
        // can not configure git-deployer yet
        $hasStorage = false;
        try {
            // -> We need to throw an error if we're loggin in to another
            // service than the currently logged in!
            $instance = \GitDeployer\AppInstance::getInstance();
            $storageService = $instance->storage();
            if (is_object($storageService) && $storageService instanceof \GitDeployer\Storage\BaseStorage) {
                $hasStorage = str_replace(array('GitDeployer\\Storage\\', 'Storage'), array('', ''), get_class($storageService));
            }
        } catch (\Exception $e) {
            throw new \RuntimeException('Please log-in to a service first!');
        }
        $output->writeln(<<<INTRO
Welcome to the configuration wizard for Git-Deployer!
Let's get started!

INTRO
);
        // -> Storage service
        // Get available storage services to display to the user
        $services = \GitDeployer\Storage\BaseStorage::getStorageServicesForHelp();
        $output->writeln(<<<INTRO
First, you will need to configure a <info>storage service</info>:

        A <info>storage service</info> is responsible of storing Git-Deployer's state,
    i   such as what repositories are deployed, which version/tag was deployed, where
        they are deployed, etc...

The following <info>storage services</info> exist in this build:

<comment>{$services}</comment>
INTRO
);
        $services = \GitDeployer\Storage\BaseStorage::getStorageServicesForIterating();
        $default = $hasStorage ? array_search($hasStorage, $services) : 0;
        $helper = $this->getHelper('question');
        // -> Get storage service to use
        $question = new ChoiceQuestion('Which storage service would you like to use?', $services, $default);
        $question->setValidator(function ($answer) use($services) {
            if (!isset($services[$answer])) {
                throw new \RuntimeException('Please select a correct value!');
            }
            return $answer;
        });
        $number = $helper->ask($input, $output, $question);
        // If we selected the already existing storage instance, load
        // it up so we can see the already defined values
        if ($hasStorage && $number == $default) {
            $storageService->setInstances($input, $output, $this->getHelperSet());
        } else {
            $storageService = \GitDeployer\Storage\BaseStorage::createServiceInstance($services[$number], $input, $output, $this->getHelperSet());
        }
        // -> Now that we have a storage service, add this to
        // the AppInstance, to be opened later again
        if ($storageService->configure()) {
            $instance->storage($storageService)->save();
        }
        $output->writeln(<<<OUTRO

This finishes the configuration of Git-Deployer!
Thank you!
OUTRO
);
    }
 private function chooseIncludeExamples()
 {
     $default = 'i';
     $choices = ['i' => 'Include examples', 'e' => 'Export to a separate file', 's' => 'Skip examples'];
     $question = new ChoiceQuestion("Do you want to include code examples (default: {$default})?", $choices, $default);
     $question->setMultiselect(false);
     $question->setAutocompleterValues(null);
     $question->setValidator(function ($val) {
         return $val;
     });
     return $this->helper->ask($this->input, $this->output, $question);
 }
Beispiel #6
0
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $repository = $input->getArgument('repository');
     $revision = $input->getArgument('revision');
     $configuration = $input->getOption('configuration');
     $bag = $input->getOption('bag');
     $force = $input->getOption('force-redeploy');
     // -> Check that the revision matches what we expect
     preg_match('#^(tag|branch|rev):(.*)#iu', $revision, $matches);
     if (count($matches) < 3) {
         throw new \Exception('You must correctly specify the tag/branch/revision you want to deploy!' . "\n" . 'Check "help deploy" for an explanation.');
     } else {
         $type = $matches[1];
         $version = $matches[2];
     }
     // -> Get logged-in service
     $instance = \GitDeployer\AppInstance::getInstance();
     $appService = $instance->service();
     $appService->setInstances($input, $output, $this->getHelperSet());
     // .. and storage
     $storage = $instance->storage();
     $hasBeenFound = false;
     $this->showMessage('INIT', 'Getting repository...', $output);
     foreach ($appService->getProjects() as $key => $project) {
         if ($project->name() == $repository) {
             $hasBeenFound = true;
             $status = $storage->getDeploymentStatus($project);
             // -> Check if we have already been added to Git-Deployer yet
             if (!$status->added()) {
                 throw new \Exception('This repository is not yet added to Git-Deployer!' . "\n" . 'Please add it first via the add command.');
             }
             // -> Check we are not deploying the same version again. Ask
             // if we do, so the user can decide
             if ($status->isDeployd()) {
                 if ($status->getDeployedVersion() == $revision && !$force) {
                     $helper = $this->getHelper('question');
                     $question = new ConfirmationQuestion('Version ' . $status->getDeployedVersion() . ' was already deployed on ' . $status->deployedWhen() . '. Continue anyway? (y/[n]) ', false);
                     if (!$helper->ask($input, $output, $question)) {
                         break;
                     }
                 }
             }
             // -> Now clone it to a temp directory, if it doesn't exist already
             $tmpDir = sys_get_temp_dir() . '/git-deploy-' . strtolower($project->name());
             if (\Gitonomy\Git\Admin::isValidRepository($tmpDir)) {
                 $this->showMessage('GIT', 'Pulling latest changes from repository...', $output);
                 $repository = \Gitonomy\Git\Admin::init($tmpDir, false);
                 $repository->run('pull');
             } else {
                 $this->showMessage('GIT', 'Cloning repository...', $output);
                 $repository = \Gitonomy\Git\Admin::cloneTo($tmpDir, $project->url(), false);
             }
             // -> Check out the correct branch/revision/tag
             $this->showMessage('GIT', 'Checking out ' . $revision . '...', $output);
             $wc = $repository->getWorkingCopy();
             $wc->checkout($version);
             // -> Open .deployerfile and parse it
             $this->showMessage('DEPLOY', 'Checking .deployerfile...', $output);
             if (file_exists($tmpDir . '/.deployerfile')) {
                 $deployerfile = json_decode(file_get_contents($tmpDir . '/.deployerfile'));
             } else {
                 throw new \Exception('This repository has no .deployerfile!' . "\n" . 'Please add one first!');
             }
             if ($deployerfile == null) {
                 throw new \Exception('Could not parse .deployerfile: ' . json_last_error_msg() . "\n" . 'Please check that your JSON is valid!');
             }
             // -> Load the correct deployer from the .deployerfile, and fire it up with
             // the correct configuration options
             if (!isset($deployerfile->type)) {
                 throw new \Exception('Could not parse .deployerfile: ' . "\n" . 'Please specify a deployer via the "type" option!');
             }
             if (!isset($deployerfile->configurations) || isset($deployerfile->configurations) && !is_object($deployerfile->configurations)) {
                 throw new \Exception('Could not parse .deployerfile: ' . "\n" . 'Please specify at least one deployment configuration in the "configurations" option!');
             }
             // -> Get available configurations, and if not set, ask the user
             // which configuration to use
             $configs = get_object_vars($deployerfile->configurations);
             if ($configuration == null && count(get_object_vars($deployerfile->configurations)) > 1) {
                 // If no configuration has been specified via command line,
                 // ask the user which one to use
                 $confignames = array();
                 foreach ($configs as $name => $values) {
                     $confignames[] = $name;
                 }
                 // -> Get storage service to use
                 $question = new ChoiceQuestion('Which deployment configuration would you like to use?', $confignames);
                 $question->setValidator(function ($answer) use($configs, $confignames) {
                     if (!isset($configs[$confignames[$answer]])) {
                         throw new \RuntimeException('Please select a correct value!');
                     }
                     return $confignames[$answer];
                 });
                 $configuration = $helper->ask($input, $output, $question);
             } elseif ($configuration != null) {
                 // Try to use the current specified configuration
                 if (!isset($configs[$configuration])) {
                     throw new \Exception('The configuration "' . $configuration . '" was not found in this .deployefile!');
                 }
             } else {
                 foreach ($configs as $name => $values) {
                     $configuration = $name;
                 }
             }
             // -> Merge the current configuration inheritance chain, if any
             if (!isset($deployerfile->inheritance)) {
                 $mergedConfig = json_decode(json_encode($configs[$configuration]), true);
             } else {
                 $chain = $deployerfile->inheritance;
                 $minChainFound = false;
                 $smallerChain = array();
                 foreach ($chain as $key) {
                     if ($key == $configuration) {
                         $minChainFound = true;
                         $smallerChain[] = $key;
                     } else {
                         if ($minChainFound) {
                             $smallerChain[] = $key;
                         }
                     }
                 }
                 if (count($smallerChain) > 1) {
                     $mergedConfig = array();
                     foreach (array_reverse($smallerChain) as $configmerge) {
                         $mergedConfig = array_replace_recursive($mergedConfig, json_decode(json_encode($configs[$configmerge]), true));
                     }
                 } else {
                     $mergedConfig = json_decode(json_encode($configs[$smallerChain[0]]), true);
                 }
             }
             // -> Check if we have saved parameter bags, and offer the user
             // to choose one if so, or use the one provided from the command line
             $xdg = new \XdgBaseDir\Xdg();
             $bagPath = $xdg->getHomeConfigDir() . '/git-deployer';
             if ($bag != null) {
                 if (!file_exists($bagPath . '/' . $project->name() . '-' . $bag . '.bag')) {
                     throw new \Exception('This parameter bag has not been found!' . "\n" . 'Please check your naming!');
                 } else {
                     $answers = unserialize(file_get_contents($bagPath . '/' . $project->name() . '-' . $bag . '.bag'));
                 }
             } else {
                 $availableBags = array();
                 if (file_exists($bagPath)) {
                     $dh = opendir($bagPath);
                     while (($file = readdir($dh)) !== false) {
                         $fileInfo = pathinfo($file);
                         if ($fileInfo['extension'] == 'bag') {
                             if (stristr($fileInfo['filename'], $project->name())) {
                                 $availableBags[] = str_replace($project->name() . '-', '', $fileInfo['filename']);
                             }
                         }
                     }
                     closedir($dh);
                 }
                 if (count($availableBags) > 0) {
                     array_unshift($availableBags, "Don't use a bag");
                     $helper = $this->getHelper('question');
                     $question = new ChoiceQuestion('One or more parameter bags have been found. Which one do you want to use?', $availableBags);
                     $question->setValidator(function ($answer) use($availableBags) {
                         if ($answer == 0) {
                             return false;
                         }
                         if (!isset($availableBags[$answer])) {
                             throw new \RuntimeException('Please select a correct value!');
                         }
                         return $availableBags[$answer];
                     });
                     $parameterBag = $helper->ask($input, $output, $question);
                     if ($parameterBag) {
                         $answers = unserialize(file_get_contents($bagPath . '/' . $project->name() . '-' . $parameterBag . '.bag'));
                     } else {
                         $answers = array();
                     }
                 } else {
                     $answers = array();
                 }
             }
             // -> Replace placeholders in our config using parameter bags
             $bagModified = false;
             if (isset($deployerfile->parameters)) {
                 foreach ($deployerfile->parameters as $key => $questionhelp) {
                     if (!isset($answers[$key])) {
                         $helper = $this->getHelper('question');
                         $question = new Question($questionhelp . ' ');
                         $questionanswer = $helper->ask($input, $output, $question);
                         if ($questionanswer == null) {
                             $answers[$key] = '';
                         } else {
                             $answers[$key] = $questionanswer;
                         }
                         $bagModified = true;
                     }
                 }
                 // -> Ask the user to save this parameter bag
                 if ($bagModified) {
                     $helper = $this->getHelper('question');
                     $question = new ConfirmationQuestion('Do you want to save these answers in a parameter bag for next time? ([y]/n) ', true);
                     if ($helper->ask($input, $output, $question)) {
                         $question = new Question('Please provide a name for the new (or existing, will overwrite) parameter bag: ');
                         $question->setValidator(function ($answer) {
                             if (strlen($answer) < 1) {
                                 throw new \RuntimeException('Please provide a name for this parameter bag!');
                             } else {
                                 if (!preg_match('#\\w+#iu', $answer)) {
                                     throw new \RuntimeException('The name provided for this parameter bag is invalid!');
                                 }
                             }
                             return $answer;
                         });
                         $bagname = $helper->ask($input, $output, $question);
                         // -> Save this bag!
                         $xdg = new \XdgBaseDir\Xdg();
                         $savePath = $xdg->getHomeConfigDir() . '/git-deployer';
                         $saveFile = $savePath . '/' . $project->name() . '-' . $bagname . '.bag';
                         if (!file_exists($savePath)) {
                             mkdir($savePath);
                         }
                         file_put_contents($saveFile, serialize($answers));
                     }
                 }
                 // -> Now traverse the array to replace the values, and as such
                 // get our merged config ready to pass it into the deployer
                 $replacedConfig = $this->replacePlaceholders($mergedConfig, $answers);
             }
             // -> Execute the requested deployer with our merged configuration array
             $deployer = \GitDeployer\Deployers\BaseDeployer::createServiceInstance(ucwords($deployerfile->type), $input, $output, $this->getHelperSet());
             list($statusok, $trace) = $deployer->deploy($project, $tmpDir, $replacedConfig);
             // -> Check if the deployment went well, return any errors,
             // or update the deployment status for the project otherwise
             if ($statusok) {
                 $status->deployedWhen(date('c'));
                 $status->deployedType($type);
                 $status->deployedString($version);
                 $storage->setDeploymentStatus($project, $status);
             } else {
                 $output->writeln($trace);
                 throw new \Exception('Deployment did not completely finish! See trace above.');
             }
             // -> Finish up!
             $this->showMessage('FINISH', '<info>Done!</info>', $output);
             break;
         }
     }
     if (!$hasBeenFound) {
         throw new \Exception('Project "' . $repository . '" could not be found! Please check your spelling!');
     }
 }