diff options
| author | Matt Friedman <maf675@gmail.com> | 2017-04-10 15:47:51 -0700 | 
|---|---|---|
| committer | Matt Friedman <maf675@gmail.com> | 2017-04-10 15:51:22 -0700 | 
| commit | 6ce5ef53cbb91bca32fc653e62e3f898b2855cec (patch) | |
| tree | 5ec61923c567d7ff89657ccca0c350142bc87e50 | |
| parent | ecef296beeb2458f4bdccb1d3bbd05f76a580c12 (diff) | |
| parent | 450402ea429e654aab01ae934772ddf90d2e6a38 (diff) | |
| download | forums-6ce5ef53cbb91bca32fc653e62e3f898b2855cec.tar forums-6ce5ef53cbb91bca32fc653e62e3f898b2855cec.tar.gz forums-6ce5ef53cbb91bca32fc653e62e3f898b2855cec.tar.bz2 forums-6ce5ef53cbb91bca32fc653e62e3f898b2855cec.tar.xz forums-6ce5ef53cbb91bca32fc653e62e3f898b2855cec.zip | |
[ticket/15142] Merge branch 'ticket/15142' into 32x
PHPBB3-15142
| -rw-r--r-- | phpBB/includes/acp/acp_extensions.php | 5 | ||||
| -rw-r--r-- | phpBB/phpbb/extension/manager.php | 4 | ||||
| -rw-r--r-- | phpBB/phpbb/version_helper.php | 63 | ||||
| -rw-r--r-- | tests/version/version_test.php | 297 | 
4 files changed, 363 insertions, 6 deletions
| diff --git a/phpBB/includes/acp/acp_extensions.php b/phpBB/includes/acp/acp_extensions.php index 164e5872bb..d5082e9727 100644 --- a/phpBB/includes/acp/acp_extensions.php +++ b/phpBB/includes/acp/acp_extensions.php @@ -331,10 +331,7 @@ class acp_extensions  							'UP_TO_DATE_MSG' => $this->user->lang(empty($updates_available) ? 'UP_TO_DATE' : 'NOT_UP_TO_DATE', $md_manager->get_metadata('display-name')),  						)); -						foreach ($updates_available as $branch => $version_data) -						{ -							$template->assign_block_vars('updates_available', $version_data); -						} +						$template->assign_block_vars('updates_available', $updates_available);  					}  					catch (exception_interface $e)  					{ diff --git a/phpBB/phpbb/extension/manager.php b/phpBB/phpbb/extension/manager.php index ca0ff31d5d..e3e6fe4077 100644 --- a/phpBB/phpbb/extension/manager.php +++ b/phpBB/phpbb/extension/manager.php @@ -573,7 +573,7 @@ class manager  	* @param bool $force_update Ignores cached data. Defaults to false.  	* @param bool $force_cache Force the use of the cache. Override $force_update.  	* @param string $stability Force the stability (null by default). -	* @return string +	* @return array  	* @throws runtime_exception  	*/  	public function version_check(\phpbb\extension\metadata_manager $md_manager, $force_update = false, $force_cache = false, $stability = null) @@ -592,7 +592,7 @@ class manager  		$version_helper->set_file_location($version_check['host'], $version_check['directory'], $version_check['filename'], isset($version_check['ssl']) ? $version_check['ssl'] : false);  		$version_helper->force_stability($stability); -		return $updates = $version_helper->get_suggested_updates($force_update, $force_cache); +		return $version_helper->get_ext_update_on_branch($force_update, $force_cache);  	}  	/** diff --git a/phpBB/phpbb/version_helper.php b/phpBB/phpbb/version_helper.php index fb330df26f..bb15dd1a74 100644 --- a/phpBB/phpbb/version_helper.php +++ b/phpBB/phpbb/version_helper.php @@ -241,6 +241,69 @@ class version_helper  	}  	/** +	 * Gets the latest extension update for the current phpBB branch the user is on +	 * Will suggest versions from newer branches when EoL has been reached +	 * and/or version from newer branch is needed for having all known security +	 * issues fixed. +	 * +	 * @param bool $force_update Ignores cached data. Defaults to false. +	 * @param bool $force_cache Force the use of the cache. Override $force_update. +	 * @return array Version info or empty array if there are no updates +	 * @throws \RuntimeException +	 */ +	public function get_ext_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; + +		// Get current phpBB branch from version, e.g.: 3.2 +		preg_match('/^(\d+\.\d+).*$/', $this->config['version'], $matches); +		$current_branch = $matches[1]; + +		// Filter out any versions less than the current version +		$versions = array_filter($versions, function($data) use ($self, $current_version) { +			return $self->compare($data['current'], $current_version, '>='); +		}); + +		// Filter out any phpbb branches less than the current version +		$branches = array_filter(array_keys($versions), function($branch) use ($self, $current_branch) { +			return $self->compare($branch, $current_branch, '>='); +		}); +		if (!empty($branches)) +		{ +			$versions = array_intersect_key($versions, array_flip($branches)); +		} +		else +		{ +			// If branches are empty, it means the current phpBB branch is newer than any branch the +			// extension was validated against. Reverse sort the versions array so we get the newest +			// validated release available. +			krsort($versions); +		} + +		// Get the first available version from the previous list. +		$update_info = 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; +		}); + +		return $update_info === null ? array() : $update_info; +	} + +	/**  	* 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 abe51ef539..2a0240f847 100644 --- a/tests/version/version_test.php +++ b/tests/version/version_test.php @@ -546,4 +546,301 @@ class phpbb_version_helper_test extends phpbb_test_case  		$this->assertSame($expected, $version_helper->get_update_on_branch());  	} + +	public function get_ext_update_on_branch_data() +	{ +		return array( +			// Single branch, check version for current branch +			array( +				'3.1.0', +				'1.0.0', +				array( +					'3.1'	=> array( +						'current'		=> '1.0.1', +					), +				), +				array( +					'current'		=> '1.0.1', +				), +			), +			array( +				'3.1.0', +				'1.0.1', +				array( +					'3.1'	=> array( +						'current'		=> '1.0.1', +					), +				), +				array(), +			), +			array( +				'3.2.0', +				'1.0.0', +				array( +					'3.2'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array( +					'current'		=> '1.1.1', +				), +			), +			array( +				'3.2.0', +				'1.1.1', +				array( +					'3.2'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array(), +			), +			// Single branch, check for newest version when branches don't match up +			array( +				'3.1.0', +				'1.0.0', +				array( +					'3.2'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array( +					'current'		=> '1.1.1', +				), +			), +			array( +				'3.1.0', +				'1.1.1', +				array( +					'3.2'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array(), +			), +			array( +				'3.2.0', +				'1.0.0', +				array( +					'3.1'	=> array( +						'current'		=> '1.0.1', +					), +				), +				array( +					'current'		=> '1.0.1', +				), +			), +			array( +				'3.2.0', +				'1.0.1', +				array( +					'3.1'	=> array( +						'current'		=> '1.0.1', +					), +				), +				array(), +			), +			array( +				'3.3.0', +				'1.0.0', +				array( +					'3.2'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array( +					'current'		=> '1.1.1', +				), +			), +			array( +				'3.3.0', +				'1.1.1', +				array( +					'3.2'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array(), +			), +			// Multiple branches, check version for current branch +			array( +				'3.1.0', +				'1.0.0', +				array( +					'3.1'	=> array( +						'current'		=> '1.0.1', +					), +					'3.2'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array( +					'current'		=> '1.0.1', +				), +			), +			array( +				'3.1.0', +				'1.0.1', +				array( +					'3.1'	=> array( +						'current'		=> '1.0.1', +					), +					'3.2'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array(), +			), +			array( +				'3.1.0', +				'1.1.1', +				array( +					'3.1'	=> array( +						'current'		=> '1.0.1', +					), +					'3.2'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array(), +			), +			array( +				'3.2.0', +				'1.0.0', +				array( +					'3.1'	=> array( +						'current'		=> '1.0.1', +					), +					'3.2'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array( +					'current'		=> '1.1.1', +				), +			), +			array( +				'3.2.0', +				'1.0.1', +				array( +					'3.1'	=> array( +						'current'		=> '1.0.1', +					), +					'3.2'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array( +					'current'		=> '1.1.1', +				), +			), +			array( +				'3.2.0', +				'1.1.1', +				array( +					'3.1'	=> array( +						'current'		=> '1.0.1', +					), +					'3.2'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array(), +			), +			// Multiple branches, check for newest version when branches don't match up +			array( +				'3.3.0', +				'1.0.0', +				array( +					'3.1'	=> array( +						'current'		=> '1.0.1', +					), +					'3.2'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array( +					'current'		=> '1.1.1', +				), +			), +			array( +				'3.3.0', +				'1.0.1', +				array( +					'3.1'	=> array( +						'current'		=> '1.0.1', +					), +					'3.2'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array( +					'current'		=> '1.1.1', +				), +			), +			array( +				'3.3.0', +				'1.1.0', +				array( +					'3.1'	=> array( +						'current'		=> '1.0.1', +					), +					'3.2'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array( +					'current'		=> '1.1.1', +				), +			), +			array( +				'3.3.0', +				'1.1.1', +				array( +					'3.1'	=> array( +						'current'		=> '1.0.1', +					), +					'3.2'	=> array( +						'current'		=> '1.1.1', +					), +				), +				array(), +			), +		); +	} + +	/** +	 * @dataProvider get_ext_update_on_branch_data +	 */ +	public function test_get_ext_update_on_branch($phpbb_version, $ext_version, $versions, $expected) +	{ +		global $phpbb_root_path, $phpEx; + +		$lang_loader = new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx); +		$lang = new \phpbb\language\language($lang_loader); + +		$version_helper = $this +			->getMockBuilder('\phpbb\version_helper') +			->setMethods(array( +				'get_versions_matching_stability', +			)) +			->setConstructorArgs(array( +				$this->cache, +				new \phpbb\config\config(array( +					'version'	=> $phpbb_version, +				)), +				new \phpbb\file_downloader(), +				new \phpbb\user($lang, '\phpbb\datetime'), +			)) +			->getMock() +		; + +		$version_helper->expects($this->any()) +			->method('get_versions_matching_stability') +			->will($this->returnValue($versions)); + +		$version_helper->set_current_version($ext_version); + +		$this->assertSame($expected, $version_helper->get_ext_update_on_branch()); +	}  } | 
