httpClient = $httpClient; $this->kvpRepo = $kvpRepo; } /** * Clean the version string (e.,g strip the v in front) * * @param string $version * * @return string */ private function cleanVersionString($version): string { if ($version[0] === 'v') { $version = substr($version, 1); } return $version; } /** * Set the latest release version/tag into the KVP repo and return the tag * * @param $version_tag * @param $download_url * * @return string The version string */ private function setLatestRelease($version_tag, $download_url): string { $version_tag = $this->cleanVersionString($version_tag); $this->kvpRepo->save('latest_version_tag', $version_tag); $this->kvpRepo->save('latest_version_url', $download_url); return $version_tag; } /** * Find and return the Github asset line * * @param $release * * @return string */ private function getGithubAsset($release): string { foreach ($release['assets'] as $asset) { if ($asset['content_type'] === 'application/gzip') { return $asset['browser_download_url']; } } return ''; } /** * Download the latest version from github */ private function getLatestVersionGithub() { $releases = []; try { $releases = $this->httpClient->get(config('phpvms.version_file'), [ 'headers' => [ 'Accept' => 'application/json', ], ]); } catch (GuzzleException $e) { Log::error('Error retrieving new version: '.$e->getMessage()); } $include_prerelease = setting('general.check_prerelease_version', false); foreach ($releases as $release) { if ($release['prerelease'] === true) { if ($include_prerelease) { return $this->setLatestRelease( $release['tag_name'], $this->getGithubAsset($release) ); } continue; } return $this->setLatestRelease( $release['tag_name'], $this->getGithubAsset($release) ); } return $releases; } /** * Downloads the latest version and saves it into the KVP store */ public function getLatestVersion() { $latest_version = $this->getLatestVersionGithub(); return $latest_version; } /** * Get the build ID, which is the date and the git log version * * @param array $cfg * * @return string */ public function getBuildId($cfg) { exec($cfg['git']['git-local'], $version); $version = substr($version[0], 0, $cfg['build']['length']); // prefix with the date in YYMMDD format $date = date('ymd'); return $date.'.'.$version; } /** * Get the current version * * @param bool $include_build True will include the build ID * * @return string */ public function getCurrentVersion($include_build = true) { $version_file = config_path('version.yml'); $cfg = Yaml::parse(file_get_contents($version_file)); $c = $cfg['current']; $version = "{$c['major']}.{$c['minor']}.{$c['patch']}"; if ($c['prerelease'] !== '') { $version .= "-{$c['prerelease']}"; if ($c['buildmetadata'] !== '') { $version .= ".{$c['buildmetadata']}"; } } if ($include_build) { // Get the current build id $build_number = $this->getBuildId($cfg); $cfg['build']['number'] = $build_number; $version = $version.'+'.$build_number; } return $version; } /** * See if a new version is available. Saves a flag into the KVP store if there is * * @param null [$current_version] * * @return bool */ public function isNewVersionAvailable($current_version = null) { if (!$current_version) { $current_version = $this->getCurrentVersion(false); } else { $current_version = $this->cleanVersionString($current_version); } // Replace "dev" with "alpha", since $latest_version = $this->getLatestVersion(); // Convert to semver if ($this->isGreaterThan($latest_version, $current_version)) { $this->kvpRepo->save('new_version_available', true); return true; } $this->kvpRepo->save('new_version_available', false); return false; } /** * @param string $version1 * @param string $version2 * * @return bool If $version1 is greater than $version2 */ public function isGreaterThan($version1, $version2): bool { $version1 = Version::fromString($version1); $version2 = Version::fromString($version2); return $version1->isGreaterThan($version2); } }