From 3b72f530de1c2d8e40ee0faa77c4fccae18ea855 Mon Sep 17 00:00:00 2001 From: wilsonge Date: Tue, 17 Aug 2021 03:03:51 +0100 Subject: [PATCH 01/12] Handle com_search migration to a core supported extension --- administrator/components/com_admin/script.php | 14 ++++++++ .../sql/updates/mysql/4.0.0-2021-08-17.sql | 16 +++++++++ .../updates/postgresql/4.0.0-2021-08-17.sql | 16 +++++++++ .../manifests/packages/pkg_search.xml | 33 +++++++++++++++++++ build/build.php | 6 ++++ 5 files changed, 85 insertions(+) create mode 100644 administrator/components/com_admin/sql/updates/mysql/4.0.0-2021-08-17.sql create mode 100644 administrator/components/com_admin/sql/updates/postgresql/4.0.0-2021-08-17.sql create mode 100644 administrator/manifests/packages/pkg_search.xml diff --git a/administrator/components/com_admin/script.php b/administrator/components/com_admin/script.php index 039caafc6bc9e..5e5a86f800db7 100644 --- a/administrator/components/com_admin/script.php +++ b/administrator/components/com_admin/script.php @@ -7386,6 +7386,20 @@ public function deleteUnexistingFiles($dryRun = false, $suppressOutput = false) $this->fixFilenameCasing(); + /* + * Needed for updates from 3.x + * If com_search doesn't exist then assume we can delete the search package manifest (included in the update packages) + */ + $searchInstalled = ExtensionHelper::getExtensionRecord('com_search', 'component'); + + if ($searchInstalled === null) + { + if (File::exists(JPATH_MANIFESTS . '/packages/pkg_search.xml')) + { + File::delete(JPATH_MANIFESTS . '/packages/pkg_search.xml'); + } + } + if ($suppressOutput === false && \count($status['folders_errors'])) { echo implode('
', $status['folders_errors']); diff --git a/administrator/components/com_admin/sql/updates/mysql/4.0.0-2021-08-17.sql b/administrator/components/com_admin/sql/updates/mysql/4.0.0-2021-08-17.sql new file mode 100644 index 0000000000000..93ebbb8378b19 --- /dev/null +++ b/administrator/components/com_admin/sql/updates/mysql/4.0.0-2021-08-17.sql @@ -0,0 +1,16 @@ +INSERT INTO `#__extensions` (`name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +('search', 'package', 'pkg_search', '', 0, 1, 1, 0, '', '', '', 0, NULL, 0, 0); + +UPDATE `#__extensions` SET `package_id` = (SELECT a.`extension_id` FROM `#__extensions` a WHERE a.`type`='package' AND a.`element`='pkg_search') WHERE `element` = 'com_search' AND `type` = 'component'; +UPDATE `#__extensions` SET `package_id` = (SELECT a.`extension_id` FROM `#__extensions` a WHERE a.`type`='package' AND a.`element`='pkg_search') WHERE `element` = 'mod_search' AND `type` = 'module' AND `client_id` = 0; +UPDATE `#__extensions` SET `package_id` = (SELECT a.`extension_id` FROM `#__extensions` a WHERE a.`type`='package' AND a.`element`='pkg_search') WHERE `element` = 'categories' AND `type` = 'plugin' AND `folder` = 'search'; +UPDATE `#__extensions` SET `package_id` = (SELECT a.`extension_id` FROM `#__extensions` a WHERE a.`type`='package' AND a.`element`='pkg_search') WHERE `element` = 'contacts' AND `type` = 'plugin' AND `folder` = 'search'; +UPDATE `#__extensions` SET `package_id` = (SELECT a.`extension_id` FROM `#__extensions` a WHERE a.`type`='package' AND a.`element`='pkg_search') WHERE `element` = 'content' AND `type` = 'plugin' AND `folder` = 'search'; +UPDATE `#__extensions` SET `package_id` = (SELECT a.`extension_id` FROM `#__extensions` a WHERE a.`type`='package' AND a.`element`='pkg_search') WHERE `element` = 'newsfeeds' AND `type` = 'plugin' AND `folder` = 'search'; +UPDATE `#__extensions` SET `package_id` = (SELECT a.`extension_id` FROM `#__extensions` a WHERE a.`type`='package' AND a.`element`='pkg_search') WHERE `element` = 'tags' AND `type` = 'plugin' AND `folder` = 'search'; + +INSERT INTO `#__update_sites` (`name`, `type`, `location`, `enabled`) VALUES +('Search Update Site', 'extension', 'https://raw.githubusercontent.com/joomla-extensions/search/main/manifest.xml', 1); + +INSERT INTO `#__update_sites_extensions` (`update_site_id`, `extension_id`) VALUES +((SELECT `update_site_id` FROM `#__update_sites` WHERE `name` = 'Search Update Site'), (SELECT `extension_id` FROM `#__extensions` WHERE `name` = 'pkg_search' AND `type` = 'package')); diff --git a/administrator/components/com_admin/sql/updates/postgresql/4.0.0-2021-08-17.sql b/administrator/components/com_admin/sql/updates/postgresql/4.0.0-2021-08-17.sql new file mode 100644 index 0000000000000..54882c2fe529e --- /dev/null +++ b/administrator/components/com_admin/sql/updates/postgresql/4.0.0-2021-08-17.sql @@ -0,0 +1,16 @@ +INSERT INTO "#__extensions" ("name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +('search', 'package', 'pkg_search', '', 0, 1, 1, 0, '', '', '', 0, NULL, 0, 0); + +UPDATE "#__extensions" SET "package_id" = sub.extension_id FROM (SELECT "extension_id" FROM "#__extensions" WHERE "type"='package' AND "element"='pkg_search') AS sub WHERE "element" = 'com_search' AND "type" = 'component'; +UPDATE "#__extensions" SET "package_id" = sub.extension_id FROM (SELECT "extension_id" FROM "#__extensions" WHERE "type"='package' AND "element"='pkg_search') AS sub WHERE "element" = 'mod_search' AND "type" = 'module' AND "client_id" = 0; +UPDATE "#__extensions" SET "package_id" = sub.extension_id FROM (SELECT "extension_id" FROM "#__extensions" WHERE "type"='package' AND "element"='pkg_search') AS sub WHERE "element" = 'categories' AND "type" = 'plugin' AND "folder" = 'search'; +UPDATE "#__extensions" SET "package_id" = sub.extension_id FROM (SELECT "extension_id" FROM "#__extensions" WHERE "type"='package' AND "element"='pkg_search') AS sub WHERE "element" = 'contacts' AND "type" = 'plugin' AND "folder" = 'search'; +UPDATE "#__extensions" SET "package_id" = sub.extension_id FROM (SELECT "extension_id" FROM "#__extensions" WHERE "type"='package' AND "element"='pkg_search') AS sub WHERE "element" = 'content' AND "type" = 'plugin' AND "folder" = 'search'; +UPDATE "#__extensions" SET "package_id" = sub.extension_id FROM (SELECT "extension_id" FROM "#__extensions" WHERE "type"='package' AND "element"='pkg_search') AS sub WHERE "element" = 'newsfeeds' AND "type" = 'plugin' AND "folder" = 'search'; +UPDATE "#__extensions" SET "package_id" = sub.extension_id FROM (SELECT "extension_id" FROM "#__extensions" WHERE "type"='package' AND "element"='pkg_search') AS sub WHERE "element" = 'tags' AND "type" = 'plugin' AND "folder" = 'search'; + +INSERT INTO "#__update_sites" ("name", "type", "location", "enabled") VALUES +('Search Update Site', 'extension', 'https://raw.githubusercontent.com/joomla-extensions/search/main/manifest.xml', 1); + +INSERT INTO "#__update_sites_extensions" ("update_site_id", "extension_id") VALUES +((SELECT "update_site_id" FROM "#__update_sites" WHERE "name" = 'Search Update Site'), (SELECT "extension_id" FROM "#__extensions" WHERE "name" = 'pkg_search' AND "type" = 'package')); diff --git a/administrator/manifests/packages/pkg_search.xml b/administrator/manifests/packages/pkg_search.xml new file mode 100644 index 0000000000000..e4e8a3e60cce2 --- /dev/null +++ b/administrator/manifests/packages/pkg_search.xml @@ -0,0 +1,33 @@ + + + pkg_search + search + 17.08.2021 + Joomla! Project + (C) 2021 Open Source Matters. All rights reserved. + admin@joomla.org + www.joomla.org + Joomla! Project + admin@joomla.org + www.joomla.org + 4.0.0-dev + GNU General Public License version 2 or later; see LICENSE.txt + script.php + + + com_search.zip + mod_search.zip + plg_search_categories.zip + plg_search_contacts.zip + plg_search_content.zip + plg_search_newsfeeds.zip + plg_search_tags.zip + + + en-GB/en-GB.pkg_search.sys.ini + + + + https://raw.githubusercontent.com/joomla-extensions/search/main/manifest.xml + + diff --git a/build/build.php b/build/build.php index ee315e9710863..d87de7da8b490 100644 --- a/build/build.php +++ b/build/build.php @@ -545,6 +545,9 @@ function clean_composer(string $dir) echo "Build full package files.\n"; chdir($time); +// The search package manifest should not be present for new installs, temporarily move it +system('mv administrator/manifests/packages/pkg_search.xml ../pkg_search.xml'); + // Create full archive packages. if (!$excludeBzip2) { @@ -592,6 +595,9 @@ function clean_composer(string $dir) system('rm images/joomla_black.png'); system('rm images/powered_by.png'); +// Move the search manifest back +system('mv ../pkg_search.xml administrator/manifests/packages/pkg_search.xml'); + if (!$excludeBzip2) { $packageName = 'Joomla_' . $fullVersion . '-' . $packageStability . '-Update_Package.tar.bz2'; From b39c9ed44cd013fc051ab0ab2c1b973b510068f9 Mon Sep 17 00:00:00 2001 From: George Wilson Date: Tue, 17 Aug 2021 03:18:15 +0100 Subject: [PATCH 02/12] Fix check --- administrator/components/com_admin/script.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/administrator/components/com_admin/script.php b/administrator/components/com_admin/script.php index 5e5a86f800db7..2e7f327e8ceb3 100644 --- a/administrator/components/com_admin/script.php +++ b/administrator/components/com_admin/script.php @@ -7389,10 +7389,10 @@ public function deleteUnexistingFiles($dryRun = false, $suppressOutput = false) /* * Needed for updates from 3.x * If com_search doesn't exist then assume we can delete the search package manifest (included in the update packages) + * We deliberately check for the presence of the files in case people have previously uninstalled their search extension + * but an update has put the files back. In that case it exists even if they don't believe in it! */ - $searchInstalled = ExtensionHelper::getExtensionRecord('com_search', 'component'); - - if ($searchInstalled === null) + if (!File::exists(JPATH_ADMINISTRATOR . '/components/com_search/search.php')) { if (File::exists(JPATH_MANIFESTS . '/packages/pkg_search.xml')) { From c0aa365f4873c451b1855104317ee05bf789e39e Mon Sep 17 00:00:00 2001 From: George Wilson Date: Tue, 17 Aug 2021 03:34:54 +0100 Subject: [PATCH 03/12] Fixes --- administrator/components/com_admin/script.php | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/administrator/components/com_admin/script.php b/administrator/components/com_admin/script.php index 2e7f327e8ceb3..8a72d914b8edf 100644 --- a/administrator/components/com_admin/script.php +++ b/administrator/components/com_admin/script.php @@ -7392,12 +7392,10 @@ public function deleteUnexistingFiles($dryRun = false, $suppressOutput = false) * We deliberately check for the presence of the files in case people have previously uninstalled their search extension * but an update has put the files back. In that case it exists even if they don't believe in it! */ - if (!File::exists(JPATH_ADMINISTRATOR . '/components/com_search/search.php')) + if (!File::exists(JPATH_ROOT . '/administrator/components/com_search/search.php') + && File::exists(JPATH_ROOT . '/administrator/manifests/packages/pkg_search.xml')) { - if (File::exists(JPATH_MANIFESTS . '/packages/pkg_search.xml')) - { - File::delete(JPATH_MANIFESTS . '/packages/pkg_search.xml'); - } + File::delete(JPATH_ROOT . '/administrator/manifests/packages/pkg_search.xml'); } if ($suppressOutput === false && \count($status['folders_errors'])) From 1d884bbab31a2e9647691f0aefd6317ee4eccc1b Mon Sep 17 00:00:00 2001 From: George Wilson Date: Tue, 17 Aug 2021 03:43:47 +0100 Subject: [PATCH 04/12] Fix update --- .../com_admin/sql/updates/postgresql/4.0.0-2021-08-17.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/administrator/components/com_admin/sql/updates/postgresql/4.0.0-2021-08-17.sql b/administrator/components/com_admin/sql/updates/postgresql/4.0.0-2021-08-17.sql index 54882c2fe529e..ea3f7f58f5ecb 100644 --- a/administrator/components/com_admin/sql/updates/postgresql/4.0.0-2021-08-17.sql +++ b/administrator/components/com_admin/sql/updates/postgresql/4.0.0-2021-08-17.sql @@ -13,4 +13,4 @@ INSERT INTO "#__update_sites" ("name", "type", "location", "enabled") VALUES ('Search Update Site', 'extension', 'https://raw.githubusercontent.com/joomla-extensions/search/main/manifest.xml', 1); INSERT INTO "#__update_sites_extensions" ("update_site_id", "extension_id") VALUES -((SELECT "update_site_id" FROM "#__update_sites" WHERE "name" = 'Search Update Site'), (SELECT "extension_id" FROM "#__extensions" WHERE "name" = 'pkg_search' AND "type" = 'package')); +((SELECT "update_site_id" FROM "#__update_sites" WHERE "name" = 'Search Update Site'), (SELECT "extension_id" FROM "#__extensions" WHERE "element" = 'pkg_search' AND "type" = 'package')); From 277cfa825e26558fdd114be667ca91fa336fb965 Mon Sep 17 00:00:00 2001 From: George Wilson Date: Tue, 17 Aug 2021 03:43:56 +0100 Subject: [PATCH 05/12] Fix update part 2 --- .../components/com_admin/sql/updates/mysql/4.0.0-2021-08-17.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/administrator/components/com_admin/sql/updates/mysql/4.0.0-2021-08-17.sql b/administrator/components/com_admin/sql/updates/mysql/4.0.0-2021-08-17.sql index 93ebbb8378b19..1522d67fc3869 100644 --- a/administrator/components/com_admin/sql/updates/mysql/4.0.0-2021-08-17.sql +++ b/administrator/components/com_admin/sql/updates/mysql/4.0.0-2021-08-17.sql @@ -13,4 +13,4 @@ INSERT INTO `#__update_sites` (`name`, `type`, `location`, `enabled`) VALUES ('Search Update Site', 'extension', 'https://raw.githubusercontent.com/joomla-extensions/search/main/manifest.xml', 1); INSERT INTO `#__update_sites_extensions` (`update_site_id`, `extension_id`) VALUES -((SELECT `update_site_id` FROM `#__update_sites` WHERE `name` = 'Search Update Site'), (SELECT `extension_id` FROM `#__extensions` WHERE `name` = 'pkg_search' AND `type` = 'package')); +((SELECT `update_site_id` FROM `#__update_sites` WHERE `name` = 'Search Update Site'), (SELECT `extension_id` FROM `#__extensions` WHERE `element` = 'pkg_search' AND `type` = 'package')); From 13cc077705ea0bf6c2f61271dbd541d830ba499a Mon Sep 17 00:00:00 2001 From: George Wilson Date: Tue, 17 Aug 2021 04:04:23 +0100 Subject: [PATCH 06/12] Update manifest cache for new extension even if not core core --- administrator/components/com_admin/script.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/administrator/components/com_admin/script.php b/administrator/components/com_admin/script.php index 8a72d914b8edf..c03c213b88c32 100644 --- a/administrator/components/com_admin/script.php +++ b/administrator/components/com_admin/script.php @@ -7387,7 +7387,7 @@ public function deleteUnexistingFiles($dryRun = false, $suppressOutput = false) $this->fixFilenameCasing(); /* - * Needed for updates from 3.x + * Needed for updates from 3.10 * If com_search doesn't exist then assume we can delete the search package manifest (included in the update packages) * We deliberately check for the presence of the files in case people have previously uninstalled their search extension * but an update has put the files back. In that case it exists even if they don't believe in it! @@ -7398,6 +7398,14 @@ public function deleteUnexistingFiles($dryRun = false, $suppressOutput = false) File::delete(JPATH_ROOT . '/administrator/manifests/packages/pkg_search.xml'); } + // Now we know we are keeping the search package. Refresh it's manifest cache so we have a definite version. + if (File::exists(JPATH_ROOT . '/administrator/manifests/packages/pkg_search.xml')) + { + $packageId = ExtensionHelper::getExtensionRecord('com_search', 'component')->extension_id; + $installer = new Installer; + $installer->refreshManifestCache($packageId) + } + if ($suppressOutput === false && \count($status['folders_errors'])) { echo implode('
', $status['folders_errors']); From 7a67862d7952ad6499676821b7b430559add8124 Mon Sep 17 00:00:00 2001 From: George Wilson Date: Tue, 17 Aug 2021 04:09:38 +0100 Subject: [PATCH 07/12] Fixes --- administrator/components/com_admin/script.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/administrator/components/com_admin/script.php b/administrator/components/com_admin/script.php index c03c213b88c32..20817fb522dd9 100644 --- a/administrator/components/com_admin/script.php +++ b/administrator/components/com_admin/script.php @@ -7401,7 +7401,7 @@ public function deleteUnexistingFiles($dryRun = false, $suppressOutput = false) // Now we know we are keeping the search package. Refresh it's manifest cache so we have a definite version. if (File::exists(JPATH_ROOT . '/administrator/manifests/packages/pkg_search.xml')) { - $packageId = ExtensionHelper::getExtensionRecord('com_search', 'component')->extension_id; + $packageId = ExtensionHelper::getExtensionRecord('pkg_search', 'package')->extension_id; $installer = new Installer; $installer->refreshManifestCache($packageId) } From bdad891f0aa3f7cf3cba547ee7b9335ef067d939 Mon Sep 17 00:00:00 2001 From: George Wilson Date: Tue, 17 Aug 2021 04:16:56 +0100 Subject: [PATCH 08/12] It's 4am. What can you do... --- administrator/components/com_admin/script.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/administrator/components/com_admin/script.php b/administrator/components/com_admin/script.php index 20817fb522dd9..a4a104ff1c3ca 100644 --- a/administrator/components/com_admin/script.php +++ b/administrator/components/com_admin/script.php @@ -7403,7 +7403,7 @@ public function deleteUnexistingFiles($dryRun = false, $suppressOutput = false) { $packageId = ExtensionHelper::getExtensionRecord('pkg_search', 'package')->extension_id; $installer = new Installer; - $installer->refreshManifestCache($packageId) + $installer->refreshManifestCache($packageId); } if ($suppressOutput === false && \count($status['folders_errors'])) From 7f21f5c0468baf4ee2e48fc463f31ac19cc2adf5 Mon Sep 17 00:00:00 2001 From: George Wilson Date: Tue, 17 Aug 2021 04:28:09 +0100 Subject: [PATCH 09/12] Change location --- administrator/components/com_admin/script.php | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/administrator/components/com_admin/script.php b/administrator/components/com_admin/script.php index a4a104ff1c3ca..0ff5ba442b873 100644 --- a/administrator/components/com_admin/script.php +++ b/administrator/components/com_admin/script.php @@ -596,6 +596,12 @@ protected function updateManifestCaches() return; } + // If we have the search package around, it may not have a manifest cache entry after upgrades from 3.x, so add it to the list + if (File::exists(JPATH_ROOT . '/administrator/manifests/packages/pkg_search.xml')) + { + $extensions[] = ExtensionHelper::getExtensionRecord('pkg_search', 'package')->extension_id; + } + $installer = new Installer; foreach ($extensions as $extension) @@ -7398,14 +7404,6 @@ public function deleteUnexistingFiles($dryRun = false, $suppressOutput = false) File::delete(JPATH_ROOT . '/administrator/manifests/packages/pkg_search.xml'); } - // Now we know we are keeping the search package. Refresh it's manifest cache so we have a definite version. - if (File::exists(JPATH_ROOT . '/administrator/manifests/packages/pkg_search.xml')) - { - $packageId = ExtensionHelper::getExtensionRecord('pkg_search', 'package')->extension_id; - $installer = new Installer; - $installer->refreshManifestCache($packageId); - } - if ($suppressOutput === false && \count($status['folders_errors'])) { echo implode('
', $status['folders_errors']); From 66e64960d971dcce3635c38c3d616f994e4cb260 Mon Sep 17 00:00:00 2001 From: George Wilson Date: Tue, 17 Aug 2021 04:38:43 +0100 Subject: [PATCH 10/12] Fixes --- administrator/components/com_admin/script.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/administrator/components/com_admin/script.php b/administrator/components/com_admin/script.php index 0ff5ba442b873..3c2f89a7caecd 100644 --- a/administrator/components/com_admin/script.php +++ b/administrator/components/com_admin/script.php @@ -599,7 +599,7 @@ protected function updateManifestCaches() // If we have the search package around, it may not have a manifest cache entry after upgrades from 3.x, so add it to the list if (File::exists(JPATH_ROOT . '/administrator/manifests/packages/pkg_search.xml')) { - $extensions[] = ExtensionHelper::getExtensionRecord('pkg_search', 'package')->extension_id; + $extensions[] = ExtensionHelper::getExtensionRecord('pkg_search', 'package'); } $installer = new Installer; From aff926d40a4712f6e1692393768508181b934634 Mon Sep 17 00:00:00 2001 From: George Wilson Date: Tue, 17 Aug 2021 04:49:47 +0100 Subject: [PATCH 11/12] Move check around for better results --- administrator/components/com_admin/script.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/administrator/components/com_admin/script.php b/administrator/components/com_admin/script.php index 3c2f89a7caecd..283915c1b0da0 100644 --- a/administrator/components/com_admin/script.php +++ b/administrator/components/com_admin/script.php @@ -567,6 +567,12 @@ protected function updateManifestCaches() { $extensions = ExtensionHelper::getCoreExtensions(); + // If we have the search package around, it may not have a manifest cache entry after upgrades from 3.x, so add it to the list + if (File::exists(JPATH_ROOT . '/administrator/manifests/packages/pkg_search.xml')) + { + $extensions[] = array('package', 'pkg_search', '', 0); + } + // Attempt to refresh manifest caches $db = Factory::getDbo(); $query = $db->getQuery(true) @@ -596,12 +602,6 @@ protected function updateManifestCaches() return; } - // If we have the search package around, it may not have a manifest cache entry after upgrades from 3.x, so add it to the list - if (File::exists(JPATH_ROOT . '/administrator/manifests/packages/pkg_search.xml')) - { - $extensions[] = ExtensionHelper::getExtensionRecord('pkg_search', 'package'); - } - $installer = new Installer; foreach ($extensions as $extension) From 029d130d643fd91a4081f234246efc6108e16d31 Mon Sep 17 00:00:00 2001 From: George Wilson Date: Tue, 17 Aug 2021 05:00:33 +0100 Subject: [PATCH 12/12] Version not dev --- administrator/manifests/packages/pkg_search.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/administrator/manifests/packages/pkg_search.xml b/administrator/manifests/packages/pkg_search.xml index e4e8a3e60cce2..ee39069e152a7 100644 --- a/administrator/manifests/packages/pkg_search.xml +++ b/administrator/manifests/packages/pkg_search.xml @@ -10,7 +10,7 @@ Joomla! Project admin@joomla.org www.joomla.org - 4.0.0-dev + 4.0.0 GNU General Public License version 2 or later; see LICENSE.txt script.php