<!--
 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.
-->
<assembly>
    <id>src</id>
    <formats>
        <format>tar.gz</format>
        <format>zip</format>
    </formats>
    <baseDirectory>${artifactId}-${commons.release.version}-src</baseDirectory>
    <fileSets>
        <fileSet>
            <includes>
                <include>build.xml</include>
                <include>findbugs-exclude-filter.xml</include>                
                <include>LICENSE.txt</include>
                <include>NOTICE.txt</include>
                <include>pmd.xml</include>
                <include>pom.xml</include>
                <include>RELEASE-NOTES.txt</include>                
                <include>STATUS</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>src</directory>
            <excludes>
                <!-- relative to directory -->
                <exclude>test/scripts/*.sh</exclude>
            </excludes>
        </fileSet>
        <fileSet>
            <directory>src</directory>
            <!-- Ensure that shell scripts are executable -->
            <fileMode>775</fileMode>
            <includes>
                <!-- relative to directory -->
                <include>test/scripts/*.sh</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>
