Recurso Reverter tudo em um hook_update_N

I feautres normalmente reverter usando o drush feature-revertde drush feature-revert-allcomandos depois de executar atualizações de banco de dados (usando drush updatedb). Mas, às vezes, você precisa garantir que os Feautres sejam revertidos antes de executar algumas atualizações do banco de dados, e às vezes você precisa reverter todos os feautres. Claro, se o hook_update_Nque precisa ser executado após a reversão dos recursos for de um módulo diferente, você precisará de uma hook_update_dependenciesimplementação.

function MODULE_update_N(&$sandbox) {
module_load_include
('inc', 'features', 'features.export');
$messages
= array();
if (!isset($sandbox['features_to_revert'])) {
$sandbox
['features_to_revert'] = array();
foreach (features_get_features(NULL, TRUE) as $module) {
if ($module->status) {
$sandbox
['features_to_revert'][] = $module->name;
}
}
$sandbox
['revered_features'] = array();
}
if ($sandbox['features_to_revert']) {
$module
= array_shift($sandbox['features_to_revert']);
$dt_args
['@module'] = $module;
if (($feature = features_load_feature($module, TRUE)) && module_exists($module)) {
$components
= array();
// Forcefully revert all components of a feature.
foreach (array_keys($feature->info['features']) as $component) {
if (features_hook($component, 'features_revert')) {
$components
[] = $component;
}
}
foreach ($components as $component) {
$dt_args
['@component'] = $component;
if (features_feature_is_locked($module, $component)) {
$messages
[] = format_string('Skipping locked @module.@component.', $dt_args);
}
else {
features_revert
(array($module => array($component)));
$messages
[] = format_string('Reverted @module.@component.', $dt_args);
}
}
}
$sandbox
['revered_features'] = $module;
if ($sandbox['features_to_revert']) {
$sandbox
['#finished'] = count($sandbox['revered_features']) / (count($sandbox['features_to_revert']) + count($sandbox['revered_features']));
}
else {
$sandbox
['#finished'] = 1;
drupal_flush_all_caches
();
}
}
return implode("n", $messages);
}