/**
  * Pre Package event behaviour for backing up preserved paths.
  *
  * @param \Composer\Script\PackageEvent $event
  */
 public function prePackage(PackageEvent $event)
 {
     $packages = $this->getPackagesFromEvent($event);
     $paths = $this->getInstallPathsFromPackages($packages);
     $preserver = new PathPreserver($paths, $this->getPreservePaths(), $this->composer->getConfig()->get('cache-dir'), $this->filesystem, $this->io);
     // Store preserver for reuse in post package.
     $this->preservers[$this->getUniqueNameFromPackages($packages)] = $preserver;
     $preserver->preserve();
 }
 /**
  * Tests preservation and rollback on tricky path permissions.
  *
  * @depends testPreserveAndRollback
  */
 public function testFileModes()
 {
     $workingDirectory = new TempDirectory(__METHOD__);
     $cacheDirectory = new TempDirectory(__METHOD__ . '-cache');
     // Create directory to test.
     $folder1 = $workingDirectory->getPath('folder1');
     mkdir($folder1);
     $subfolder1 = $workingDirectory->getPath('folder1/subfolder1');
     mkdir($subfolder1);
     $file1 = $workingDirectory->getPath('folder1/file1.txt');
     file_put_contents($file1, 'Test content');
     $file2 = $workingDirectory->getPath('folder1/file2.txt');
     file_put_contents($file2, 'Test content 2');
     // After changing some permissions we test if the given paths can be
     // restored.
     chmod($file2, 0400);
     // For checking if file exists, we need to set the permission for the folder
     // differently
     // @see http://stackoverflow.com/questions/11834629/glob-lists-files-file-exists-says-they-dont-exist
     chmod($folder1, 0500);
     $this->assertIsDir($folder1, 'Folder created.');
     $this->assertIsDir($subfolder1, 'Subfolder 1 created.');
     $this->assertFileExists($file1, 'File 1 created.');
     $this->assertFileExists($file2, 'File 2 created.');
     $installPaths = array($folder1);
     $preservePaths = array($subfolder1, $file1, $file2);
     $preserver = new PathPreserver($installPaths, $preservePaths, $cacheDirectory->getRoot(), $this->fs, $this->io);
     // We check if preservation works even with restrictive permissions.
     chmod($folder1, 0400);
     $preserver->preserve();
     chmod($folder1, 0500);
     $this->assertIsDir($folder1, 'Folder not removed for backup.');
     $this->assertFileNotExists($subfolder1, 'Subfolder removed for backup.');
     $this->assertFileNotExists($file1, 'File 1 was removed for backup.');
     $this->assertFileNotExists($file2, 'File 2 was removed for backup.');
     // We check if rollback works even with restrictive permissions.
     chmod($folder1, 0400);
     $preserver->rollback();
     chmod($folder1, 0500);
     $this->assertFileExists($subfolder1, 'Subfolder 1 recreated.');
     $this->assertFileExists($file1, 'File 1 recreated.');
     $this->assertFileExists($file2, 'File 2 recreated.');
 }