#!/usr/bin/env php 
<?php 
 
namespace vierbergenlars\SemVer\Application\SemVer; 
 
require __DIR__ . '/../vendor/autoload.php'; 
 
use vierbergenlars\SemVer\version; 
use vierbergenlars\SemVer\expression; 
use vierbergenlars\SemVer\SemVerException; 
 
$version = false; 
$range = array(); 
$increment = false; 
 
// Get all arguments 
while (\count($argv) > 0) { 
    $arg = \array_shift($argv); 
    switch ($arg) { 
        case '-v': 
        case '--version': 
            $version[] = \array_shift($argv); 
            break; 
        case '-r': 
        case '--range': 
            $range[] = \array_shift($argv); 
            break; 
        case '-i': 
        case '--increment': 
            $increment = \array_shift($argv); 
            break; 
        case '-?': 
        case '-h': 
        case '--help': 
            help(); 
            break; 
    } 
} 
main(); 
 
function help() { 
    $e = array( 
        'Usage: semver -v|--version <version> [options]' 
        , '' 
        , '  -r <range>            Test if version satisfies the supplied range.' 
        , '  --range <range>' 
        , '  -i [major|minor|patch|build]    Increment the given version number.' 
        , '  --increment [major|minor|patch|build]' 
        , '' 
        , 'Multiple versions or ranges may be supplied.' 
        , '' 
        , 'Program exits successfully if any valid version satisfies' 
        , 'all supplied ranges, and prints all satisfying versions.' 
        , '' 
        , 'If no versions are valid, or ranges are not satisfied,' 
        , 'then exits failure.' 
        , '' 
        , 'Versions are printed in ascending order, so supplying' 
        , 'multiple versions to the utility will just sort them.' 
    ); 
    echo \implode(PHP_EOL, $e); 
    exit; 
} 
 
function main() { 
    global $version, $range, $increment; 
    if ($increment !== false) { 
        increment($version[0], $increment); 
    } 
    if ($version !== false) { 
        filter($version, $range); 
    } 
    help(); 
} 
 
function fail($message = '') { 
    fwrite(STDERR, $message); 
    exit(1); 
} 
 
function increment($version, $what) { 
    if (\file_exists($version)) 
        $version = \file_get_contents($version); 
    if ($version == '-') 
        $version = \fgets(STDIN); 
    try { 
        $v = new version($version); 
        echo $v->inc($what); 
        exit; 
    } catch (SemVerException $e) { 
        fail($e->getMessage()); 
    } 
} 
 
function filter($versions, $ranges) { 
    if (\file_exists($versions[0])) 
        $versions = \file($versions[0], \FILE_IGNORE_NEW_LINES | \FILE_SKIP_EMPTY_LINES); 
    if ($versions[0] == '-') { 
        unset($versions[0]); 
        while ($version = \fgets(\STDIN)) { 
            $versions[] = $version; 
        } 
    } 
    $matching_versions = array(); 
    foreach ($versions as $version) { 
        $ok = true; 
        try { 
            $v = new version($version); 
            foreach ($ranges as $range) { 
                if ($v->satisfies(new versionExpression($range))) 
                    continue; 
                $ok = false; 
                break; 
            } 
            if ($ok) 
                $matching_versions[] = $v; 
        } catch (SemVerException $e) { 
 
        } 
    } 
    \usort($matching_versions, '\\vierbergenlars\\SemVer\\version::compare'); 
    foreach ($matching_versions as $version) { 
        echo $version . PHP_EOL; 
    } 
    if (\count($matching_versions) == 0) 
        fail(); 
    exit; 
} 
 
 |