22
33use strict;
44use warnings;
5- use feature qw( say) ;
5+ use feature qw( say switch ) ;
66use Scalar::Util qw( looks_like_number) ;
77use List::Util qw( max) ;
8+ use Getopt::Long qw( GetOptionsFromArray) ;
9+ no if $] >= 5.018, warnings => qw( experimental::smartmatch) ;
810
911# Regex from semver.org: https://github.com/semver/semver/pull/460
1012my $semver_regex = ' ^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$' ;
@@ -25,19 +27,15 @@ sub usage() {
2527 say STDERR " $program decrement-major <version>" ;
2628 say STDERR " $program decrement-minor <version>" ;
2729 say STDERR " $program decrement-patch <version>" ;
28- say STDERR " $program get-major <version>" ;
29- say STDERR " $program get-minor <version>" ;
30- say STDERR " $program get-patch <version>" ;
31- say STDERR " $program get-prerelease <version>" ;
32- say STDERR " $program get-build <version>" ;
30+ say STDERR " $program get [--major | --minor | --patch | --prerelease | --build] <version>" ;
3331 say STDERR " $program grep -" ;
3432 say STDERR " $program increment-major <version>" ;
3533 say STDERR " $program increment-minor <version>" ;
3634 say STDERR " $program increment-patch <version>" ;
3735 say STDERR " $program init" ;
38- say STDERR " $program sort [-r | --reverse ] -" ;
36+ say STDERR " $program sort [-r] -" ;
3937 say STDERR " $program validate <string>" ;
40- say STDERR " $program [-h | --help ]" ;
38+ say STDERR " $program [-h]" ;
4139 say STDERR " " ;
4240 say STDERR " Options:" ;
4341 say STDERR " -h --help Show this help screen." ;
@@ -205,6 +203,28 @@ sub semver::decrement_patch {
205203 }
206204}
207205
206+ sub semver ::get {
207+ my ($version ) = @_ ;
208+
209+ my @matches = semver_get($version );
210+
211+ my $major = $matches [0];
212+ my $minor = $matches [1];
213+ my $patch = $matches [2];
214+ my $prerelease = $matches [3];
215+ my $build = $matches [4];
216+
217+ print $major . " \t " . $minor . " \t " . $patch ;
218+
219+ if ($build ) {
220+ print " \t " . ($prerelease // ' ' ) . " \t " . $build ;
221+ } elsif ($prerelease ) {
222+ print " \t " . $prerelease ;
223+ }
224+
225+ print " \n " ;
226+ }
227+
208228sub semver ::get_major {
209229 my ($version ) = @_ ;
210230
@@ -336,55 +356,91 @@ sub semver::validate {
336356 ($str =~ / $semver_regex / ) ? exit 0 : exit 1;
337357}
338358
359+ sub num_trues (@) {
360+ my $trues = 0;
361+ foreach (@_ ) {
362+ $trues ++ if ($_ )
363+ }
364+ return $trues
365+ }
366+
339367sub main {
340368 my @args = @_ ;
341369
342- if (scalar (@args ) < 1) {
343- usage();
344- }
370+ my $subcommand = shift @args // ' ' ;
345371
346- my $subcommand = $args [0];
347-
348- if ($subcommand eq " grep" ) {
349- semver::grep ();
350- } elsif ($subcommand eq " init" ) {
351- semver::init();
352- } elsif ($subcommand eq " decrement-major" ) {
353- semver::decrement_major($args [1]);
354- } elsif ($subcommand eq " decrement-minor" ) {
355- semver::decrement_minor($args [1]);
356- } elsif ($subcommand eq " decrement-patch" ) {
357- semver::decrement_patch($args [1]);
358- } elsif ($subcommand eq " get-major" ) {
359- semver::get_major($args [1]);
360- } elsif ($subcommand eq " get-minor" ) {
361- semver::get_minor($args [1]);
362- } elsif ($subcommand eq " get-patch" ) {
363- semver::get_patch($args [1]);
364- } elsif ($subcommand eq " get-prerelease" ) {
365- semver::get_prerelease($args [1]);
366- } elsif ($subcommand eq " get-build" ) {
367- semver::get_build($args [1]);
368- } elsif (($subcommand eq " -h" ) || ($subcommand eq " --help" )) {
369- usage();
370- } elsif ($subcommand eq " increment-major" ) {
371- semver::increment_major($args [1]);
372- } elsif ($subcommand eq " increment-minor" ) {
373- semver::increment_minor($args [1]);
374- } elsif ($subcommand eq " increment-patch" ) {
375- semver::increment_patch($args [1]);
376- } elsif ($subcommand eq " sort" ) {
377- if (grep { $_ eq " -r" || $_ eq " --reverse" } @args ) {
378- semver::sort { semver::sort_pair($b , $a ) };
379- } else {
380- semver::sort { semver::sort_pair($a , $b ) };
372+ for ($subcommand ) {
373+ when (/ grep/ ) {
374+ semver::grep ();
375+ }
376+ when (/ init/ ) {
377+ semver::init();
378+ }
379+ when (/ decrement-major/ ) {
380+ semver::decrement_major($args [0]);
381+ }
382+ when (/ decrement-minor/ ) {
383+ semver::decrement_minor($args [0]);
384+ }
385+ when (/ decrement-patch/ ) {
386+ semver::decrement_patch($args [0]);
387+ }
388+ when (/ get/ ) {
389+ my $major , my $minor , my $patch , my $prerelease , my $build ;
390+
391+ GetOptionsFromArray(
392+ \@args ,
393+ " major" => \$major ,
394+ " minor" => \$minor ,
395+ " patch" => \$patch ,
396+ " prerelease" => \$prerelease ,
397+ " build" => \$build ,
398+ ) or exit 1;
399+
400+ usage() if (num_trues($major , $minor , $patch , $prerelease , $build ) > 1);
401+
402+ if ($major ) {
403+ semver::get_major($args [0]);
404+ } elsif ($minor ) {
405+ semver::get_minor($args [0]);
406+ } elsif ($patch ) {
407+ semver::get_patch($args [0]);
408+ } elsif ($prerelease ) {
409+ semver::get_prerelease($args [0]);
410+ } elsif ($build ) {
411+ semver::get_build($args [0]);
412+ } else {
413+ semver::get($args [0]);
414+ }
415+ }
416+ when (/ increment-major/ ) {
417+ semver::increment_major($args [0]);
418+ }
419+ when (/ increment-minor/ ) {
420+ semver::increment_minor($args [0]);
421+ }
422+ when (/ increment-patch/ ) {
423+ semver::increment_patch($args [0]);
424+ }
425+ when (/ sort/ ) {
426+ my $reverse ;
427+ GetOptionsFromArray(\@args , " reverse|r" => \$reverse ) or exit 1;
428+
429+ if ($reverse ) {
430+ semver::sort { semver::sort_pair($b , $a ) };
431+ } else {
432+ semver::sort { semver::sort_pair($a , $b ) };
433+ }
434+ }
435+ when (/ validate/ ) {
436+ semver::validate($args [0]);
437+ }
438+ when (/ compare/ ) {
439+ say semver::compare($args [0], $args [1]);
440+ }
441+ default {
442+ usage();
381443 }
382- } elsif ($subcommand eq " validate" ) {
383- semver::validate($args [1]);
384- } elsif ($subcommand eq " compare" ) {
385- say semver::compare($args [1], $args [2]);
386- } else {
387- usage();
388444 }
389445}
390446
0 commit comments