From 40b3e76c74c2f00a7be4ea823daaf833c0e155c2 Mon Sep 17 00:00:00 2001 From: Anton Grebnev Date: Tue, 6 Mar 2012 18:47:40 +0400 Subject: [PATCH] modified AutoloadBuilder to atomic write operation --- tests/util/AutoloadBuilderTest.php | 15 ++++++-------- util/AutoloadBuilder.php | 42 +++++++++++++++----------------------- 2 files changed, 23 insertions(+), 34 deletions(-) diff --git a/tests/util/AutoloadBuilderTest.php b/tests/util/AutoloadBuilderTest.php index a3aaff9..f9feb7c 100644 --- a/tests/util/AutoloadBuilderTest.php +++ b/tests/util/AutoloadBuilderTest.php @@ -77,6 +77,7 @@ class AutoloadBuilderTest extends PHPUnit_Framework_TestCase $this->setConstants(); $builder = new AutoloadBuilder(self::$file, array(self::$path . '/' . self::$app . '/src', self::$path . '/' . self::$app . '/cache', self::$path . '/lib')); + $this->assertFileNotExists(self::$file); $builder->build(); $this->assertFileExists(self::$file); @@ -84,6 +85,8 @@ class AutoloadBuilderTest extends PHPUnit_Framework_TestCase $array = require self::$file; $this->assertInternalType('array', $array); $this->assertNotEmpty($array); + $this->assertArrayHasKey('AutoloadBuilder', $array); + $this->assertArrayHasKey('Load', $array); } /** @@ -94,7 +97,10 @@ class AutoloadBuilderTest extends PHPUnit_Framework_TestCase $this->setConstants(); $this->setExpectedException('PHPUnit_Framework_Error'); + $this->assertFileNotExists(self::$file); + touch(self::$file); + $this->assertFileExists(self::$file); chmod(self::$file, 0400); $builder = new AutoloadBuilder(self::$file, array(self::$path . '/' . self::$app . '/src', self::$path . '/' . self::$app . '/cache', self::$path . '/lib')); @@ -102,15 +108,6 @@ class AutoloadBuilderTest extends PHPUnit_Framework_TestCase chmod(self::$file, 0777); } - public function tearDown() - { -// if (defined('PATH')) { -// echo PHP_EOL . __CLASS__ . ' ' . PATH . PHP_EOL; -// } else { -// echo PHP_EOL . __CLASS__ . ' ' . 'PATH NOT DEFINED' . PHP_EOL; -// } - } - public static function tearDownAfterClass() { if (file_exists(self::$file)) { diff --git a/util/AutoloadBuilder.php b/util/AutoloadBuilder.php index 3f64ef6..5c969cd 100644 --- a/util/AutoloadBuilder.php +++ b/util/AutoloadBuilder.php @@ -35,7 +35,7 @@ class AutoloadBuilder public function build() { - $this->openAutoload(); + $array_string = "dirs as $dir) { @@ -65,47 +65,39 @@ class AutoloadBuilder if (array_key_exists($match[2], $classes)) { continue; } - $string = "'{$match[2]}'=>'" . $relative_path . "',\n"; - $this->write($string); + $array_string .= "'{$match[2]}'=>'" . $relative_path . "',\n"; $classes[$match[2]] = $file->getRealPath(); } } } } - $this->closeAutoload(); + $array_string .= ');'; + $this->writeAutoload($array_string); + $this->isFileConsistent(); } - protected function isExcluded($file) - { - foreach ($this->exclude as $dir) { - if (stripos($file, PATH . $dir) === 0) { - return true; - } - } - return false; - } - - - protected function openAutoload() + protected function writeAutoload($string) { - $this->write("autoload, $string); } - protected function closeAutoload() + protected function isFileConsistent() { - if ($this->write(');')) { - fclose($this->handler); + $autoload_array = include($this->autoload); + if(!is_array($autoload_array)) { + unlink($this->autoload); + trigger_error("Error while generating autoload file.", E_USER_ERROR); } } - protected function write($string) + protected function isExcluded($file) { - if (!$this->handler) { - if (!$this->handler = fopen($this->autoload, 'w')) { - trigger_error("{$this->autoload} is not writable", E_USER_ERROR); + foreach ($this->exclude as $dir) { + if (stripos($file, PATH . $dir) === 0) { + return true; } } - return (bool) fwrite($this->handler, $string); + return false; } protected function rightSubstr($string, $nchars)