/** * 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.'); }