From d6a1a9edbdcbf30983599ef18f5a26ba68ede075 Mon Sep 17 00:00:00 2001 From: "Geoff St. Pierre" Date: Sun, 13 May 2018 12:12:49 -0400 Subject: [PATCH 1/3] Adding CoreUpdater class. --- core/modules/system/system.updater.inc | 51 +++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/core/modules/system/system.updater.inc b/core/modules/system/system.updater.inc index 875fb5fb711..be1180825fc 100755 --- a/core/modules/system/system.updater.inc +++ b/core/modules/system/system.updater.inc @@ -2,10 +2,57 @@ /** * @file - * Subclasses of the Updater class to update Backdrop core knows how to update. - * At this time, only modules, themes and layouts are supported. + * Subclasses of the Updater class to update Backdrop core, modules, themes, and layouts. */ +/** + * Class for updating Backdrop core using FileTransfer classes via authorize.php. + */ +class ModuleUpdater extends Updater { + + /** + * Return the Backdrop core directory. + */ + public function getInstallDirectory() { + return BACKDROP_ROOT . '/core'; + } + + public function isInstalled() { + return (bool) file_exists($this->getInstallDirectory()); + } + + public static function canUpdateDirectory($directory) { + return (self::getProjectType($directory) == 'core'); + } + + static function canUpdate($project_name) { + return (bool) $this->isInstalled(); + } + + /** + * List of post install actions. + */ + public function postInstall() { + $project = array(); + $project['name'] = $this->name; + $project['type'] = 'core'; + $_SESSION['project_browser_installed_projects'][$this->name] = $project; + } + + /** + * List of post install actions. + */ + public function postInstallTasks() { + return array(); + } + + public function postUpdateTasks() { + // We don't want to check for DB updates here, we do that once for all + // updated modules on the landing page. + } + +} + /** * Class for updating modules using FileTransfer classes via authorize.php. */ From 7c65144533c5e258b421428eea91f52e7b7d229a Mon Sep 17 00:00:00 2001 From: "Geoff St. Pierre" Date: Sun, 13 May 2018 13:28:38 -0400 Subject: [PATCH 2/3] Issue #3105: Add Backdrop core updates via /admin/modules/update UI. --- core/includes/updater.inc | 34 ++++++++++++------ .../installer/.installer.authorize.inc.swp | Bin 0 -> 24576 bytes .../modules/installer/installer.authorize.inc | 9 ++++- core/modules/installer/installer.manager.inc | 29 +++------------ core/modules/installer/installer.module | 13 ------- core/modules/system/system.module | 6 ++++ core/modules/system/system.updater.inc | 4 +-- 7 files changed, 44 insertions(+), 51 deletions(-) create mode 100644 core/modules/installer/.installer.authorize.inc.swp diff --git a/core/includes/updater.inc b/core/includes/updater.inc index bd3a73de260..872d6f6ca47 100755 --- a/core/includes/updater.inc +++ b/core/includes/updater.inc @@ -181,16 +181,21 @@ abstract class Updater implements BackdropUpdaterInterface { * @throws UpdaterException */ public static function getProjectType($directory) { - $info_file = self::findInfoFile($directory); - $info = backdrop_parse_info_file($info_file); - if (empty($info)) { - throw new UpdaterException(t('Unable to parse info file: %info_file.', array('%info_file' => $info_file))); - } - if (empty($info['type'])) { - throw new UpdaterException(t("The info file (%info_file) does not define a 'type' attribute.", array('%info_file' => $info_file))); + if ($directory == BACKDROP_ROOT) { + return 'core'; } + else { + $info_file = self::findInfoFile($directory); + $info = backdrop_parse_info_file($info_file); + if (empty($info)) { + throw new UpdaterException(t('Unable to parse info file: %info_file.', array('%info_file' => $info_file))); + } + if (empty($info['type'])) { + throw new UpdaterException(t("The info file (%info_file) does not define a 'type' attribute.", array('%info_file' => $info_file))); + } - return $info['type']; + return $info['type']; + } } /** @@ -276,10 +281,19 @@ abstract class Updater implements BackdropUpdaterInterface { } // Copy the directory in place. - $filetransfer->copyDirectory($this->source, $args['install_dir']); + // Check for core udpate. + if ($this->name == 'backdrop') { + $source = $this->source . '/core'; + $name = 'core'; + } + else { + $source = $this->source; + $name = $this->name; + } + $filetransfer->copyDirectory($source, $args['install_dir']); // Make sure what we just installed is readable by the web server. - $this->makeWorldReadable($filetransfer, $args['install_dir'] . '/' . $this->name); + $this->makeWorldReadable($filetransfer, $args['install_dir'] . '/' . $name); // Run the updates. // @TODO: decide if we want to implement this. diff --git a/core/modules/installer/.installer.authorize.inc.swp b/core/modules/installer/.installer.authorize.inc.swp new file mode 100644 index 0000000000000000000000000000000000000000..9cd959ffdb63b86c78972035f8f2598491c34b38 GIT binary patch literal 24576 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 Y0y8vnq{&b?EYrmE*Q#tlFE`Bo7b`#`G5`Po literal 0 HcmV?d00001 diff --git a/core/modules/installer/installer.authorize.inc b/core/modules/installer/installer.authorize.inc index d4fe578cfb7..16a91415d66 100644 --- a/core/modules/installer/installer.authorize.inc +++ b/core/modules/installer/installer.authorize.inc @@ -29,11 +29,18 @@ function installer_authorize_run_update($filetransfer, $projects) { $operations = array(); foreach ($projects as $project => $project_info) { + if ($project_info['project'] == 'backdrop') { + $updater_name = 'CoreUpdater'; + } + else { + $updater_name = $project_info['updater_name']; + } + $operations[] = array( 'installer_authorize_batch_copy_project', array( $project_info['project'], - $project_info['updater_name'], + $updater_name, $project_info['local_url'], $filetransfer, ), diff --git a/core/modules/installer/installer.manager.inc b/core/modules/installer/installer.manager.inc index 5393ee3c27c..eba93e2f00f 100644 --- a/core/modules/installer/installer.manager.inc +++ b/core/modules/installer/installer.manager.inc @@ -174,36 +174,15 @@ function installer_manager_update_form($form, $form_state, $context) { $entry['#attributes'] = array('class' => array('update-' . $type)); - // Backdrop CMS core needs to be upgraded manually. - $needs_manual = $project['project_type'] == 'core'; - - if ($needs_manual) { - // There are no checkboxes in the 'Manual updates' table so it will be - // rendered by theme('table'), not theme('tableselect'). Since the data - // formats are incompatible, we convert now to the format expected by - // theme('table'). - unset($entry['#weight']); - $attributes = $entry['#attributes']; - unset($entry['#attributes']); - $entry = array( - 'data' => $entry, - ) + $attributes; - } - else { - $form['project_downloads'][$name] = array( - '#type' => 'value', - '#value' => $recommended_release['download_link'], - ); - } + $form['project_downloads'][$name] = array( + '#type' => 'value', + '#value' => $recommended_release['download_link'], + ); // Based on what kind of project this is, save the entry into the // appropriate subarray. switch ($project['project_type']) { case 'core': - // Core needs manual updates at this time. - $projects['manual'][$name] = $entry; - break; - case 'module': case 'theme': case 'layout': diff --git a/core/modules/installer/installer.module b/core/modules/installer/installer.module index 83914030073..1a219ece3d2 100644 --- a/core/modules/installer/installer.module +++ b/core/modules/installer/installer.module @@ -220,19 +220,6 @@ function installer_theme($existing, $type, $theme, $path) { function installer_verify_update_archive($project, $archive_file, $directory) { $errors = array(); - // Make sure this isn't a tarball of Backdrop core. - if ( - file_exists("$directory/$project/index.php") - && file_exists("$directory/$project/core/update.php") - && file_exists("$directory/$project/core/includes/bootstrap.inc") - && file_exists("$directory/$project/core/modules/node/node.module") - && file_exists("$directory/$project/core/modules/system/system.module") - ) { - return array( - 'no-core' => t('Automatic updating of Backdrop CMS core is not supported. See the upgrade guide for information on how to update Backdrop CMS core manually.', array('@upgrade-guide' => 'https://backdropcms.org/guide/upgrade')), - ); - } - // Parse all the .info files and make sure at least one is compatible with // this version of Backdrop core. If one is compatible, then the project as a // whole is considered compatible (since, for example, the project may ship diff --git a/core/modules/system/system.module b/core/modules/system/system.module index be9f6013e5a..22e18437cdd 100755 --- a/core/modules/system/system.module +++ b/core/modules/system/system.module @@ -2161,6 +2161,11 @@ function system_authorized_batch_process($redirect_callback = 'backdrop_goto') { */ function system_updater_info() { return array( + 'core' => array( + 'class' => 'CoreUpdater', + 'name' => t('Update Backdrop core'), + 'weight' => 0, + ), 'module' => array( 'class' => 'ModuleUpdater', 'name' => t('Update modules'), @@ -3872,6 +3877,7 @@ function system_autoload_info() { 'SystemQueue' => 'system.queue.inc', 'MemoryQueue' => 'system.queue.inc', 'Archive_Tar' => 'system.tar.inc', + 'CoreUpdater' => 'system.updater.inc', 'ModuleUpdater' => 'system.updater.inc', 'ThemeUpdater' => 'system.updater.inc', 'LayoutUpdater' => 'system.updater.inc', diff --git a/core/modules/system/system.updater.inc b/core/modules/system/system.updater.inc index be1180825fc..498c248a7eb 100755 --- a/core/modules/system/system.updater.inc +++ b/core/modules/system/system.updater.inc @@ -8,13 +8,13 @@ /** * Class for updating Backdrop core using FileTransfer classes via authorize.php. */ -class ModuleUpdater extends Updater { +class CoreUpdater extends Updater { /** * Return the Backdrop core directory. */ public function getInstallDirectory() { - return BACKDROP_ROOT . '/core'; + return BACKDROP_ROOT; } public function isInstalled() { From 974347d8ea49ccfacd6d5c7c8ac5f06d5a93b1ab Mon Sep 17 00:00:00 2001 From: "Geoff St. Pierre" Date: Mon, 14 May 2018 17:15:42 -0400 Subject: [PATCH 3/3] Issue #3105: Adding link to core UI update from /admin/reports/updates. --- .../installer/.installer.authorize.inc.swp | Bin 24576 -> 0 bytes core/modules/update/update.theme.inc | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 core/modules/installer/.installer.authorize.inc.swp diff --git a/core/modules/installer/.installer.authorize.inc.swp b/core/modules/installer/.installer.authorize.inc.swp deleted file mode 100644 index 9cd959ffdb63b86c78972035f8f2598491c34b38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 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 Y0y8vnq{&b?EYrmE*Q#tlFE`Bo7b`#`G5`Po diff --git a/core/modules/update/update.theme.inc b/core/modules/update/update.theme.inc index 2bd15a00332..e8547cc746a 100644 --- a/core/modules/update/update.theme.inc +++ b/core/modules/update/update.theme.inc @@ -79,7 +79,7 @@ function theme_update_report($variables) { foreach ($data as $project) { // Don't show a link to the "Update modules" page for core. - $update_link = ($project['name'] != 'backdrop'); + $update_link = ($project['name']); switch ($project['status']) { case UPDATE_NOT_SECURE: case UPDATE_REVOKED: @@ -121,6 +121,7 @@ function theme_update_report($variables) { $updatepath = 'admin/layouts/update'; break; + case 'core': case 'module': default: $updatepath = 'admin/modules/update';