zeek/scripts/base/misc/version.zeek
Jon Siwek 94d470c158 GH-488: teach the Version module to parse new version scheme
Such as the new -rc format for release candidates (replacing "beta") and
-dev.X for development versions in the master branch.
2019-07-25 23:05:06 -07:00

125 lines
4.1 KiB
Text

##! Provide information about the currently running Zeek version.
##! The most convenient way to access this are the Version::number
##! and Version::info constants.
@load base/frameworks/reporter
@load base/utils/strings
module Version;
export {
## A type exactly describing a Zeek version
type VersionDescription: record {
## Number representing the version which can be used for easy comparison.
## The format of the number is ABBCC with A being the major version,
## bb being the minor version (2 digits) and CC being the patchlevel (2 digits).
## As an example, Zeek 2.4.1 results in the number 20401.
version_number: count;
## Major version number (e.g. 2 for 2.5)
major: count;
## Minor version number (e.g. 5 for 2.5)
minor: count;
## Patch version number (e.g. 0 for 2.5 or 1 for 2.4.1)
patch: count;
## Commit number for development versions, Versions prior to 3.0.0,
## like "2.4-12", use a post-release commit number (12 commits
## after the 2.4 release). Versions after 3.0.0, like
## "3.1.0-dev.37", use a pre-release commit number (37 commits
## into the development cycle for 3.1.0). For non-development version
## this number will be zero.
commit: count;
## If set to true, the version is a beta build of Zeek. These versions
## may start like "2.6-beta" or "3.0.0-rc" (the "rc" form started
## being used for 3.0.0 and later).
beta: bool;
## If set to true, the version is a debug build
debug: bool;
## String representation of this version
version_string: string;
};
## Parse a given version string.
##
## version_string: Zeek version string.
##
## Returns: `VersionDescription` record.
global parse: function(version_string: string): VersionDescription;
## Test if the current running version of Zeek is greater or equal to the given version
## string.
##
## version_string: Version to check against the current running version.
##
## Returns: True if running version greater or equal to the given version.
global at_least: function(version_string: string): bool;
}
function parse(version_string: string): VersionDescription
{
if ( /[0-9]+\.[0-9]+(\.[0-9]+)?(-(beta|rc|dev)[0-9]*)?((-|\.)[0-9]+)?(-debug)?/ != version_string )
{
Reporter::error(fmt("Version string %s cannot be parsed", version_string));
return VersionDescription($version_number=0, $major=0, $minor=0, $patch=0, $commit=0, $beta=F, $debug=F, $version_string=version_string);
}
local beta = /-(beta|rc)/ in version_string;
local debug = /-debug/ in version_string;
local patchlevel = 0;
local commit = 0;
local vs = version_string;
local parts = split_string1(vs, /\./);
local major = to_count(parts[0]);
vs = lstrip(vs, "1234567890");
vs = lstrip(vs, ".");
parts = split_string1(vs, /\.|-/);
local minor = to_count(parts[0]);
vs = lstrip(vs, "1234567890");
if ( |vs| > 0 )
{
# More than just X.Y
if ( vs[0] == "." )
{
vs = lstrip(vs, ".");
parts = split_string1(vs, /\.|-/);
patchlevel = to_count(parts[0]);
vs = lstrip(vs, "1234567890");
}
vs = gsub(vs, /-debug$/, "");
vs = gsub(vs, /-(beta|rc|dev)[0-9]*/, "");
# Either a .X, or -X possibly remaining
vs = lstrip(vs, ".-");
if ( |vs| > 0 )
commit = to_count(vs);
}
local version_number = major * 10000 + minor * 100 + patchlevel;
return VersionDescription($version_number=version_number, $major=major,
$minor=minor, $patch=patchlevel, $commit=commit,
$beta=beta, $debug=debug,
$version_string=version_string);
}
export {
## `VersionDescription` record pertaining to the currently running version of Zeek.
const info = Version::parse(zeek_version());
## version number of the currently running version of Zeek as a numeric representation.
## The format of the number is ABBCC with A being the major version,
## bb being the minor version (2 digits) and CC being the patchlevel (2 digits).
## As an example, Zeek 2.4.1 results in the number 20401
const number = info$version_number;
}
function at_least(version_string: string): bool
{
return Version::number >= Version::parse(version_string)$version_number;
}