ComposerRequireCommand.php 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <?php
  2. namespace FD3;
  3. use Symfony\Component\Console\Command\Command;
  4. use Symfony\Component\Console\Input\InputInterface;
  5. use Symfony\Component\Console\Input\InputArgument;
  6. use Symfony\Component\Console\Input\InputOption;
  7. use Symfony\Component\Console\Output\OutputInterface;
  8. class ComposerRequireCommand extends Command
  9. {
  10. protected function configure()
  11. {
  12. $this
  13. ->setName('composer:require')
  14. ->setDescription('Tag all composer software using a ini file.')
  15. ->setHelp('This command allows you to tag and change the required code on the composer.json file...')
  16. ->addArgument('ini_file', InputArgument::REQUIRED, 'The ini file from where to get the source code config.')
  17. ->addArgument('packages', InputArgument::REQUIRED, 'Tag the required packages (suggested value : ik/*).')
  18. ->addArgument('version', InputArgument::REQUIRED, 'Use the version expression.')
  19. ->addOption('composer_update', null, InputOption::VALUE_OPTIONAL, 'If true, run "docker-compose run ... bin/composer-update.sh" to generate composer.lock', 'true')
  20. ->addOption('pull', null, InputOption::VALUE_OPTIONAL, 'Indicates branch to pull for every modules', '');
  21. }
  22. protected function execute(InputInterface $input, OutputInterface $output)
  23. {
  24. $dockerCompose = $input->getOption("composer_update");
  25. $pull = $input->getOption("pull");
  26. $file = $input->getArgument("ini_file");
  27. $packages = $input->getArgument("packages");
  28. $new_version = $input->getArgument("version");
  29. $realpath = realpath($file);
  30. $dirname = dirname($realpath);
  31. if (!chdir($dirname)) {
  32. throw new \Exception("Can't change working directory to " . $dirname);
  33. }
  34. $content = parse_ini_file($realpath, true);
  35. foreach ($content as $sec => $conf) {
  36. $composer_file = $sec . "/composer.json";
  37. if (file_exists($composer_file)) {
  38. $output->writeln($sec);
  39. $composer_data = json_decode(file_get_contents($composer_file), true);
  40. try {
  41. foreach (array("require", "require-dev") as $k) {
  42. $output->writeln('Ejecutando:');
  43. $output->writeln('\tgit stash; git checkout master; git pull origin master');
  44. shell_exec('cd ' . $sec . '; git stash; git checkout master; git pull origin master');
  45. if (strlen($pull) > 0) {
  46. $output->writeln('\tgit pull origin ' . $pull);
  47. shell_exec('cd ' . $sec . '; git pull origin ' . $pull);
  48. }
  49. $output->writeln('\tReemplazo composer.json');
  50. foreach ($composer_data[$k] as $package => $version) {
  51. if (strpos($packages, "*") !== false) {
  52. $preg = "|^" . str_replace("*", "[^\b]*", $packages) . "$|";
  53. if (preg_match($preg, $package)) {
  54. $composer_data[$k][$package] = (string)$new_version;
  55. $output->writeln("\t\t" . $package . " = " . $new_version);
  56. }
  57. } else {
  58. if (strcmp($packages, $package) === 0) {
  59. $composer_data[$k][$package] = (string)$new_version;
  60. $output->writeln("\t\t" . $package . " = " . $new_version);
  61. }
  62. }
  63. }
  64. }
  65. file_put_contents($composer_file, json_encode($composer_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
  66. if ($dockerCompose) {
  67. $output->writeln('Composer update');
  68. $output->writeln('\tdocker-compose exec ' . $sec . ' bin/composer-update.sh');
  69. shell_exec('docker-compose exec ' . $sec . ' bin/composer-update.sh');
  70. }
  71. } catch (Throwable $t) {
  72. $output->writeln('Se produjo un error. Reestableciendo datos.');
  73. $output->writeln('\tcd ' . $sec . '; git reset');
  74. $shell_exec('cd ' . $sec . '; git reset');
  75. }
  76. } else {
  77. $output->writeln($sec . " no composer.json found");
  78. }
  79. }
  80. }
  81. }