Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ticket/15142] Check extension updates on current branch #4761

Merged
merged 4 commits into from
Apr 11, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions phpBB/includes/acp/acp_extensions.php
Original file line number Diff line number Diff line change
Expand Up @@ -323,10 +323,7 @@ function main()
'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 (\RuntimeException $e)
{
Expand Down Expand Up @@ -565,7 +562,7 @@ private function output_actions($block, $actions)
* @param \phpbb\extension\metadata_manager $md_manager The metadata manager for the version to check.
* @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
* @return array
* @throws RuntimeException
*/
protected function version_check(\phpbb\extension\metadata_manager $md_manager, $force_update = false, $force_cache = false)
Expand All @@ -584,7 +581,7 @@ protected function version_check(\phpbb\extension\metadata_manager $md_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($this->config['extension_force_unstable'] ? 'unstable' : null);

return $updates = $version_helper->get_suggested_updates($force_update, $force_cache);
return $version_helper->get_ext_update_on_branch($force_update, $force_cache);
}

/**
Expand Down
63 changes: 63 additions & 0 deletions phpBB/phpbb/version_helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,69 @@ public function get_update_on_branch($force_update = false, $force_cache = false
return $update_info === null ? array() : $update_info;
}

/**
* 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
*
Expand Down
292 changes: 292 additions & 0 deletions tests/version/version_test.php
Original file line number Diff line number Diff line change
Expand Up @@ -532,4 +532,296 @@ public function test_get_update_on_branch($current_version, $versions, $expected

$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)
{
$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('\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());
}
}