ComposerRequireCommand.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. if (strlen($pull) > 0) {
  43. shell_exec('cd ' . $sec . '; git stash; git checkout master; git pull origin ' . $pull);
  44. }
  45. foreach ($composer_data[$k] as $package => $version) {
  46. if (strpos($packages, "*") !== false) {
  47. $preg = "|^" . str_replace("*", "[^\b]*", $packages) . "$|";
  48. if (preg_match($preg, $package)) {
  49. $composer_data[$k][$package] = (string)$new_version;
  50. $output->writeln("\t" . $package . " = " . $new_version);
  51. }
  52. } else {
  53. if (strcmp($packages, $package) === 0) {
  54. $composer_data[$k][$package] = (string)$new_version;
  55. $output->writeln("\t" . $package . " = " . $new_version);
  56. }
  57. }
  58. }
  59. }
  60. file_put_contents($composer_file, json_encode($composer_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
  61. if ($dockerCompose) {
  62. shell_exec('docker-compose exec ' . $sec . ' bin/composer-update.sh');
  63. }
  64. } catch (Throwable $t) {
  65. $output->writeln("Se produjo un error. Reestableciendo datos. ");
  66. $shell_exec(i'cd ' . $sec . '; git reset');
  67. }
  68. } else {
  69. $output->writeln($sec . " no composer.json found");
  70. }
  71. }
  72. }
  73. }