 <!--
   Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
  -->
<project xmlns:deploy="deploy" default="jar:jar" xmlns:ant="jelly:ant"> 

  <goal name="cut-math-release">
		<attainGoal name="convert-snapshots" />
		<attainGoal name="dist" />
  </goal>

  <preGoal name="dist:build-bin">  
    <attainGoal name="announcement:generate" />
    <copy todir="${maven.dist.bin.assembly.dir}">
      <fileset file='${basedir}/NOTICE.txt'/>
      <fileset file='${basedir}/RELEASE-NOTES.txt'/>
    </copy>
  </preGoal>
  
  <preGoal name="dist:build-src">
    <copy todir="${maven.dist.src.assembly.dir}">
      <fileset file='${basedir}/checkstyle.xml'/>
      <fileset file='${basedir}/license-header.txt'/>
      <fileset file='${basedir}/build.properties.sample'/>
      <fileset file='${basedir}/NOTICE.txt'/>
      <fileset file='${basedir}/RELEASE-NOTES.txt'/>
      <fileset file='${basedir}/release-notes.jsl'/>
    </copy>
    <delete dir="${maven.dist.src.assembly.dir}/src/experimental" />
    <delete dir="${maven.dist.src.assembly.dir}/src/mantissa" />
    <move todir="${maven.dist.src.assembly.dir}-src">
      <fileset dir="${maven.dist.src.assembly.dir}"/>
    </move>
  </preGoal>

<!-- Uncomment when ant plugin relative path bug is fixed (still present in 1.8)
  <preGoal name="dist">
  	<attainGoal name="ant" />
  </preGoal>
-->

 <!-- Limit maven resources included in site generation -->
  <postGoal name="xdoc:copy-resources">
    <copy todir="${maven.docs.dest}/images">
      <fileset file='${maven.docs.src}/../resources/images/**'/>
    </copy>
    <copy todir="${maven.docs.dest}/style">
      <fileset file='${maven.docs.src}/../resources/style/**'/>
    </copy>
    <copy todir="${maven.docs.dest}/userguide">
      <fileset file='${maven.docs.src}/../resources/userguide/**'/>
    </copy>
    <delete includeEmptyDirs="true">
      <fileset dir="${maven.docs.dest}" 
        includes="${maven.xdoc.copy.excludes},${maven.xdoc.copy.excludes.classic}"/>
    </delete>
  </postGoal>

</project>
