From dfc35208915df9d4c054113a6a3fba86d72c4db1 Mon Sep 17 00:00:00 2001 From: knut <> Date: Wed, 8 Mar 2006 22:58:44 +0000 Subject: Added a ZendCodeAnalyzerTask and a analyze target to phing to be able to run the Zend Code Analyzer against the framework source --- buildscripts/phing/tasks/ZendCodeAnalyzerTask.php | 151 ++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 buildscripts/phing/tasks/ZendCodeAnalyzerTask.php (limited to 'buildscripts/phing/tasks/ZendCodeAnalyzerTask.php') diff --git a/buildscripts/phing/tasks/ZendCodeAnalyzerTask.php b/buildscripts/phing/tasks/ZendCodeAnalyzerTask.php new file mode 100644 index 00000000..e53dc887 --- /dev/null +++ b/buildscripts/phing/tasks/ZendCodeAnalyzerTask.php @@ -0,0 +1,151 @@ + + * @package phing.tasks.ext + */ +class ZendCodeAnalyzerTask extends Task { + + protected $analyzerPath = ""; // Path to ZendCodeAnalyzer binary + protected $file = ""; // the source file (from xml attribute) + protected $filesets = array(); // all fileset objects assigned to this task + protected $warnings = array(); + protected $counter = 0; + protected $disable = array(); + protected $enable = array(); + + /** + * File to be analyzed + * + * @param PhingFile $file + */ + public function setFile(PhingFile $file) { + $this->file = $file; + } + + /** + * Path to ZendCodeAnalyzer binary + * + * @param string $analyzerPath + */ + public function setAnalyzerPath($analyzerPath) { + $this->analyzerPath = $analyzerPath; + } + + /** + * Disable warning levels. Seperate warning levels with ',' + * + * @param string $disable + */ + public function setDisable($disable) { + $this->disable = explode(",", $disable); + } + + /** + * Enable warning levels. Seperate warning levels with ',' + * + * @param string $enable + */ + public function setEnable($enable) { + $this->enable = explode(",", $enable); + } + + /** + * Nested creator, creates a FileSet for this task + * + * @return FileSet The created fileset object + */ + function createFileSet() { + $num = array_push($this->filesets, new FileSet()); + return $this->filesets[$num-1]; + } + + /** + * Analyze against PhingFile or a FileSet + */ + public function main() { + if(!isset($this->analyzerPath)) { + throw new BuildException("Missing attribute 'analyzerPath'"); + } + if(!isset($this->file) and count($this->filesets) == 0) { + throw new BuildException("Missing either a nested fileset or attribute 'file' set"); + } + + if($this->file instanceof PhingFile) { + $this->analyze($this->file->getPath()); + } else { // process filesets + $project = $this->getProject(); + foreach($this->filesets as $fs) { + $ds = $fs->getDirectoryScanner($project); + $files = $ds->getIncludedFiles(); + $dir = $fs->getDir($this->project)->getPath(); + foreach($files as $file) { + $this->analyze($dir.DIRECTORY_SEPARATOR.$file); + } + } + } + $this->log("Number of findings: ".$this->counter, PROJECT_MSG_INFO); + } + + /** + * Analyze file + * + * @param string $file + * @return void + */ + protected function analyze($file) { + if(file_exists($file)) { + if(is_readable($file)) { + + // Construct shell command + $cmd = $this->analyzerPath." "; + foreach($this->enable as $enable) { // Enable warning levels + $cmd .= " --enable $enable "; + } + foreach($this->disable as $disable) { // Disable warning levels + $cmd .= " --disable $disable "; + } + $cmd .= "$file 2>&1"; + + // Execute command + $result = shell_exec($cmd); + $result = explode("\n", $result); + for($i=2, $size=count($result); $i<($size-1); $i++) { + $this->counter++; + $this->log($result[$i], PROJECT_MSG_WARN); + } + } else { + throw new BuildException('Permission denied: '.$file); + } + } else { + throw new BuildException('File not found: '.$file); + } + } +} + +?> \ No newline at end of file -- cgit v1.2.3