From bdd3823701fba587b06424276e37b6dbe5e34630 Mon Sep 17 00:00:00 2001
From: Romanos Dodopoulos <romanos.dodopoulos@cern.ch>
Date: Fri, 28 Apr 2017 11:56:32 +0200
Subject: [PATCH] Remove centrally managed module/theme from update

Implement hook_update_projects_alter() to remove all centrally managed
modules and themes from the Update manager. Those which are located
under ^sites/all/.

The hook doesn't work for modules whose module name does not match the
project name. A workaround would be far more extended than these few
lines of code. Another workaround would be to remove them individually
which wouldn't be extensible. So the best option is to follow a policy
to always match the module and project names (see
https://www.drupal.org/node/2821041 and DRUPAL-76)

The list_themes() function makes the unset operation easier for themes
because it returns a list of objects with all the related information
(i.e. path and project name). Still there was an error dues to a
single theme (cern_default) that isn't related to a project but this
was fixed with an if condition.

Related to DRUPAL-65.
---
 cern_integration.info   |  4 ++--
 cern_integration.module | 23 +++++++++++++++++++++++
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/cern_integration.info b/cern_integration.info
index 1103c61..3abc8f6 100644
--- a/cern_integration.info
+++ b/cern_integration.info
@@ -1,7 +1,7 @@
 name = CERN Integration
 package = CERN
 description = Provides CERN site integration for Drupal.
-version = "7.X-1.8"
+version = "7.X-1.9"
 core = 7.x
 
 dependencies[] = shib_auth
@@ -9,6 +9,6 @@ files[] = cern_integration.module
 files[] = cern_integration.install
 
 project = "cern_integration"
-datestamp = "1455099515"
+datestamp = "1493373769"
 
 required = TRUE
diff --git a/cern_integration.module b/cern_integration.module
index 179b6bc..7cee31a 100644
--- a/cern_integration.module
+++ b/cern_integration.module
@@ -555,3 +555,26 @@ function  cern_integration_form_domain_301_redirect_admin_form_alter (&$form, &$
 
 }
 
+/**
+ * Implements hook_update_projects_alter().
+ * Remove all centrally managed modules and themes from the Update manager.
+ */
+function cern_integration_update_projects_alter(&$projects) {
+    // Remove all centrally managed modules.
+    foreach (module_list() as $module) {
+        if (preg_match('/^sites\/all\/modules\//', drupal_get_path('module', $module))) {
+            // This works only if the module name matches the project name.
+            unset($projects[$module]);
+        }
+    }
+    // Remove all centrally managed themes.
+    foreach (list_themes() as $theme_obj){
+        // Check if there is a project for that theme.
+        // This is normally true but not always.
+        if (isset($theme_obj->info['project'])) {
+            if (preg_match('/^sites\/all\/themes\//', $theme_obj->filename)) {
+                unset($projects[$theme_obj->info['project']]);
+            }
+        }
+    }
+}
-- 
GitLab