<!--
 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
  xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">

  <id>src</id>

  <formats>
    <format>tar.gz</format>
  </formats>

  <baseDirectory>apache-sentry-${project.version}-src</baseDirectory>

  <fileSets>
    <fileSet>
      <directory>${project.parent.basedir}</directory>

      <excludes>
        <exclude>**/target/**</exclude>
        <exclude>**/.classpath</exclude>
        <exclude>**/.project</exclude>
        <exclude>**/.settings/**</exclude>
        <exclude>sentry-tests/sentry-tests-hive/thirdparty/**</exclude>
      </excludes>

      <includes>
        <include>bin/**</include>
        <include>**/.gitignore</include>
        <include>conf/**</include>
        <include>pom.xml</include>
        <include>CHANGELOG*</include>
        <include>DISCLAIMER*</include>
        <include>LICENSE*</include>
        <include>NOTICE*</include>
        <include>README*</include>
        <include>dev-support/**</include>
        <include>sentry-binding/**</include>
        <include>sentry-core/**</include>
        <include>sentry-dist/**</include>
        <include>sentry-provider/**</include>
        <include>sentry-policy/**</include>
        <include>sentry-tests/**</include>
        <include>sentry-hdfs/**</include>
        <include>sentry-solr/**</include>
      </includes>
      <outputDirectory>/</outputDirectory>
    </fileSet>
  </fileSets>

</assembly>
