CRM-14885 - CRM_Core_CodeGen - Allow tasks to define `needsUpdate()`
authorTim Otten <totten@civicrm.org>
Wed, 27 Jul 2016 07:26:00 +0000 (00:26 -0700)
committerTim Otten <totten@civicrm.org>
Thu, 28 Jul 2016 00:20:16 +0000 (17:20 -0700)
CRM/Core/CodeGen/BaseTask.php
CRM/Core/CodeGen/ITask.php
CRM/Core/CodeGen/Main.php
CRM/Core/CodeGen/Util/File.php

index 5bff34541349e11572b7c34af0fe9130b138aaaa..f220415bd014b79fa6e2df2bcba36e25f379dea3 100644 (file)
@@ -29,4 +29,12 @@ abstract class CRM_Core_CodeGen_BaseTask implements CRM_Core_CodeGen_ITask {
     $this->tables = $this->config->tables;
   }
 
+  /**
+   * @return bool
+   *   TRUE if an update is needed.
+   */
+  public function needsUpdate() {
+    return TRUE;
+  }
+
 }
index 4797ca2629a0efd03252324e057d0e6cea9495e1..c5338c29c537856266069cddaf90ca535d461a43 100644 (file)
@@ -10,4 +10,10 @@ interface CRM_Core_CodeGen_ITask {
    */
   public function run();
 
+  /**
+   * @return bool
+   *   TRUE if an update is needed.
+   */
+  public function needsUpdate();
+
 }
index 0fdab711a6ecf0f2c06ecbefffcd3659b6e7e36b..bb33c756084d67d9940eaee417c0d61fcad7eb62 100644 (file)
@@ -14,6 +14,20 @@ class CRM_Core_CodeGen_Main {
   var $tplCodePath;
   var $schemaPath; // ex: schema/Schema.xml
 
+  /**
+   * Definitions of all tables.
+   *
+   * @var array
+   *   Ex: $tables['civicrm_address_format']['className'] = 'CRM_Core_DAO_AddressFormat';
+   */
+  var $tables;
+
+  /**
+   * @var array
+   *   Ex: $database['tableAttributes_modern'] = "ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci";
+   */
+  var $database;
+
   /**
    * @var string|NULL path in which to store a marker that indicates the last execution of
    * GenCode. If a matching marker already exists, GenCode doesn't run.
@@ -23,7 +37,7 @@ class CRM_Core_CodeGen_Main {
   /**
    * @var string|NULL a digest of the inputs to the code-generator (eg the properties and source files)
    */
-  var $digest;
+  var $sourceDigest;
 
   /**
    * @param $CoreDAOCodePath
@@ -42,7 +56,7 @@ class CRM_Core_CodeGen_Main {
     $this->phpCodePath = $phpCodePath;
     $this->tplCodePath = $tplCodePath;
     $this->digestPath = $digestPath;
-    $this->digest = NULL;
+    $this->sourceDigest = NULL;
 
     // default cms is 'drupal', if not specified
     $this->cms = isset($argCms) ? strtolower($argCms) : 'drupal';
@@ -88,7 +102,9 @@ Alternatively you can get a version of CiviCRM that matches your PHP version
     $this->tables = $specification->tables;
 
     foreach ($this->getTasks() as $task) {
-      $task->run();
+      if (getenv('GENCODE_FORCE') || $task->needsUpdate()) {
+        $task->run();
+      }
     }
   }
 
@@ -132,4 +148,23 @@ Alternatively you can get a version of CiviCRM that matches your PHP version
     return TRUE;
   }
 
+  /**
+   * Compute a digest based on the GenCode logic (PHP/tpl).
+   *
+   * @return string
+   */
+  public function getSourceDigest() {
+    if ($this->sourceDigest === NULL) {
+      $srcDir = CRM_Core_CodeGen_Util_File::findCoreSourceDir();
+      $files = CRM_Core_CodeGen_Util_File::findManyFiles(array(
+        array("$srcDir/CRM/Core/CodeGen", '*.php'),
+        array("$srcDir/xml", "*.php"),
+        array("$srcDir/xml", "*.tpl"),
+      ));
+
+      $this->sourceDigest = CRM_Core_CodeGen_Util_File::digestAll($files);
+    }
+    return $this->sourceDigest;
+  }
+
 }
index 98680958b8b81babcbca3439a2eeae2bdbdba8a7..a7d5e1e456091cb9dcc14745579e6ee269522c1a 100644 (file)
@@ -90,6 +90,7 @@ class CRM_Core_CodeGen_Util_File {
       list ($dir, $pattern) = $pair;
       $files = array_merge($files, CRM_Utils_File::findFiles($dir, $pattern));
     }
+    sort($files);
     return $files;
   }