protected function execute(InputInterface $input, OutputInterface $output)
{
$changes = shell_exec('git status --porcelain -uno');
if (!empty($changes)) {
$output->writeln("You have uncommited changes. Creating pull request is only available with a clean working directory");
return;
}
$unpushedCommits = shell_exec('git log origin/' . self::GIT_BASE_BRANCH . '..HEAD');
if (!empty($unpushedCommits)) {
$output->writeln("You have unpushed commits. Creating pull request is only available with a clean working directory");
return;
}
chdir(PIWIK_DOCUMENT_ROOT);
shell_exec('
git checkout -f ' . self::GIT_BASE_BRANCH . ' > /dev/null 2>&1
git pull > /dev/null 2>&1
git submodule init > /dev/null 2>&1
git submodule update > /dev/null 2>&1
');
$plugin = $input->getOption('plugin');
if (!empty($plugin)) {
chdir(PIWIK_DOCUMENT_ROOT . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . $plugin);
shell_exec('
git checkout ' . self::GIT_BASE_BRANCH . ' > /dev/null 2>&1
git pull > /dev/null 2>&1
');
}
// check if branch exists localy and track it if not
$branch = shell_exec('git branch | grep translationupdates');
if (empty($branch)) {
shell_exec('git checkout -b translationupdates origin/translationupdates');
}
// switch to branch and update it to latest $GIT_BASE_BRANCH
shell_exec('
git checkout -f translationupdates > /dev/null 2>&1
git reset --hard origin/' . self::GIT_BASE_BRANCH . ' > /dev/null 2>&1
git push origin translationupdates > /dev/null 2>&1
');
// update translation files
$command = $this->getApplication()->find('translations:update');
$arguments = array('command' => 'translations:update', '--username' => $input->getOption('username'), '--password' => $input->getOption('password'), '--plugin' => $plugin);
$inputObject = new ArrayInput($arguments);
$inputObject->setInteractive($input->isInteractive());
$command->run($inputObject, $output);
shell_exec('git add lang/. > /dev/null 2>&1');
if (empty($plugin)) {
foreach (Update::getPluginsInCore() as $pluginName) {
shell_exec(sprintf('git add plugins/%s/lang/. > /dev/null 2>&1', $pluginName));
}
}
$changes = shell_exec('git status --porcelain -uno');
if (empty($changes)) {
$output->writeln("Nothing changed. Everything is already up to date.");
shell_exec('git checkout ' . self::GIT_BASE_BRANCH . ' > /dev/null 2>&1');
return;
}
API::unsetInstance();
// reset languagemanager api (to force refresh of data)
$stats = shell_exec('git diff --numstat HEAD');
preg_match_all('/([0-9]+)\\t([0-9]+)\\t[a-zA-Z\\/]*lang\\/([a-z]{2,3}(?:-[a-z]{2,3})?)\\.json/', $stats, $lineChanges);
$addedLinesSum = 0;
if (!empty($lineChanges[1])) {
$addedLinesSum = array_sum($lineChanges[1]);
}
$linesSumByLang = array();
$lineChangesCount = count($lineChanges[0]);
for ($i = 0; $i < $lineChangesCount; $i++) {
@($linesSumByLang[$lineChanges[3][$i]] += $lineChanges[1][$i]);
}
preg_match_all('/M [a-zA-Z\\/]*lang\\/([a-z]{2,3}(?:-[a-z]{2,3})?)\\.json/', $changes, $modifiedFiles);
preg_match_all('/A [a-zA-Z\\/]*lang\\/([a-z]{2,3}(?:-[a-z]{2,3})?)\\.json/', $changes, $addedFiles);
$messages = array();
$languageCodesTouched = array();
if (!empty($addedFiles[1])) {
foreach ($addedFiles[1] as $addedFile) {
$languageInfo = $this->getLanguageInfoByIsoCode($addedFile);
$messages[$addedFile] = sprintf('- Added %s (%s changes / %s translated)\\n', $languageInfo['english_name'], $linesSumByLang[$addedFile], $languageInfo['percentage_complete']);
}
$languageCodesTouched = array_merge($languageCodesTouched, $addedFiles[1]);
}
if (!empty($modifiedFiles[1])) {
foreach ($modifiedFiles[1] as $modifiedFile) {
if ($linesSumByLang[$modifiedFile]) {
$languageInfo = $this->getLanguageInfoByIsoCode($modifiedFile);
$messages[$modifiedFile] = sprintf('- Updated %s (%s changes / %s translated)\\n', $languageInfo['english_name'], $linesSumByLang[$modifiedFile], $languageInfo['percentage_complete']);
}
}
$languageCodesTouched = array_merge($languageCodesTouched, $modifiedFiles[1]);
}
$message = implode('', $messages);
$message .= '\\n\\nHelp us translate Piwik in your language!\\nSignup at https://www.transifex.com/piwik/piwik/\\nIf you have any questions, get in touch with us at [email protected]';
$languageCodesTouched = array_unique($languageCodesTouched, SORT_REGULAR);
$title = sprintf('Updated %s strings in %u languages (%s)', $addedLinesSum, count($languageCodesTouched), implode(', ', $languageCodesTouched));
shell_exec('git commit -m "language update ${pluginName}"');
shell_exec('git push');
shell_exec('git checkout ' . self::GIT_BASE_BRANCH . ' > /dev/null 2>&1');
$this->createPullRequest($output, $title, $message);
}