Browse Source

modified AutoloadBuilder to atomic write operation

master
Anton Grebnev 12 years ago
parent
commit
40b3e76c74
  1. 15
      tests/util/AutoloadBuilderTest.php
  2. 42
      util/AutoloadBuilder.php

15
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)) {

42
util/AutoloadBuilder.php

@ -35,7 +35,7 @@ class AutoloadBuilder
public function build()
{
$this->openAutoload();
$array_string = "<?php\n// This file is autogenerated by \n// " . __FILE__ . " script.\nreturn array(\n";
// for dublicates check
$classes = array();
foreach ($this->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("<?php\n// This file is autogenerated by \n// " . __FILE__ . " script.\nreturn array(\n");
file_put_contents($this->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)

Loading…
Cancel
Save