<?xml version="1.0" encoding="UTF-8"?>
<!--
  PRADO 3.0 build file - Copyright (C) 2006 PradoSoft

  Requirements
  ============
  Phing >= 2.2.0RC1
  xdebug >= 2.0.0beta4
  PhpDocumentor >= 1.3.0RC5
  PEAR >= 1.4.4
-->
<project name="prado" basedir="." default="dist">

  <property name="version" value="3.0.0"/>
  <property name="state" value=""/>
  <property name="pear.state" value="stable"/>
  <property name="pkgname" value="${phing.project.name}-${version}${state}"/>
  <property name="pkgname.pear" value="${pkgname}-pear"/>
  <property name="src.dir" value="framework"/>
  <property name="doc.dir" value="docs"/>
  <property name="build.base.dir" value="build"/>
  <property name="build.src.dir" value="${build.base.dir}/standard/${pkgname}"/>
  <property name="build.pear.dir" value="${build.base.dir}/pear"/>
  <property name="doc.build.dir" value="${build.base.dir}/docs/manual"/>
  <property name="dist.base.dir" value="dist"/>
  <property name="dist.zipfile" value="${dist.base.dir}/${pkgname}.zip"/>
  <property name="dist.tarfile" value="${dist.base.dir}/${pkgname}.tar.gz"/>
  <property name="dist.pearfile" value="${dist.base.dir}/${pkgname.pear}.tgz"/>
  <property name="tests.dir" value="tests/unit"/>
  <property name="reports.dir" value="${build.base.dir}/reports"/>
  <property name="reports.unit.dir" value="${reports.dir}/unit"/>
  <property name="reports.codecoverage.dir" value="${reports.dir}/codecoverage"/>
  <property name="reports.style.dir" value="buildscripts/phing/style"/>
  <property name="reports.geshi.dir" value="${src.dir}/3rdParty/geshi"/>
  <property name="prado.lite" value="pradolite.php"/>
  <property name="application.xsd" value="${doc.dir}/specs/application.xsd"/>
  <property name="config.xsd" value="${doc.dir}/specs/config.xsd"/>
  <property name="codecoverage" value="false"/>
  <property name="zca" value="/usr/local/Zend/ZendStudioClient-5.1.0/bin/ZendCodeAnalyzer"/>
  <property name="quickstart" value="${build.base.dir}/docs/prado3_quick_start.pdf"/>
  <property name="notes">This is the latest release of PRADO.</property>

  <taskdef name="phplint" classname="PhpLintTask" classpath="buildscripts/phing/tasks"/>
  <taskdef name="xmllint" classname="XmlLintTask" classpath="buildscripts/phing/tasks"/>
  <taskdef name="analyze" classname="ZendCodeAnalyzerTask" classpath="buildscripts/phing/tasks"/>
  <taskdef name="pear-package" classname="BuildPradoPEARPackageTask" classpath="buildscripts/phing/tasks"/>

  <!--
      PHP Source Files in framework
  -->
  <fileset dir="." id="src">
    <exclude name="${src.dir}/**/.svn"/>
    <include name="${src.dir}/**/*.php"/>
  </fileset>

  <!--
      All Source Files in framework
  -->
  <fileset dir="." id="framework">
    <exclude name="${src.dir}/**/.svn"/>
    <exclude name="${src.dir}/**/*.bak"/>
    <exclude name="${src.dir}/**/*~"/>
    <include name="${src.dir}/**/*"/>
  </fileset>

  <!--
      Surrounding files
  -->
  <fileset dir="." id="misc">
    <include name="COPYRIGHT"/>
    <include name="HISTORY"/>
    <include name="UPGRADE"/>
    <include name="index.html"/>
    <exclude name="requirements/.svn"/>
    <include name="requirements/*"/>
  </fileset>

  <!--
      Documentation
  -->
  <fileset dir="." id="docs">
    <exclude name="${doc.dir}/**/.svn"/>
    <include name="${doc.dir}/**/*"/>
  </fileset>

  <!--
      Demos
  -->
  <fileset dir="." id="demos">
    <exclude name="demos/**/.svn"/>
    <include name="demos/**/*"/>
  </fileset>

  <target name="versioncheck" unless="version">
    <echo message="====================================================="/>
    <echo message="Version not specified. You must enter a version. In"/>
    <echo message="the future you can add this to build.properties or"/>
    <echo message="enter it on the command line: "/>
    <echo message=" "/>
    <echo message="-Dversion=3.0.0"/>
    <echo message="====================================================="/>	
    <input propertyname="version" promptChar=":">PRADO version for package</input>

    <property name="pkgname" value="${phing.project.name}-${version}" override="true"/>
    <property name="build.src.dir" value="${build.base.dir}/${pkgname}" override="true"/>
    <property name="dist.zipfile" value="${build.base.dir}/${pkgname}.zip" override="true"/>
    <property name="dist.tarfile" value="${build.base.dir}/${pkgname}.tar.gz" override="true"/>
    <property name="dist.pearfile" value="${build.base.dir}/${pkgname}-pear.tgz" override="true"/>
  </target>

  <target name="lint" description="Check syntax of PHP source files">
    <phplint>
      <fileset refid="src"/>
    </phplint>
  </target>

  <target name="lint-demos" description="Check syntax of demo files and configuration files">
    <echo>Validate application configuration</echo>
    <xmllint schema="${application.xsd}">
      <fileset dir="demos">
        <exclude name="**/.svn"/>
        <include name="**/application.xml"/>
      </fileset>
    </xmllint>
    <echo>Validate page configuration</echo>
    <xmllint schema="${config.xsd}">
      <fileset dir="demos">
        <exclude name="**/.svn"/>
        <include name="**/config.xml"/>
      </fileset>
    </xmllint>
    <phplint>
      <fileset dir="demos">
        <exclude name="**/.svn"/>
        <include name="**/*.php"/>
      </fileset>
    </phplint>
  </target>

  <target name="doc" description="Generate API documentation">
    <delete dir="${doc.build.dir}"/>
    <mkdir dir="${doc.build.dir}"/>
    <phpdoc title="PRADO ${version}${state} API Documentation" destdir="${doc.build.dir}" sourcepath="${src.dir}" output="HTML:Smarty:PHP"/>
  </target>

  <target name="quickstart" description="Generate Quickstart PDF">
    <delete file="${quickstart}"/>
    <exec command="php build.php" dir="buildscripts/texbuilder" passthru="true"/>
    <exec command="pdflatex prado3_quick_start.tex" dir="buildscripts/texbuilder" passthru="true"/>
    <move file="buildscripts/texbuilder/prado3_quick_start.pdf" tofile="${quickstart}"/>
  </target>

  <target name="test" description="Run unit tests">
    <echo>Preparing directory structure</echo>
    <delete dir="${reports.dir}"/>
    <mkdir dir="${reports.dir}"/>
    <delete dir="${reports.unit.dir}"/>
    <delete dir="${reports.codecoverage.dir}"/>
    <mkdir dir="${reports.unit.dir}"/>

    <if>
      <equals arg1="${codecoverage}" arg2="true"/>
      <then>
	<mkdir dir="${reports.codecoverage.dir}"/>
	<echo>Preparing Code Coverage Database</echo>
	<coverage-setup database="${reports.codecoverage.dir}/coverage.db">
	  <fileset dir="${src.dir}">
	    <include name="**/*.php"/>
	    <exclude name="Web/Javascripts/js/clientscripts.php"/>
	    <exclude name="Data/TCache.php"/>
	    <exclude name="DataAccess/**/*.php"/>
	    <exclude name="I18N/core/Gettext/MO.php"/>
	    <exclude name="I18N/core/Gettext/PO.php"/>
	    <exclude name="I18N/core/util.php"/>
	    <exclude name="I18N/TGlobalization.php"/>
	    <exclude name="I18N/TGlobalizationAutoDetect.php"/>
	    <exclude name="Security/TUserManager.php"/>
	    <exclude name="Security/TMembershipManager.php"/>
	    <exclude name="core.php"/>
	    <exclude name="3rdParty/**/*.php"/>
	    <exclude name="pradolite.php"/>
	    <exclude name="prado.php"/>
	  </fileset>
	</coverage-setup>
      </then>
    </if>

    <echo>Running Unit Tests</echo>
    <phpunit2 codecoverage="${codecoverage}" haltonfailure="false" haltonerror="false" printsummary="true">
      <batchtest>
        <fileset dir="${tests.dir}">
	  <include name="**/*Test.php"/>
        </fileset>
      </batchtest>
      <formatter type="xml" todir="${reports.dir}" outfile="logfile.xml"/>
    </phpunit2>

    <echo>Creating Unit Test Report</echo>
    <phpunit2report infile="${reports.dir}/logfile.xml" format="frames" styledir="${reports.style.dir}" todir="${reports.unit.dir}"/>

    <if>
      <equals arg1="${codecoverage}" arg2="true"/>
      <then>
	<echo>Creating Code Coverage Report</echo>
	<coverage-report outfile="${reports.dir}/coverage.xml" geshipath="${reports.geshi.dir}" geshilanguagespath="${reports.geshi.dir}/geshi">
	  <report todir="${reports.codecoverage.dir}" styledir="${reports.style.dir}"/>
	</coverage-report>
      </then>
    </if>
  </target>
  
  <target name="build-standard-package">
    <echo>Building standard package...</echo>
    <copy todir="${build.src.dir}">
      <fileset refid="framework"/>
      <fileset refid="docs"/>
      <fileset refid="misc"/>
      <fileset refid="demos"/>
      <fileset dir="${build.base.dir}">
        <include name="docs/**/*"/>
	<include name="${prado.lite}"/>
      </fileset>
    </copy>
  </target>

  <target name="build-pear-package">
    <echo>Preparing files for PEAR package...</echo>
    <delete dir="${build.pear.dir}"/>
    <mkdir dir="${build.pear.dir}"/>
    <copy todir="${build.pear.dir}">
      <fileset refid="framework"/>
      <fileset dir="${build.base.dir}">
	<include name="${prado.lite}"/>
      </fileset>
    </copy>
    
    <echo>Creating package.xml...</echo>
    <pear-package dir="${build.pear.dir}" destFile="${build.base.dir}/pear/package.xml" version="${version}" state="${pear.state}" notes="${notes}">
      <fileset refid="framework"/>
      <fileset dir="${build.base.dir}">
	<include name="${prado.lite}"/>
      </fileset>
    </pear-package>
  </target>
  
  <target name="build" depends="versioncheck,doc,quickstart,pradolite,build-standard-package" description="Creating the main PRADO build"/>

  <target name="dist-pear" depends="build-pear-package" description="Create PRADO PEAR package">
    <delete file="${dist.pearfile}"/>
    <mkdir dir="${dist.base.dir}"/>
    <!--<tar compression="gzip" destFile="${dist.pearfile}" basedir="${build.pear.dir}"/>-->
    <exec command="pear package" dir="${build.pear.dir}" passthru="true"/>
    <!--<exec command="pear package-validate prado3-${version}.tgz" dir="${build.pear.dir}" passthru="true"/>-->
    <move file="${build.pear.dir}/prado3-${version}.tgz" tofile="${dist.pearfile}"/>
  </target>

  <target name="dist" depends="build" description="Create PRADO distributions">
    <!--<tar compression="gzip" destFile="${dist.tarfile}" basedir="${build.base.dir}/standard"/>-->
    <exec command="tar czvf ${pkgname}.tar.gz ${pkgname}" dir="${build.base.dir}/standard"/>
    <move file="${build.base.dir}/standard/${pkgname}.tar.gz" tofile="${dist.tarfile}"/>
    <!--<zip destfile="${dist.zipfile}" basedir="${build.base.dir}/standard"/>-->
    <exec command="zip ${pkgname}.zip -r ${pkgname}/*" dir="${build.base.dir}/standard"/>
    <move file="${build.base.dir}/standard/${pkgname}.zip" tofile="${dist.zipfile}"/>
  </target>

  <target name="all" depends="lint,lint-demos,test,build,dist" description="Run all targets"/>

  <target name="clean">
    <echo>Cleaning up the mess</echo>
    <delete dir="${build.base.dir}"/>
    <delete dir="${dist.base.dir}"/>
  </target>

  <target name="pradolite">
    <echo>Compiling PRADO Lite</echo>
    <delete file="${src.dir}/${prado.lite}"/>
    <exec command="php build.php" dir="buildscripts/phpbuilder" passthru="true"/>
    <phplint file="${src.dir}/${prado.lite}"/>
  </target>
  
  <target name="analyze" description="Analyze PHP source files with Zend Code Analyzer">
    <analyze analyzerPath="${zca}" disable="var-ref-notmodified,var-use-before-def,var-arg-unused,if-if-else">
      <fileset refid="src"/>
    </analyze>
  </target>

  <target name="install" description="Install PEAR package locally">
    <exec command="sudo pear install ${dist.pearfile}" dir="." passthru="true"/>
  </target>
  
  <target name="uninstall" description="Uninstall PEAR package locally">
    <exec command="sudo pear uninstall pear.pradosoft.com/prado3" dir="." passthru="true"/>   
  </target>

</project>
