#!/usr/bin/env php
<?php
namespace vierbergenlars\SemVer\Application\UpdateVersions;
require __DIR__ . '/../vendor/autoload.php';
use vierbergenlars\SemVer\version;
use vierbergenlars\SemVer\expression;
use vierbergenlars\SemVer\SemVerException;
//Defaults
/**
* Input file containing the version
* @var string
*/
$input = 'composer.json';
/**
* Array of paths to write to
* @var array
*/
$writeto = array();
/**
* Root directory
* @var string
*/
$root = '.';
/**
* Do not do anything
* @var bool
*/
$dry_run = false;
/**
* Shell command to execute for each updated file
* @var string
*/
$shell = NULL;
// Get all arguments
while (\count($argv) > 0) {
$arg = \array_shift($argv);
switch ($arg) {
case '-p':
case '--package':
$input = \array_shift($argv);
break;
case '-s':
case '--source':
$writeto[] = \array_shift($argv);
break;
case '-b':
case '--base':
$root = \array_shift($argv);
break;
case '--dry-run':
$dry_run = true;
break;
case '--shell':
$shell = \array_shift($argv);
break;
case '-h':
case '--help':
help();
}
}
//Defaults writeto
if ($writeto === array()) {
$writeto = array('src', 'bin');
}
//Add root paths
$input = $root . '/' . $input;
foreach ($writeto as &$write) {
$write = $root . '/' . $write;
}
//Read those JSON files
if (!\file_exists($input))
fail('Package file does not exist');
$input = \json_decode(\file_get_contents($input), true);
if (!$input) {
fail('Invalid JSON file!');
}
//Initialize the version from package file
try {
$version = new version($input['version']);
} catch (SemVerException $e) {
fail($e->getMessage());
}
$version = $version->getString();
foreach ($writeto as $output) {
$dir = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($output));
foreach ($dir as $file) {
if (\preg_match('/[\\\\\\/]\\./', $file))
continue; //Ignore . directories
$contents1 = \file_get_contents($file);
$contents2 = \str_replace(array('2.0.0--', '{{{' . 'version}}}'), $version, $contents1);
if ($contents1 != $contents2) {
fwrite(\STDOUT, 'Writing version information to file ' . $file . \PHP_EOL);
if ($shell !== null) {
\system($shell . ' "' . $file . '"', $exit_code);
if ($exit_code != 0)
fail('Subshell exited ' . $exit_code);
}
if ($dry_run) {
\fwrite(\STDOUT, '\\_Not writing to disk' . \PHP_EOL);
} else {
\file_put_contents($file, $contents2);
}
}
}
}
function help() {
$e = array(
'Usage: update-versions [options]'
, ''
, ' -p <composerfile> Use this file as composer.json file'
, ' --package <composerfile>'
, ' -s <dir> Add directory to sources to scan. May be repeated.'
, ' --source <dir>'
, ' -b <dir> Use this directory as base directory.'
, ' --base <dir>'
, ' --shell <command> Execute <command> for each changed file.'
, ' --dry-run Do not write files.'
, ''
, 'This program exits 0 on success or 1 on failure.'
, 'Defaults to "--package composer.json --source src --source bin --base ."'
);
echo \implode(PHP_EOL, $e);
exit;
}
function fail($message = '') {
\fwrite(\STDERR, $message . \PHP_EOL);
exit(1);
}
|