public function upgrader_source_selection($source, $remote_source, $upgrader, $hook_extra = null)
{
global $wp_filesystem, $plugins, $themes;
$slug = null;
$repo = null;
$new_source = null;
$upgrader_object = null;
/*
* Rename plugins.
*/
if ($upgrader instanceof \Plugin_Upgrader) {
$upgrader_object = Plugin::instance();
if (isset($hook_extra['plugin'])) {
$slug = dirname($hook_extra['plugin']);
$new_source = trailingslashit($remote_source) . $slug;
}
/*
* Pre-WordPress 4.4
*/
if ($plugins && empty($hook_extra)) {
foreach (array_reverse($plugins) as $plugin) {
$slug = dirname($plugin);
if (false !== stristr(basename($source), dirname($plugin))) {
$new_source = trailingslashit($remote_source) . dirname($plugin);
break;
}
}
}
if (!$plugins && empty($hook_extra)) {
if (isset($upgrader->skin->plugin)) {
$slug = dirname($upgrader->skin->plugin);
}
if (empty($slug) && isset($_POST['slug'])) {
$slug = sanitize_text_field($_POST['slug']);
}
$new_source = trailingslashit($remote_source) . $slug;
}
}
/*
* Rename themes.
*/
if ($upgrader instanceof \Theme_Upgrader) {
$upgrader_object = Theme::instance();
if (isset($hook_extra['theme'])) {
$slug = $hook_extra['theme'];
$new_source = trailingslashit($remote_source) . $slug;
}
/*
* Pre-WordPress 4.4
*/
if ($themes && empty($hook_extra)) {
foreach ($themes as $theme) {
$slug = $theme;
if (false !== stristr(basename($source), $theme)) {
$new_source = trailingslashit($remote_source) . $theme;
break;
}
}
}
if (!$themes && empty($hook_extra)) {
if (isset($upgrader->skin->theme)) {
$slug = $upgrader->skin->theme;
}
$new_source = trailingslashit($remote_source) . $slug;
}
}
$repo = $this->get_repo_slugs($slug, $upgrader_object);
/*
* Not GitHub Updater plugin/theme.
*/
if (!isset($_POST['github_updater_repo']) && empty($repo)) {
return $source;
}
/*
* Remote install source.
*/
if (isset(self::$options['github_updater_install_repo'])) {
$repo['repo'] = $repo['extended_repo'] = self::$options['github_updater_install_repo'];
$new_source = trailingslashit($remote_source) . self::$options['github_updater_install_repo'];
}
/*
* Directory is misnamed to start.
* May cause deactivation.
*/
if (!array_key_exists($slug, (array) $upgrader_object->config) && !isset(self::$options['github_updater_install_repo'])) {
if ($upgrader instanceof \Plugin_Upgrader) {
foreach ($upgrader_object->config as $plugin) {
if ($slug === dirname($plugin->slug)) {
$slug = $plugin->repo;
$new_source = trailingslashit($remote_source) . $slug;
break;
}
}
}
if ($upgrader instanceof \Theme_Upgrader) {
foreach ($upgrader_object->config as $theme) {
if ($slug === $theme->repo) {
$new_source = trailingslashit($remote_source) . $slug;
break;
}
}
}
}
/*
* Revert extended naming if previously present.
*/
if ($upgrader_object instanceof Plugin && (!defined('GITHUB_UPDATER_EXTENDED_NAMING') || !GITHUB_UPDATER_EXTENDED_NAMING) && $slug !== $repo['repo']) {
$new_source = trailingslashit($remote_source) . $repo['repo'];
}
/*
* Extended naming.
* Only for plugins and not for 'master' === branch && .org hosted.
*/
if ($upgrader_object instanceof Plugin && (defined('GITHUB_UPDATER_EXTENDED_NAMING') && GITHUB_UPDATER_EXTENDED_NAMING) && (isset($upgrader_object->config[$repo['repo']]) && !$upgrader_object->config[$repo['repo']]->dot_org || $upgrader_object->tag && 'master' !== $upgrader_object->tag || isset(self::$options['github_updater_install_repo']))) {
$new_source = trailingslashit($remote_source) . $repo['extended_repo'];
printf(esc_html__('Rename successful using extended name to %1$s', 'github-updater') . '…<br>', '<strong>' . $repo['extended_repo'] . '</strong>');
}
/*
* Renaming if GitLab Release Asset.
* It has a different download directory structure.
*/
if (isset($upgrader_object->config[$slug]->release_asset) && $upgrader_object->config[$slug]->release_asset && !empty($upgrader_object->config[$slug]->ci_job)) {
$new_source = trailingslashit(dirname($remote_source)) . $slug;
add_filter('upgrader_post_install', array(&$this, 'upgrader_post_install'), 10, 3);
}
$wp_filesystem->move($source, $new_source);
return trailingslashit($new_source);
}