<!-- 
   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.
   ====================================================================

   This software consists of voluntary contributions made by many
   individuals on behalf of the Apache Software Foundation.  For more
   information on the Apache Software Foundation, please see
   <http://www.apache.org />.
 -->
<project name="assembly-postprocess" default="fixarchives" basedir=".">

  <target name="fixarchives" depends="_eolcheck,fixzip,fixtgz">
  </target>

  <target name="fixzip" unless="native.crlf">
    <property name="tmp.dir" location="${target}/tmp"/>    
    <property name="zip.file" location="${target}/${package.name}.zip"/>    
    <delete dir="${tmp.dir}" />
    <unzip src="${zip.file}" dest="${tmp.dir}"/>
    <fixcrlf srcdir="${tmp.dir}" eol="crlf" eof="remove" fixlast="false"
        includes="**/*.txt, **/*.xml, **/*.properties, **/*.java, **/*.html, **/*.css, **/*.apt, **/*.py, **/*.svg, **/*.xsl" />
    <zip destfile="${zip.file}" basedir="${tmp.dir}" duplicate="preserve" />
    <delete dir="${tmp.dir}" />
  </target>  

  <target name="fixtgz" unless="native.lf">
    <property name="tmp.dir" location="${target}/tmp"/>    
    <property name="gz.file" location="${target}/${package.name}.tar.gz"/>    
    <property name="tar.file" location="${target}/${package.name}.tar"/>    
    <delete dir="${tmp.dir}" />
    <gunzip src="${gz.file}" dest="${tar.file}"/>
    <untar src="${tar.file}" dest="${tmp.dir}"/>
    <fixcrlf srcdir="${tmp.dir}" eol="lf" eof="remove" fixlast="false"
        includes="**/*.txt, **/*.xml, **/*.properties, **/*.java, **/*.html, **/*.css, **/*.apt, **/*.py, **/*.svg, **/*.xsl" />
    <tar destfile="${tar.file}" basedir="${tmp.dir}" longfile="gnu"/>
    <gzip src="${tar.file}" destfile="${gz.file}"/>
      <delete file="${tar.file}"/>
    <delete dir="${tmp.dir}"/>
  </target>  

  <!-- Determine if the native format is CRLF or LF (or neither) -->
  <target name="_eolcheck">
    <condition property="native.lf">
        <os family="unix"/>
    </condition>
    <condition property="native.crlf">
        <os family="dos"/>
    </condition>
  </target>
</project>
