getEdits() as $op) { switch (get_class($op)) { case 'Drupal\Component\Diff\Engine\DiffOpCopy': // Nothing to do, a copy is what we expect. break; case 'Drupal\Component\Diff\Engine\DiffOpDelete': case 'Drupal\Component\Diff\Engine\DiffOpChange': // It is not part of the skipped config, so we can directly throw the // exception. if (!in_array($config_name, array_keys($skipped_config))) { throw new \Exception($config_name . ': ' . var_export($op, TRUE)); } // Allow to skip entire config files. if ($skipped_config[$config_name] === TRUE) { break; } // Allow to skip some specific lines of imported config files. // Ensure that the only changed lines are the ones we marked as // skipped. $all_skipped = TRUE; $changes = get_class($op) == 'Drupal\Component\Diff\Engine\DiffOpDelete' ? $op->orig : $op->closing; foreach ($changes as $closing) { // Skip some of the changes, as they are caused by module install // code. $found = FALSE; if (!empty($skipped_config[$config_name])) { foreach ($skipped_config[$config_name] as $line) { if (strpos($closing, $line) !== FALSE) { $found = TRUE; break; } } } $all_skipped = $all_skipped && $found; } if (!$all_skipped) { throw new \Exception($config_name . ': ' . var_export($op, TRUE)); } break; case 'Drupal\Component\Diff\Engine\DiffOpAdd': // The _core property does not exist in the default config. if ($op->closing[0] === '_core:') { break; } foreach ($op->closing as $closing) { // The UUIDs don't exist in the default config. if (strpos($closing, 'uuid: ') === 0) { break; } throw new \Exception($config_name . ': ' . var_export($op, TRUE)); } break; default: throw new \Exception($config_name . ': ' . var_export($op, TRUE)); } } } }