From fce0c43e767b0da72794e0dffb0fd02241e84946 Mon Sep 17 00:00:00 2001 From: "deb.monish" Date: Sun, 22 Apr 2018 23:53:30 +0530 Subject: [PATCH] (dev/drupal/10) Make civicrm-version.php self-sufficient to fetch Civi version and CMS name --- .gitignore | 1 - CRM/Core/CodeGen/Main.php | 1 - CRM/Core/CodeGen/Version.php | 16 ----- CRM/Utils/System.php | 11 +--- civicrm-version.php | 112 +++++++++++++++++++++++++++++++++++ 5 files changed, 115 insertions(+), 26 deletions(-) delete mode 100644 CRM/Core/CodeGen/Version.php create mode 100755 civicrm-version.php diff --git a/.gitignore b/.gitignore index f7aa94f659..4e204a5b20 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,6 @@ CRM/Case/xml/configuration CRM/Core/DAO/.listAll.php CRM/Core/DAO/listAll.php bin/setup.conf -civicrm-version.php civicrm-version.txt civicrm.config.php node_modules diff --git a/CRM/Core/CodeGen/Main.php b/CRM/Core/CodeGen/Main.php index f85deb401b..9edd7b7818 100644 --- a/CRM/Core/CodeGen/Main.php +++ b/CRM/Core/CodeGen/Main.php @@ -110,7 +110,6 @@ Alternatively you can get a version of CiviCRM that matches your PHP version $tasks = array(); $tasks[] = new CRM_Core_CodeGen_Config($this); - $tasks[] = new CRM_Core_CodeGen_Version($this); $tasks[] = new CRM_Core_CodeGen_Reflection($this); $tasks[] = new CRM_Core_CodeGen_Schema($this); foreach (array_keys($this->tables) as $name) { diff --git a/CRM/Core/CodeGen/Version.php b/CRM/Core/CodeGen/Version.php deleted file mode 100644 index e98e38e888..0000000000 --- a/CRM/Core/CodeGen/Version.php +++ /dev/null @@ -1,16 +0,0 @@ -assign('db_version', $this->config->db_version); - $template->assign('cms', ucwords($this->config->cms)); - $template->run('civicrm_version.tpl', $this->config->phpCodePath . "civicrm-version.php"); - } - -} diff --git a/CRM/Utils/System.php b/CRM/Utils/System.php index e2d72f5303..394dde6639 100644 --- a/CRM/Utils/System.php +++ b/CRM/Utils/System.php @@ -1081,14 +1081,9 @@ class CRM_Utils_System { static $version; if (!$version) { - $verFile = implode(DIRECTORY_SEPARATOR, - array(dirname(__FILE__), '..', '..', 'xml', 'version.xml') - ); - if (file_exists($verFile)) { - $str = file_get_contents($verFile); - $xmlObj = simplexml_load_string($str); - $version = (string) $xmlObj->version_no; - } + $verFile = implode(DIRECTORY_SEPARATOR, [dirname(__FILE__), '..', '..', 'civicrm-version.php']); + require_once $verFile; + $version = \Civi\Version::findVersion(); // pattern check if (!CRM_Utils_System::isVersionFormatValid($version)) { diff --git a/civicrm-version.php b/civicrm-version.php new file mode 100755 index 0000000000..fccb2033ee --- /dev/null +++ b/civicrm-version.php @@ -0,0 +1,112 @@ +version_no; + } + + trigger_error("Unknown version", E_USER_ERROR); + exit(); + } + + /** + * Get the CMS name + */ + public static function findCMS() { + if (defined('CIVICRM_UF')) { + return CIVICRM_UF; + } + elseif (function_exists('drupal_bootstrap') && version_compare(VERSION, '6.0', '>=') && version_compare(VERSION, '7.0', '<')) { + return 'Drupal6'; + } + elseif (function_exists('drupal_bootstrap') && version_compare(VERSION, '7.0', '>=') && version_compare(VERSION, '8.0', '<')) { + return 'Drupal'; + } + else { + // guess CMS name from the current path + list($cmsType,) = self::findCMSRootPath(); + + if (!empty($cmsType)) { + return $cmsType; + } + } + } + + /** + * Get the CMS root path and CMS name + */ + public static function findCMSRootPath() { + $cmsPatterns = array( + 'Wordpress' => array( + 'wp-includes/version.php', + // Future? 'vendor/civicrm/wordpress/civicrm.php' => 'wp', + ), + 'Joomla' => array( + 'administrator/components/com_civicrm/civicrm/civicrm-version.php', + ), + 'Drupal' => array( + 'modules/system/system.module', // D7 + ), + 'Drupal8' => array( + 'core/core.services.yml', // D8 + ), + 'Backdrop' => array( + 'core/modules/layout/layout.module', + ), + ); + + $parts = explode('/', str_replace('\\', '/', self::getSearchDir())); + while (!empty($parts)) { + $basePath = implode('/', $parts); + + foreach ($cmsPatterns as $cmsType => $relPaths) { + foreach ($relPaths as $relPath) { + $matches = glob("$basePath/$relPath"); + if (!empty($matches)) { + return [$cmsType, $basePath]; + } + } + } + + array_pop($parts); + } + } + + /** + * Get the current path + */ + public static function getSearchDir() { + // getenv('PWD') works better with symlinked source trees, but it's + // not portable to Windows. + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + return getcwd(); + } + else { + return getenv('PWD'); + } + } + +} + +/** + * Get the CiviCRM version. + * TODO : For now this function is not included in \Civi\Version class so not to break any code + * which directly call civicrmVersion(). So those call need to replaced with \Civi\Version::civicrmVersion() + * when included in the class + */ +function civicrmVersion() { + return [ + 'version' => \Civi\Version::findVersion(), + 'cms' => \Civi\Version::findCMS(), + ]; +} -- 2.25.1