<?xml version="1.0" encoding="UTF-8"?>
<project name="collapsing-category-list" default="full-build">
  <property name="pdepend" value="pdepend" />
  <property name="phpcpd" value="phpcpd" />
  <property name="phpcs"  value="phpcs" />
  <property name="phpdox" value="phpdox" />
  <property name="phploc" value="phploc" />
  <property name="phpmd" value="phpmd" />
  <property name="phpunit"  value="phpunit" />
  
  <target name="full-build" depends="prepare,static-analysis,phpunit,phpdox,-check-failure" description="Performs static analysis, runs the tests, and generates project documentation" />
  <target name="full-build-parallel" depends="prepare,static-analysis-parallel,phpunit,phpdox,-check-failure" description="Performs static analysis (executing the tools in parallel), runs the tests, and generates project documentation" />
  <target name="quick-build" depends="prepare,lint,phpunit-no-coverage" description="Performs a lint check and runs the tests (without generating code coverage report)" />
  <target name="static-analysis" depends="lint,phploc-ci,pdepend,phpmd-ci,phpcs-ci,phpcpd-ci" description="Performs static analysis" />
  
  <target name="static-analysis-parallel" description="Performs static analysis (executing the tools in parallel)">
    <parallel threadCount="2">
      <sequential>
        <antcall target="pdepend" />
        <antcall target="phpmd-ci" />
      </sequential>
      <antcall target="lint" />
      <antcall target="phpcpd-ci" />
      <antcall target="phpcs-ci" />
      <antcall target="phploc-ci" />
    </parallel>
  </target>
  
  <target name="clean" unless="clean.done" description="Cleanup build artifacts">
    <delete dir="${basedir}/build/api" />
    <delete dir="${basedir}/build/coverage" />
    <delete dir="${basedir}/build/logs" />
    <delete dir="${basedir}/build/pdepend" />
    <delete dir="${basedir}/build/phpdox" />
    <property name="clean.done" value="true" />
  </target>
  
  <target name="prepare" unless="prepare.done" depends="clean" description="Prepare for build">
    <mkdir dir="${basedir}/build/api" />
    <mkdir dir="${basedir}/build/coverage" />
    <mkdir dir="${basedir}/build/logs" />
    <mkdir dir="${basedir}/build/pdpend" />
    <mkdir dir="${basedir}/build/phpdox" />
    <property name="prepare.done" value="true" />
  </target>
  
  <target name="lint" unless="lint.done" description="Perform syntax check of sourcecode files">
    <apply executable="php" taskname="lint">
      <arg value="-l" />
      
      <fileset dir="${builddir}">
        <include name="**/*.php" />
        <modified />
      </fileset>
    </apply>
    
    <property name="lint.done" value="true" />
  </target>
  
  <target name="phploc-ci" unless="phploc.done" description="Measure project size using PHPLOC and log result in CSV and XML format. Intended for usage within a continuous integration environment.">
    <exec executable="${phploc}" taskname="phploc">
      <arg value="--count-tests" />
      <arg value="--log-csv" />
      <arg path="${basedir}/build/logs/phploc.csv" />
      <arg value="--log-xml" />
      <arg path="${basedir}/build/logs/phploc.xml" />
      <arg path="${builddir}" />
    </exec>
    
    <property name="phploc.done" value="true" />
  </target>
  
  <target name="pdepend" unless="pdepend.done" depends="prepare" description="Calculate software metrics using PHP_Depend and log result in XML format. Intended for usage within a continuous integration environment.">
    <exec executable="${pdepend}" taskname="pdepend">
      <arg value="--jdepend-xml=${basedir}/build/logs/jdepend.xml" />
      <arg value="--jddepend-chart=${basedir}/build/pdepend/dependencies.svg" />
      <arg value="--overview-pyramid=${basedir}/build/pdepend/overview-pyramid.svg" />
      <arg path="${builddir}" />
    </exec>
    
    <property name="pdepend.done" value="true" />
  </target>
  
  <target name="phpmd-ci" unless="phpmd.done" depends="prepare" description="Perform project mess detection using PHPMD and log result in XML format. Intended for usage within a continuous integration environment.">
    <exec executable="${phpmd}" taskname="phpmd">
      <arg path="${builddir}" />
      <arg value="xml" />
      <arg value="cleancode,codesize,controversial,design,naming,unusedcode" />
      <arg value="--reportfile" />
      <arg path="${basedir}/build/logs/pmd.xml" />
    </exec>
    
    <property name="phpmd.done" value="true" />
  </target>
  
  <target name="phpcs-ci" unless="phpcs.done" depends="prepare" description="Find coding standard violations using PHP_CodeSniffer and log result in XML format. Intended for usage within a continuous integration environment.">
    <exec executable="${phpcs}" output="/dev/null" taskname="phpcs">
      <arg value="--report=checkstyle" />
      <arg value="--report-file=${basedir}/build/logs/checkstyle.xml" />
      <arg value="--standard=Wordpress" />
      <arg value="--extensions=php" />
      <arg path="${builddir}" />
    </exec>
    
    <property name="phpcs.done" value="true" />
  </target>
  
  <target name="phpcpd-ci" unless="phpcpd.done" depends="prepare" description="Find duplicate code using PHPCPD and log result in XML format. Intended for usage within a continuous integration environment.">
    <exec executable="${phpcpd}" taskname="phpcpd">
      <arg value="--log-pmd" />
      <arg path="${basedir}/build/logs/pmd-cpd.xml" />
      <arg path="${builddir}" />
    </exec>
    
    <property name="phpcpd.done" value="true" />
  </target>
  
  <target name="phpunit" unless="phpunit.done" depends="prepare" description="Run unit tests with PHPUnit">
    <exec executable="${phpunit}" resultproperty="result.phpunit" taskname="phpunit">
      <arg value="--configuration" />
      <arg path="${basedir}/build/phpunit.xml" />
      <arg path="${builddir}/test" />
    </exec>
    
    <property name="phpunit.done" value="true" />
  </target>
  
  <target name="phpunit-no-coverage" unless="phpunit.done" depends="prepare" description="Run unit tests with PHPUnit (without generating code coverage reports)">
    <exec executable="${phpunit}" failonerror="true" taskname="phpunit">
      <arg value="--configuration" />
      <arg path="${basedir}/build/phpunit.xml" />
      <arg value="--no-coverage" />
      <arg path="${builddir}/test" />
    </exec>
    
    <property name="phpunit.done" value="true" />
  </target>
  
  <target name="phpdox" unless="phpdox.done" depends="phploc-ci,phpcs-ci,phpmd-ci" description="Generate project documentation using phpDox">
    <exec executable="${phpdox}" dir="${basedir}/build" taskname="phpdox" />
    
    <property name="phpdox.done" value="true" />
  </target>
  
  <target name="-check-failure">
    <fail message="PHPUni did not finish successfully">
      <condition>
        <not>
          <equals arg1="${result.phpunit}" arg2="0" />
        </not>
      </condition>
    </fail>
  </target>
</project>
