diff options
Diffstat (limited to 'util/docblox_errorchecker.php')
-rw-r--r-- | util/docblox_errorchecker.php | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/util/docblox_errorchecker.php b/util/docblox_errorchecker.php new file mode 100644 index 000000000..af4c76444 --- /dev/null +++ b/util/docblox_errorchecker.php @@ -0,0 +1,145 @@ +<?php +/** + * When I installed docblox, I had the experience that it does not generate any output at all. + * This script may be used to find that kind of problems with the documentation build process. + * If docblox generates output, use another approach for debugging. + * + * Basically, docblox takes a list of files to build documentation from. This script assumes there is a file or set of files + * breaking the build when it is included in that list. It tries to calculate the smallest list containing these files. + * Unfortunatly, the original problem is NP-complete, so what the script does is a best guess only. + * + * So it starts with a list of all files in the project. + * If that list can't be build, it cuts it in two parts and tries both parts independently. If only one of them breaks, + * it takes that one and tries the same independently. If both break, it assumes this is the smallest set. This assumption + * is not necessarily true. Maybe the smallest set consists of two files and both of them were in different parts when + * the list was divided, but by now it is my best guess. To make this assumption better, the list is shuffled after every step. + * + * After that, the script tries to remove a file from the list. It tests if the list breaks and if so, it + * assumes that the file it removed belongs to the set of errorneous files. + * This is done for all files, so, in the end removing one file leads to a working doc build. + * + * @package util + * @author Alexander Kampmann + */ + +/** + * This function generates a comma seperated list of file names. + * + * @package util + * + * @param array $fileset Set of file names + * + * @return string comma-seperated list of the file names + */ +function namesList($fileset) { + $fsparam=""; + foreach($fileset as $file) { + $fsparam=$fsparam.",".$file; + } + return $fsparam; +}; + +/** + * This functions runs phpdoc on the provided list of files + * @package util + * + * @param array $fileset Set of filenames + * + * @return bool true, if that set can be built + */ +function runs($fileset) { + $fsParam=namesList($fileset); + exec('docblox -t phpdoc_out -f '.$fsParam); + if(file_exists("phpdoc_out/index.html")) { + echo "\n Subset ".$fsParam." is okay. \n"; + exec('rm -r phpdoc_out'); + return true; + } else { + echo "\n Subset ".$fsParam." failed. \n"; + return false; + } +}; + +/** + * This functions cuts down a fileset by removing files until it finally works. + * it was meant to be recursive, but php's maximum stack size is to small. So it just simulates recursion. + * + * In that version, it does not necessarily generate the smallest set, because it may not alter the elements order enough. + * + * @package util + * + * @param array $fileset set of filenames + * @param int $ps number of files in subsets + * + * @return array a part of $fileset, that crashes + */ +function reduce($fileset, $ps) { + //split array... + $parts=array_chunk($fileset, $ps); + //filter working subsets... + $parts=array_filter($parts, "runs"); + //melt remaining parts together + if(is_array($parts)) { + return array_reduce($parts, "array_merge", array()); + } + return array(); +}; + +//return from util folder to frindica base dir +$dir='..'; + +//stack for dirs to search +$dirstack=array(); +//list of source files +$filelist=array(); + +//loop over all files in $dir +while($dh=opendir($dir)) { + while($file=readdir($dh)) { + if(is_dir($dir."/".$file)) { + //add to directory stack + if($file!=".." && $file!=".") { + array_push($dirstack, $dir."/".$file); + echo "dir ".$dir."/".$file."\n"; + } + } else { + //test if it is a source file and add to filelist + if(substr($file, strlen($file)-4)==".php") { + array_push($filelist, $dir."/".$file); + echo $dir."/".$file."\n"; + } + } + } + //look at the next dir + $dir=array_pop($dirstack); +} + +//check the entire set +if(runs($filelist)) { + echo "I can not detect a problem. \n"; + exit; +} + +//check half of the set and discard if that half is okay +$res=$filelist; +$i=0; +do { + $i=count($res); + echo $i."/".count($fileset)." elements remaining. \n"; + $res=reduce($res, count($res)/2); + shuffle($res); +} while(count($res)<$i); + +//check one file after another +$needed=array(); + +while(count($res)!=0) { + $file=array_pop($res); + + if(runs(array_merge($res, $needed))) { + echo "needs: ".$file." and file count ".count($needed); + array_push($needed, $file); + } +} + +echo "\nSmallest Set is: ".namesList($needed)." with ".count($needed)." files. "; |