<!-- 
   ====================================================================
   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/>.
 -->
<assembly>
    <id>src</id>
    <formats>
        <format>tar.gz</format>
        <format>zip</format>
    </formats>
    <fileSets>
        <!-- Release materials -->
        <fileSet>
          <directory></directory>
          <outputDirectory></outputDirectory>
          <excludes>
            <exclude>**/.*</exclude>
            <exclude>**/.*/**</exclude>
            <exclude>lib/</exclude>
            <exclude>connectors/*/lib/</exclude>
            <exclude>framework/lib/</exclude>
            <exclude>**/lib-proprietary/**</exclude>
            <exclude>**/build/</exclude>
            <exclude>**/tmp/</exclude>
            <exclude>site/fonts/</exclude>
            <exclude>dist/</exclude>
            <exclude>connectors/*/dist/</exclude>
            <exclude>framework/dist/</exclude>
            <exclude>**/target/</exclude>
            <exclude>**/test-output/</exclude>
            <exclude>**/test-HSQLDB-output/</exclude>
            <exclude>**/test-HSQLDBext-output/</exclude>
            <exclude>**/test-postgresql-output/</exclude>
            <exclude>**/test-mysql-output/</exclude>
            <exclude>**/test-materials/*.jar</exclude>
            <exclude>**/test-materials/*.war</exclude>
            <exclude>**/test-materials/*.wsdl</exclude>
            <exclude>**/test-materials/*.xsd</exclude>
            <exclude>**/test-materials-proprietary/*.jar</exclude>
            <exclude>**/test-materials-proprietary/*.war</exclude>
            <exclude>**/test-materials-proprietary/*.wsdl</exclude>
            <exclude>**/test-materials-proprietary/*.xsd</exclude>
            <exclude>**/lib-proprietary/*.jar</exclude>
            <exclude>**/lib-proprietary/*.war</exclude>
            <exclude>**/lib-proprietary/*.wsdl</exclude>
            <exclude>**/lib-proprietary/*.xsd</exclude>
            <exclude>connectors/elasticsearch/test-materials-proprietary/elasticsearch-1.0.1/</exclude>
            <exclude>legacy-*/</exclude>
            <exclude>apache-manifoldcf-*/</exclude>
          </excludes>
        </fileSet>
    </fileSets>
</assembly>
