NAME

Version::libversion::XS - Perl binding for libversion

SYNOPSIS

use Version::libversion::XS;

# OO-interface

if ( Version::libversion::XS->new($v1) == Version::libversion::XS->new($v2) ) {
    # do stuff
}

# Sorting mixed version styles

@ordered = sort { Version::libversion::XS->new($a) <=> Version::libversion::XS->new($b) } @list;


# Functional interface

use Version::libversion::XS ':all';

say '0.99 < 1.11' if(version_compare2('0.99', '1.11') == -1);

say '1.0 == 1.0.0' if(version_compare2('1.0', '1.0.0') == 0);

say '1.0alpha1 < 1.0.rc1' if(version_compare2('1.0alpha1', '1.0.rc1') == -1);

say '1.0 > 1.0.rc1' if(version_compare2('1.0', '1.0-rc1') == 1);

say '1.2.3alpha4 is the same as 1.2.3~a4' if(version_compare2('1.2.3alpha4', '1.2.3~a4') == 0);

# by default, 'p' is treated as 'pre' ...
say '1.0p1 == 1.0pre1'  if(version_compare2('1.0p1', '1.0pre1') == 0);
say '1.0p1 < 1.0post1'  if(version_compare2('1.0p1', '1.0post1') == -1);
say '1.0p1 < 1.0patch1' if(version_compare2('1.0p1', '1.0patch1') == -1);

# ... but this is tunable: here it's handled as 'patch'
say '1.0p1 > 1.0pre1'    if(version_compare4('1.0p1', '1.0pre1', VERSIONFLAG_P_IS_PATCH, 0) == 1);
say '1.0p1 == 1.0post1'  if(version_compare4('1.0p1', '1.0post1', VERSIONFLAG_P_IS_PATCH, 0) == 0);
say '1.0p1 == 1.0patch1' if(version_compare4('1.0p1', '1.0patch1', VERSIONFLAG_P_IS_PATCH, 0) == 0);

# a way to check that the version belongs to a given release
if(
    (version_compare4('1.0alpha1', '1.0', 0, VERSIONFLAG_LOWER_BOUND) == 1) &&
    (version_compare4('1.0alpha1', '1.0', 0, VERSIONFLAG_UPPER_BOUND) == -1) &&
    (version_compare4('1.0.1', '1.0', 0, VERSIONFLAG_LOWER_BOUND) == 1) &&
    (version_compare4('1.0.1', '1.0', 0, VERSIONFLAG_UPPER_BOUND) == -1)
) {
  say '1.0alpha1 and 1.0.1 belong to 1.0 release, e.g. they lie between' .
      '(lowest possible version in 1.0) and (highest possible version in 1.0)';
}

DESCRIPTION

Perl bindings for libversion, which provides fast, powerful and correct generic version string comparison algorithm.

See libversion repository for more details on the algorithm.

https://github.com/repology/libversion

FUNCTIONAL INTERFACE

They are exported by default:

version_compare2 ( $v1, $v2 )
say '0.99 < 1.11' if(version_compare2('0.99', '1.11') == -1);

say '1.0 == 1.0.0' if(version_compare2('1.0', '1.0.0') == 0);

say '1.0alpha1 < 1.0.rc1' if(version_compare2('1.0alpha1', '1.0.rc1') == -1);

say '1.0 > 1.0.rc1' if(version_compare2('1.0', '1.0-rc1') == 1);

say '1.2.3alpha4 is the same as 1.2.3~a4' if(version_compare2('1.2.3alpha4', '1.2.3~a4') == 0);

# by default, 'p' is treated as 'pre' (see version_compare4)
say '1.0p1 == 1.0pre1'  if(version_compare2('1.0p1', '1.0pre1') == 0);
say '1.0p1 < 1.0post1'  if(version_compare2('1.0p1', '1.0post1') == -1);
say '1.0p1 < 1.0patch1' if(version_compare2('1.0p1', '1.0patch1') == -1);
version_compare4 ( $v1, $v2, $v1_flags, $v2_flags )
# Export all constants
use Version::libversion::XS ':all';

# by default, 'p' is treated as 'pre' but this is tunable: here it's handled as 'patch'
say '1.0p1 > 1.0pre1' if(version_compare4('1.0p1', '1.0pre1', VERSIONFLAG_P_IS_PATCH, 0) == 1);
say '1.0p1 == 1.0post1' if(version_compare4('1.0p1', '1.0post1', VERSIONFLAG_P_IS_PATCH, 0) == 0);
say '1.0p1 == 1.0patch1' if(version_compare4('1.0p1', '1.0patch1', VERSIONFLAG_P_IS_PATCH, 0) == 0);

# a way to check that the version belongs to a given release
if(
    (version_compare4('1.0alpha1', '1.0', 0, VERSIONFLAG_LOWER_BOUND) == 1) &&
    (version_compare4('1.0alpha1', '1.0', 0, VERSIONFLAG_UPPER_BOUND) == -1) &&
    (version_compare4('1.0.1', '1.0', 0, VERSIONFLAG_LOWER_BOUND) == 1) &&
    (version_compare4('1.0.1', '1.0', 0, VERSIONFLAG_UPPER_BOUND) == -1)
) {
  say '1.0alpha1 and 1.0.1 belong to 1.0 release, e.g. they lie between' .
      '(lowest possible version in 1.0) and (highest possible version in 1.0)';
}
version_compare ( $v1, $v2, [ $v1_flags, $v2_flags ] )

Alias of version_compare4

CONSTANTS

LIBVERSION_VERSION

Expose libversion version

Flags

VERSIONFLAG_P_IS_PATCH
VERSIONFLAG_ANY_IS_PATCH
VERSIONFLAG_LOWER_BOUND
VERSIONFLAG_UPPER_BOUND

Flags alias:

P_IS_PATCH
ANY_IS_PATCH
LOWER_BOUND
UPPER_BOUND

OBJECT-ORIENTED INTERFACE

Version::libversion::XS->new( $version, [ $flags ])
$v->version
$v->flags

How to compare version objects

Version::libversion::XS objects overload the cmp and <=> operators. Perl automatically generates all of the other comparison operators based on those two so all the normal logical comparisons will work.

if ( Version::libversion::XS->new($v1) == Version::libversion::XS->new($v2) ) {
  # do stuff
}

If a version object is compared against a non-version object, the non-object term will be converted to a version object using new(). This may give surprising results:

$v1 = Version::libversion::XS->new("v0.95.0");
$bool = $v1 < 0.94; # TRUE

Always comparing to a version object will help avoid surprises:

$bool = $v1 < Version::libversion::XS->new("v0.94.0"); # FALSE

SUPPORT

Bugs / Feature Requests

Please report any bugs or feature requests through the issue tracker at https://github.com/giterlizzi/perl-Version-libversion-XS/issues. You will be notified automatically of any progress on your issue.

Source Code

This is open source software. The code repository is available for public review and contribution under the terms of the license.

https://github.com/giterlizzi/perl-Version-libversion-XS

git clone https://github.com/giterlizzi/perl-Version-libversion-XS.git

AUTHOR

  • Giuseppe Di Terlizzi <gdt@cpan.org>

LICENSE AND COPYRIGHT

This software is copyright (c) 2024 by Giuseppe Di Terlizzi.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.