/plugins/CoreConsole/Commands/GitCommit.php
PHP | 142 lines | 103 code | 25 blank | 14 comment | 12 complexity | 6a5690831ecafe23030009506a9cf9bd MD5 | raw file
Possible License(s): LGPL-3.0, JSON, MIT, GPL-3.0, LGPL-2.1, GPL-2.0, AGPL-1.0, BSD-2-Clause, BSD-3-Clause
- <?php
- /**
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
- namespace Piwik\Plugins\CoreConsole\Commands;
- use Piwik\Plugin\ConsoleCommand;
- use Symfony\Component\Console\Input\InputArgument;
- use Symfony\Component\Console\Input\InputInterface;
- use Symfony\Component\Console\Input\InputOption;
- use Symfony\Component\Console\Output\OutputInterface;
- /**
- */
- class GitCommit extends ConsoleCommand
- {
- protected function configure()
- {
- $this->setName('git:commit')
- ->setDescription('Commit')
- ->addOption('message', 'm', InputOption::VALUE_REQUIRED, 'Commit Message');
- }
- protected function execute(InputInterface $input, OutputInterface $output)
- {
- $submodules = $this->getSubmodulePaths();
- foreach ($submodules as $submodule) {
- if (empty($submodule)) {
- continue;
- }
- $status = $this->getStatusOfSubmodule($submodule);
- if (false !== strpos($status, '?? ')) {
- $output->writeln(sprintf('<error>%s has untracked files or folders. Delete or add them and try again.</error>', $submodule));
- $output->writeln('<error>Status:</error>');
- $output->writeln(sprintf('<comment>%s</comment>', $status));
- return;
- }
- }
- $commitMessage = $input->getOption('message');
- if (empty($commitMessage)) {
- $output->writeln('No message specified. Use option -m or --message.');
- return;
- }
- if (!$this->hasChangesToBeCommitted()) {
- $dialog = $this->getHelperSet()->get('dialog');
- $question = '<question>There are no changes to be commited in the super repo, do you just want to commit and converge submodules?</question>';
- if (!$dialog->askConfirmation($output, $question, false)) {
- $output->writeln('<info>Cool, nothing done. Stage files using "git add" and try again.</info>');
- return;
- }
- }
- foreach ($submodules as $submodule) {
- if (empty($submodule)) {
- continue;
- }
- $status = $this->getStatusOfSubmodule($submodule);
- if (empty($status)) {
- $output->writeln(sprintf('%s has no changes, will ignore', $submodule));
- continue;
- }
- $cmd = sprintf('cd %s/%s && git pull && git add . && git commit -am "%s"', PIWIK_DOCUMENT_ROOT, $submodule, $commitMessage);
- $this->passthru($cmd, $output);
- }
- if ($this->hasChangesToBeCommitted()) {
- $cmd = sprintf('cd %s && git commit -m "%s"', PIWIK_DOCUMENT_ROOT, $commitMessage);
- $this->passthru($cmd, $output);
- }
- foreach ($submodules as $submodule) {
- if (empty($submodule)) {
- continue;
- }
- $cmd = sprintf('cd %s && git add %s', PIWIK_DOCUMENT_ROOT, $submodule);
- $this->passthru($cmd, $output);
- }
- if ($this->hasChangesToBeCommitted()) {
- $cmd = sprintf('cd %s && git commit -m "Updating submodules"', PIWIK_DOCUMENT_ROOT);
- $this->passthru($cmd, $output);
- }
- }
- private function passthru($cmd, OutputInterface $output)
- {
- $output->writeln('Executing command: ' . $cmd);
- passthru($cmd);
- }
- private function hasChangesToBeCommitted()
- {
- $cmd = sprintf('cd %s && git status --porcelain', PIWIK_DOCUMENT_ROOT);
- $result = shell_exec($cmd);
- $result = trim($result);
- if (false !== strpos($result, 'M ')) {
- // stages
- return true;
- }
- if (false !== strpos($result, 'MM ')) {
- // staged and modified
- return true;
- }
- return false;
- }
- /**
- * @return array
- */
- private function getSubmodulePaths()
- {
- $cmd = sprintf("grep path .gitmodules | sed 's/.*= //'");
- $submodules = shell_exec($cmd);
- $submodules = explode("\n", $submodules);
- return $submodules;
- }
- protected function getStatusOfSubmodule($submodule)
- {
- $cmd = sprintf('cd %s/%s && git status --porcelain', PIWIK_DOCUMENT_ROOT, $submodule);
- $status = trim(shell_exec($cmd));
- return $status;
- }
- }