setName('get:source') ->setDescription('Get the source using a ini file.') ->setHelp('This command allows you to fetch code based on the git.ini file configuration...') ->addArgument('ini_file', InputArgument::REQUIRED, 'The ini file from where to get the source code config.') ->addOption('remote-name', null, InputOption::VALUE_REQUIRED, 'Rename the remote to this name.', "upstream") ->addOption('push', null, InputOption::VALUE_NONE, 'Push to the remote.') ->addOption('timeout', null, InputOption::VALUE_OPTIONAL, 'Git process timeout in seconds', 10) ->addOption('branch', null, InputOption::VALUE_OPTIONAL, 'get a diferente branch from the specified on the ini-file', ""); } protected function execute(InputInterface $input, OutputInterface $output) { $file = $input->getArgument("ini_file"); $realpath = realpath($file); $dirname = dirname($realpath); if (!chdir($dirname)) { throw new \Exception("Can't change working directory to " . $dirname); } $content = parse_ini_file($realpath, true); foreach ($content as $sec => $conf) { $git = new Git(); $git->setTimeout($input->getOption("timeout")); $git_path = $dirname . '/' . $sec; $url = $conf["url"]; // Verifico si tiene ssh como protocolo y si la url es de gogs $url_info = parse_url($url); if (isset($url_info["host"]) and (!isset($url_info["scheme"]) or empty($url_info["scheme"]))) { $protocol = 'ssh://'; $url = $protocol . $url; } try { $output->writeln($url . " -> " . $git_path); $git->clone($url, $git_path); } catch (GitException $e) { $git->init($git_path); } $git->setRepository($git_path); try { $git->remote->rm($input->getOption("remote-name")); } catch (GitException $e) { } $git->remote->add($input->getOption("remote-name"), $url); try { $git->fetch($input->getOption("remote-name")); } catch (GitException $e) { $output->writeln("" . $e->getMessage() . ""); } $branch_from_options = $input->getOption("branch"); if (!empty($branch_from_options)) { $git->checkout($branch_from_options); $conf["branch"] = $branch_from_options; } else { $git->checkout($conf["branch"]); } $branches = $git->branch(array("all" => false, "remotes" => true)); if (isset($branches["remotes/" . $input->getOption("remote-name") . "/" . $conf["branch"]])) { $git->merge($input->getOption("remote-name") . "/" . $conf["branch"]); } $status = $git->status(); if (isset($status["changes"]) and !empty($status["changes"])) { foreach ($status["changes"] as $change) { $output->writeln("\t" . $change["file"] . " is not commited"); } } else if ($input->getOption("push")) { $git->push($input->getOption("remote-name"), $conf["branch"]); foreach ($git->tag() as $tag) { $git->push($input->getOption("remote-name"), $tag, array('force' => true)); } } } } }