X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=php%2Fphpxmlrpc%2Fpakefile.php;fp=php%2Fphpxmlrpc%2Fpakefile.php;h=4bca828e0af3908706524d479f045fb4b08b7935;hb=21d187714285d9818fd94509b015ba069facb7ef;hp=0000000000000000000000000000000000000000;hpb=9bd41316bc9541bbedfe45377089d4e4927129b1;p=plcapi.git diff --git a/php/phpxmlrpc/pakefile.php b/php/phpxmlrpc/pakefile.php new file mode 100644 index 0000000..4bca828 --- /dev/null +++ b/php/phpxmlrpc/pakefile.php @@ -0,0 +1,400 @@ + 'asciidoctor', + 'fop' => 'fop', + 'php' => 'php', + 'zip' => 'zip', + ); + protected static $options = array( + 'repo' => 'https://github.com/gggeek/phpxmlrpc', + 'branch' => 'master' + ); + + public static function libVersion() + { + if (self::$libVersion == null) + throw new \Exception('Missing library version argument'); + return self::$libVersion; + } + + public static function buildDir() + { + return self::$buildDir; + } + + public static function workspaceDir() + { + return self::buildDir().'/workspace'; + } + + /// most likely things will break if this one is moved outside of BuildDir + public static function distDir() + { + return self::buildDir().'/xmlrpc-'.self::libVersion(); + } + + /// these will be generated in BuildDir + public static function distFiles() + { + return array( + 'xmlrpc-'.self::libVersion().'.tar.gz', + 'xmlrpc-'.self::libVersion().'.zip', + ); + } + + public static function getOpts($args=array(), $cliOpts=array()) + { + if (count($args) > 0) + // throw new \Exception('Missing library version argument'); + self::$libVersion = $args[0]; + + foreach (self::$tools as $name => $binary) { + if (isset($cliOpts[$name])) { + self::$tools[$name] = $cliOpts[$name]; + } + } + + foreach (self::$options as $name => $value) { + if (isset($cliOpts[$name])) { + self::$options[$name] = $cliOpts[$name]; + } + } + + //pake_echo('---'.self::$libVersion.'---'); + } + + /** + * @param string $name + * @return string + */ + public static function tool($name) + { + return self::$tools[$name]; + } + + /** + * @param string $name + * @return string + */ + public static function option($name) + { + return self::$options[$name]; + } + + /** + * @param string $inFile + * @param string $xssFile + * @param string $outFileOrDir + * @throws \Exception + */ + public static function applyXslt($inFile, $xssFile, $outFileOrDir) + { + + if (!file_exists($inFile)) { + throw new \Exception("File $inFile cannot be found"); + } + if (!file_exists($xssFile)) { + throw new \Exception("File $xssFile cannot be found"); + } + + // Load the XML source + $xml = new \DOMDocument(); + $xml->load($inFile); + $xsl = new \DOMDocument(); + $xsl->load($xssFile); + + // Configure the transformer + $processor = new \XSLTProcessor(); + if (version_compare(PHP_VERSION, '5.4', "<")) { + if (defined('XSL_SECPREF_WRITE_FILE')) { + ini_set("xsl.security_prefs", XSL_SECPREF_CREATE_DIRECTORY | XSL_SECPREF_WRITE_FILE); + } + } else { + // the php online docs only mention setSecurityPrefs, but somehow some installs have setSecurityPreferences... + if (method_exists('XSLTProcessor', 'setSecurityPrefs')) { + $processor->setSecurityPrefs(XSL_SECPREF_CREATE_DIRECTORY | XSL_SECPREF_WRITE_FILE); + } else { + $processor->setSecurityPreferences(XSL_SECPREF_CREATE_DIRECTORY | XSL_SECPREF_WRITE_FILE); + } + } + $processor->importStyleSheet($xsl); // attach the xsl rules + + if (is_dir($outFileOrDir)) { + if (!$processor->setParameter('', 'base.dir', realpath($outFileOrDir))) { + echo "setting param base.dir KO\n"; + } + } + + $out = $processor->transformToXML($xml); + + if (!is_dir($outFileOrDir)) { + file_put_contents($outFileOrDir, $out); + } + } + + public static function highlightPhpInHtml($content) + { + $startTag = '
';
+        $endTag = '
'; + + //$content = file_get_contents($inFile); + $last = 0; + $out = ''; + while (($start = strpos($content, $startTag, $last)) !== false) { + $end = strpos($content, $endTag, $start); + $code = substr($content, $start + strlen($startTag), $end - $start - strlen($startTag)); + if ($code[strlen($code) - 1] == "\n") { + $code = substr($code, 0, -1); + } + + $code = str_replace(array('>', '<'), array('>', '<'), $code); + $code = highlight_string('<?php 
', '', $code); + + $out = $out . substr($content, $last, $start + strlen($startTag) - $last) . $code . $endTag; + $last = $end + strlen($endTag); + } + $out .= substr($content, $last, strlen($content)); + + return $out; + } +} + +} + +namespace { + +use PhpXmlRpc\Builder; + +function run_default($task=null, $args=array(), $cliOpts=array()) +{ + echo "Syntax: pake {\$pake-options} \$task \$lib-version [\$git-tag] {\$task-options}\n"; + echo "\n"; + echo " Run 'pake help' to list all pake options\n"; + echo " Run 'pake -T' to list available tasks\n"; + echo " Run 'pake -P' to list all available tasks (including hidden ones) and their dependencies\n"; + echo "\n"; + echo " Task options:\n"; + echo " --repo=REPO URL of the source repository to clone. Defaults to the github repo.\n"; + echo " --branch=BRANCH The git branch to build from.\n"; + echo " --asciidoctor=ASCIIDOCTOR Location of the asciidoctor command-line tool\n"; + echo " --fop=FOP Location of the apache fop command-line tool\n"; + echo " --php=PHP Location of the php command-line interpreter\n"; + echo " --zip=ZIP Location of the zip tool\n"; +} + +function run_getopts($task=null, $args=array(), $cliOpts=array()) +{ + Builder::getOpts($args, $cliOpts); +} + +/** + * Downloads source code in the build workspace directory, optionally checking out the given branch/tag + */ +function run_init($task=null, $args=array(), $cliOpts=array()) +{ + // download the current version into the workspace + $targetDir = Builder::workspaceDir(); + + // check if workspace exists and is not already set to the correct repo + if (is_dir($targetDir) && pakeGit::isRepository($targetDir)) { + $repo = new pakeGit($targetDir); + $remotes = $repo->remotes(); + if (trim($remotes['origin']['fetch']) != Builder::option('repo')) { + throw new Exception("Directory '$targetDir' exists and is not linked to correct git repo"); + } + + /// @todo should we not just fetch instead? + $repo->pull(); + } else { + pake_mkdirs(dirname($targetDir)); + $repo = pakeGit::clone_repository(Builder::option('repo'), Builder::workspaceDir()); + } + + $repo->checkout(Builder::option('branch')); +} + +/** + * Runs all the build steps. + * + * (does nothing by itself, as all the steps are managed via task dependencies) + */ +function run_build($task=null, $args=array(), $cliOpts=array()) +{ +} + +function run_clean_doc() +{ + pake_remove_dir(Builder::workspaceDir().'/doc/api'); + $finder = pakeFinder::type('file')->name('*.html'); + pake_remove($finder, Builder::workspaceDir().'/doc/manual'); + $finder = pakeFinder::type('file')->name('*.xml'); + pake_remove($finder, Builder::workspaceDir().'/doc/manual'); +} + +/** + * Generates documentation in all formats + */ +function run_doc($task=null, $args=array(), $cliOpts=array()) +{ + $docDir = Builder::workspaceDir().'/doc'; + + // API docs + + // from phpdoc comments using phpdocumentor + //$cmd = Builder::tool('php'); + //pake_sh("$cmd vendor/phpdocumentor/phpdocumentor/bin/phpdoc run -d ".Builder::workspaceDir().'/src'." -t ".Builder::workspaceDir().'/doc/api --title PHP-XMLRPC'); + + // from phpdoc comments using Sami + $samiConfig = <<files() + ->exclude('debugger') + ->exclude('demo') + ->exclude('doc') + ->exclude('tests') + ->in('./build/workspace'); + return new Sami\Sami(\$iterator, array( + 'title' => 'PHP-XMLRPC', + 'build_dir' => 'build/workspace/doc/api', + 'cache_dir' => 'build/cache', + )); +EOT; + file_put_contents('build/sami_config.php', $samiConfig); + $cmd = Builder::tool('php'); + pake_sh("$cmd vendor/sami/sami/sami.php update -vvv build/sami_config.php"); + + // User Manual + + // html (single file) from asciidoc + $cmd = Builder::tool('asciidoctor'); + pake_sh("$cmd -d book $docDir/manual/phpxmlrpc_manual.adoc"); + + // then docbook from asciidoc + /// @todo create phpxmlrpc_manual.xml with the good version number + /// @todo create phpxmlrpc_manual.xml with the date set to the one of last commit (or today?) + pake_sh("$cmd -d book -b docbook $docDir/manual/phpxmlrpc_manual.adoc"); + + # Other tools for docbook... + # + # jade cmd yet to be rebuilt, starting from xml file and putting output in ./out dir, e.g. + # jade -t xml -d custom.dsl xmlrpc_php.xml + # + # convertdoc command for xmlmind xxe editor + # convertdoc docb.toHTML xmlrpc_php.xml -u out + # + # saxon + xerces xml parser + saxon extensions + xslthl: adds a little syntax highligting + # (bold and italics only, no color) for php source examples... + # java \ + # -classpath c:\programmi\saxon\saxon.jar\;c:\programmi\saxon\xslthl.jar\;c:\programmi\xerces\xercesImpl.jar\;C:\htdocs\xmlrpc_cvs\docbook-xsl\extensions\saxon65.jar \ + # -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl \ + # -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl \ + # -Dxslthl.config=file:///c:/htdocs/xmlrpc_cvs/docbook-xsl/highlighting/xslthl-config.xml \ + # com.icl.saxon.StyleSheet -o xmlrpc_php.fo.xml xmlrpc_php.xml custom.fo.xsl use.extensions=1 + + // HTML (multiple files) from docbook - discontinued, as we use the nicer-looking html gotten from asciidoc + /*Builder::applyXslt($docDir.'/manual/phpxmlrpc_manual.xml', $docDir.'/build/custom.xsl', $docDir.'/manual'); + // post process html files to highlight php code samples + foreach(pakeFinder::type('file')->name('*.html')->in($docDir.'/manual') as $file) + { + file_put_contents($file, Builder::highlightPhpInHtml(file_get_contents($file))); + }*/ + + // PDF file from docbook + + // convert to fo and then to pdf using apache fop + Builder::applyXslt($docDir.'/manual/phpxmlrpc_manual.xml', $docDir.'/build/custom.fo.xsl', $docDir.'/manual/phpxmlrpc_manual.fo.xml'); + $cmd = Builder::tool('fop'); + pake_sh("$cmd $docDir/manual/phpxmlrpc_manual.fo.xml $docDir/manual/phpxmlrpc_manual.pdf"); + + // cleanup + unlink($docDir.'/manual/phpxmlrpc_manual.xml'); + unlink($docDir.'/manual/phpxmlrpc_manual.fo.xml'); +} + +function run_clean_dist() +{ + pake_remove_dir(Builder::distDir()); + $finder = pakeFinder::type('file')->name(Builder::distFiles()); + pake_remove($finder, Builder::buildDir()); +} + +/** + * Creates the tarballs for a release + */ +function run_dist($task=null, $args=array(), $cliOpts=array()) +{ + // copy workspace dir into dist dir, without git + pake_mkdirs(Builder::distDir()); + $finder = pakeFinder::type('any')->ignore_version_control(); + pake_mirror($finder, realpath(Builder::workspaceDir()), realpath(Builder::distDir())); + + // remove unwanted files from dist dir + + // also: do we still need to run dos2unix? + + // create tarballs + $cwd = getcwd(); + chdir(dirname(Builder::distDir())); + foreach(Builder::distFiles() as $distFile) { + // php can not really create good zip files via phar: they are not compressed! + if (substr($distFile, -4) == '.zip') { + $cmd = Builder::tool('zip'); + $extra = '-9 -r'; + pake_sh("$cmd $distFile $extra ".basename(Builder::distDir())); + } + else { + $finder = pakeFinder::type('any')->pattern(basename(Builder::distDir()).'/**'); + // see https://bugs.php.net/bug.php?id=58852 + $pharFile = str_replace(Builder::libVersion(), '_LIBVERSION_', $distFile); + pakeArchive::createArchive($finder, '.', $pharFile); + rename($pharFile, $distFile); + } + } + chdir($cwd); +} + +function run_clean_workspace($task=null, $args=array(), $cliOpts=array()) +{ + pake_remove_dir(Builder::workspaceDir()); +} + +/** + * Cleans up the whole build directory + * @todo 'make clean' usually just removes the results of the build, distclean removes all but sources + */ +function run_clean($task=null, $args=array(), $cliOpts=array()) +{ + pake_remove_dir(Builder::buildDir()); +} + +// helper task: display help text +pake_task( 'default' ); +// internal task: parse cli options +pake_task('getopts'); +pake_task('init', 'getopts'); +pake_task('doc', 'getopts', 'init', 'clean-doc'); +pake_task('build', 'getopts', 'init', 'doc'); +pake_task('dist', 'getopts', 'init', 'build', 'clean-dist'); +pake_task('clean-doc', 'getopts'); +pake_task('clean-dist', 'getopts'); +pake_task('clean-workspace', 'getopts'); +pake_task('clean', 'getopts'); + +}