diff --git a/common/code/boost_version.php b/common/code/boost_version.php index beed1855..2c23a7a9 100644 --- a/common/code/boost_version.php +++ b/common/code/boost_version.php @@ -110,44 +110,54 @@ class BoostVersion { static function from($value) { if ($value instanceof BoostVersion) { return $value; - } - else if (is_string($value)) { - $value = trim($value, " \t\n\r\0\x0B/"); - - switch($value) { - case 'master': return self::master(); - case 'develop': return self::develop(); - case 'latest': return self::latest(); - case 'unreleased': return self::unreleased(); - case 'hidden': return self::hidden(); - } - - if (preg_match('@^(\d+)[._](\d+)[._](\d+)[-._ ]?(?:(b(?:eta)?[- _.]*)(\d*)|(prerelease))?$@', - trim(strtolower($value)), $matches)) - { - return new BoostVersion(Array( - 'major' => (int) $matches[1], - 'minor' => (int) $matches[2], - 'point' => (int) $matches[3], - 'release_stage' => - !empty($matches[4]) ? self::release_stage_beta : ( - !empty($matches[6]) ? self::release_stage_prerelease : - self::release_stage_final), - 'extra' => empty($matches[4]) ? false : - (int) ($matches[5] ?: 1), - )); - } - else - { + } else if (is_string($value)) { + $version = self::parseVersion($value); + if ($version) { + return $version; + } else { throw new BoostVersion_Exception( "Invalid version: ".html_encode($value)); } - } - else { + } else { throw new BoostVersion_Exception("Can't convert to BoostVersion."); } } + /** + * Returns a BoostVersion representation of the version number in the + * argument, or null if it couldn't be parsed. + */ + static function parseVersion($version_string) { + $version_string = strtolower(trim($version_string, " \t\n\r\0\x0B/")); + + switch($version_string) { + case 'master': return self::master(); + case 'develop': return self::develop(); + case 'latest': return self::latest(); + case 'unreleased': return self::unreleased(); + case 'hidden': return self::hidden(); + } + + if (preg_match('@^(\d+)[._](\d+)[._](\d+)[-._ ]?(?:(b(?:eta)?[- _.]*)(\d*)|(prerelease))?$@', $version_string, $matches)) + { + return new BoostVersion(Array( + 'major' => (int) $matches[1], + 'minor' => (int) $matches[2], + 'point' => (int) $matches[3], + 'release_stage' => + !empty($matches[4]) ? self::release_stage_beta : ( + !empty($matches[6]) ? self::release_stage_prerelease : + self::release_stage_final), + 'extra' => empty($matches[4]) ? false : + (int) ($matches[5] ?: 1), + )); + } + else + { + return null; + } + } + /** * The current stable release of boost. * @return BoostVersion diff --git a/doc/generate.php b/doc/generate.php index 6e6b2a74..31dcfba0 100644 --- a/doc/generate.php +++ b/doc/generate.php @@ -34,16 +34,10 @@ class LibrariesHtm { } function display() { - // TODO: Specifying the version only works *after* a release, as - // new libraries will still have develop/master as their - // version. This works for now as version is always - // master/develop, but might change in the future. - // - // Now that BoostVersion has 'prerelease' versions, could - // possibly use that for new libraries to handle this better. - $version = BoostVersion::from( - array_key_exists('version', $this->args) ? $this->args['version'] : 'master' - ); + $version = + BoostVersion::parseVersion( + BoostWebsite::array_get($this->args, 'version')) ?: + BoostVersion::master(); $version_string = (string) $version; $page = $this->args['page']; $libs = BoostLibraries::load();