/**
  * Reads and merges in existing files for a given package or profile.
  */
 protected function preparePackage(Package $package, array $existing_packages, FeaturesBundleInterface $bundle = NULL)
 {
     if (isset($existing_packages[$package->getMachineName()])) {
         $existing_directory = $existing_packages[$package->getMachineName()];
         // Scan for all files.
         $files = file_scan_directory($existing_directory, '/.*/');
         foreach ($files as $file) {
             // Skip files in the any existing configuration directory, as these
             // will be replaced.
             foreach (array_keys($this->featuresManager->getExtensionStorages()->getExtensionStorages()) as $directory) {
                 if (strpos($file->uri, $directory) !== FALSE) {
                     continue 2;
                 }
             }
             // Merge in the info file.
             if ($file->name == $package->getMachineName() . '.info') {
                 $files = $package->getFiles();
                 $files['info']['string'] = $this->mergeInfoFile($package->getFiles()['info']['string'], $file->uri);
                 $package->setFiles($files);
             } else {
                 // Determine if the file is within a subdirectory of the
                 // extension's directory.
                 $file_directory = dirname($file->uri);
                 if ($file_directory !== $existing_directory) {
                     $subdirectory = substr($file_directory, strlen($existing_directory) + 1);
                 } else {
                     $subdirectory = NULL;
                 }
                 $package->appendFile(['filename' => $file->filename, 'subdirectory' => $subdirectory, 'string' => file_get_contents($file->uri)]);
             }
         }
     }
 }
 /**
  * Reads and merges in existing files for a given package or profile.
  *
  * @param \Drupal\features\Package &$package
  *   The package.
  * @param array $existing_packages
  *   An array of existing packages.
  * @param \Drupal\features\FeaturesBundleInterface $bundle
  *   The bundle the package belongs to.
  */
 protected function preparePackage(Package $package, array $existing_packages, FeaturesBundleInterface $bundle = NULL)
 {
     // If this package is already present, prepare files.
     if (isset($existing_packages[$package->getMachineName()])) {
         $existing_directory = $existing_packages[$package->getMachineName()];
         $package->setDirectory($existing_directory);
         // Merge in the info file.
         $info_file_uri = $this->root . '/' . $existing_directory . '/' . $package->getMachineName() . '.info.yml';
         if (file_exists($info_file_uri)) {
             $files = $package->getFiles();
             $files['info']['string'] = $this->mergeInfoFile($package->getFiles()['info']['string'], $info_file_uri);
             $package->setFiles($files);
         }
         // Remove the config directories, as they will be replaced.
         foreach (array_keys($this->featuresManager->getExtensionStorages()->getExtensionStorages()) as $directory) {
             $config_directory = $this->root . '/' . $existing_directory . '/' . $directory;
             if (is_dir($config_directory)) {
                 file_unmanaged_delete_recursive($config_directory);
             }
         }
     }
 }