diff options
| -rw-r--r-- | phpBB/phpbb/version_helper.php | 39 | ||||
| -rw-r--r-- | tests/version/version_test.php | 200 | 
2 files changed, 239 insertions, 0 deletions
| diff --git a/phpBB/phpbb/version_helper.php b/phpBB/phpbb/version_helper.php index a1e66ba8fe..b5f493de9d 100644 --- a/phpBB/phpbb/version_helper.php +++ b/phpBB/phpbb/version_helper.php @@ -201,6 +201,45 @@ class version_helper  	}  	/** +	 * Gets the latest version for the current branch the user is on +	 * +	 * @param bool $force_update Ignores cached data. Defaults to false. +	 * @param bool $force_cache Force the use of the cache. Override $force_update. +	 * @return string +	 * @throws \RuntimeException +	 */ +	public function get_update_on_branch($force_update = false, $force_cache = false) +	{ +		$versions = $this->get_versions_matching_stability($force_update, $force_cache); + +		$self = $this; +		$current_version = $this->current_version; + +		// Filter out any versions less than to the current version +		$versions = array_filter($versions, function($data) use ($self, $current_version) { +			return $self->compare($data['current'], $current_version, '>='); +		}); + +		// Get the lowest version from the previous list. +		return array_reduce($versions, function($value, $data) use ($self, $current_version) { +			if ($value === null && $self->compare($data['current'], $current_version, '>=')) +			{ + +				if (!$data['eol'] && (!$data['security'] || $self->compare($data['security'], $data['current'], '<='))) +				{ +					return ($self->compare($data['current'], $current_version, '>')) ? $data : array(); +				} +				else +				{ +					return null; +				} +			} + +			return $value; +		}); +	} + +	/**  	* Obtains the latest version information  	*  	* @param bool $force_update Ignores cached data. Defaults to false. diff --git a/tests/version/version_test.php b/tests/version/version_test.php index 528f1602d6..b9a6cf19ab 100644 --- a/tests/version/version_test.php +++ b/tests/version/version_test.php @@ -332,4 +332,204 @@ class phpbb_version_helper_test extends phpbb_test_case  		$this->assertSame($expected, $version_helper->get_latest_on_current_branch());  	} + +	public function get_update_on_branch_data() +	{ +		return array( +			array( +				'1.0.0', +				array( +					'1.0'	=> array( +						'current'		=> '1.0.1', +					), +					'1.1'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array( +					'current'		=> '1.0.1', +				), +			), +			array( +				'1.0.1', +				array( +					'1.0'	=> array( +						'current'		=> '1.0.1', +					), +					'1.1'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array(), +			), +			array( +				'1.0.1-a1', +				array( +					'1.0'	=> array( +						'current'		=> '1.0.1-a2', +					), +					'1.1'	=> array( +						'current'		=> '1.1.0', +					), +				), +				array( +					'current'		=> '1.0.1-a2', +				), +			), +			array( +				'1.1.0', +				array( +					'1.0'	=> array( +						'current'		=> '1.0.1', +					), +					'1.1'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array( +					'current'		=> '1.1.1', +				), +			), +			array( +				'1.1.1', +				array( +					'1.0'	=> array( +						'current'		=> '1.0.1', +					), +					'1.1'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array(), +			), +			array( +				'1.1.0-a1', +				array( +					'1.0'	=> array( +						'current'		=> '1.0.1', +					), +					'1.1'	=> array( +						'current'		=> '1.1.0-a2', +					), +				), +				array( +					'current'		=> '1.1.0-a2', +				), +			), +			array( +				'1.1.0', +				array(), +				null, +			), +			// Latest safe release is 1.0.1 +			array( +				'1.0.0', +				array( +					'1.0'	=> array( +						'current'		=> '1.0.1', +						'security'		=> '1.0.1', +					), +					'1.1'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array( +					'current'		=> '1.0.1', +					'security'		=> '1.0.1', +				), +			), +			// Latest safe release is 1.0.0 +			array( +				'1.0.0', +				array( +					'1.0'	=> array( +						'current'		=> '1.0.1', +						'security'		=> '1.0.1', +					), +					'1.1'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array( +					'current'		=> '1.0.1', +					'security'		=> '1.0.1', +				), +			), +			// Latest safe release is 1.1.0 +			array( +				'1.0.0', +				array( +					'1.0'	=> array( +						'current'		=> '1.0.1', +						'security'		=> '1.1.0', +					), +					'1.1'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array( +					'current'		=> '1.1.1', +				), +			), +			// Latest 1.0 release is EOL +			array( +				'1.0.0', +				array( +					'1.0'	=> array( +						'current'		=> '1.0.1', +						'eol'			=> true, +					), +					'1.1'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array( +					'current'		=> '1.1.1', +				), +			), +			// All are EOL -- somewhat undefined behavior +			array( +				'1.0.0', +				array( +					'1.0'	=> array( +						'current'		=> '1.0.1', +						'eol'			=> true, +					), +					'1.1'	=> array( +						'current'		=> '1.1.1', +						'eol'			=> true, +					), +				), +				null, +			), +		); +	} + +	/** +	 * @dataProvider get_update_on_branch_data +	 */ +	public function test_get_update_on_branch($current_version, $versions, $expected) +	{ +		$version_helper = $this +			->getMockBuilder('\phpbb\version_helper') +			->setMethods(array( +				'get_versions_matching_stability', +			)) +			->setConstructorArgs(array( +				$this->cache, +				new \phpbb\config\config(array( +					'version'	=> $current_version, +				)), +				new \phpbb\file_downloader(), +				new \phpbb\user('\phpbb\datetime'), +			)) +			->getMock() +		; + +		$version_helper->expects($this->any()) +			->method('get_versions_matching_stability') +			->will($this->returnValue($versions)); + +		$this->assertSame($expected, $version_helper->get_update_on_branch()); +	}  } | 
