<!--
 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>dist</id>

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

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

  <moduleSets>

    <moduleSet>
      <useAllReactorProjects>true</useAllReactorProjects>

      <includes>
        <include>com.cloudera.cdh:sentry-binding</include>
        <include>com.cloudera.cdh:sentry-binding-hive</include>
        <include>com.cloudera.cdh:sentry-core</include>
        <include>com.cloudera.cdh:sentry-provider</include>
        <include>com.cloudera.cdh:sentry-provider-file</include>
        <include>com.cloudera.cdh:sentry-tests</include>
        <include>com.cloudera.cdh:sentry-dist</include>
      </includes>

      <binaries>
        <unpack>false</unpack>
        <outputDirectory>lib</outputDirectory>

        <dependencySets>
          <dependencySet>
            <useProjectArtifact>false</useProjectArtifact>
            <outputDirectory>lib</outputDirectory>
          </dependencySet>
        </dependencySets>
      </binaries>

      <sources>
        <includeModuleDirectory>true</includeModuleDirectory>
        <excludeSubModuleDirectories>false</excludeSubModuleDirectories>

        <fileSets>
          <fileSet>
            <excludes>
              <exclude>target/**</exclude>
              <exclude>*/target/**</exclude>
              <exclude>.classpath</exclude>
              <exclude>*/.classpath</exclude>
              <exclude>.project</exclude>
              <exclude>*/.project</exclude>
              <exclude>.settings/**</exclude>
              <exclude>*/.settings/**</exclude>
            </excludes>
          </fileSet>
        </fileSets>
      </sources>

    </moduleSet>

  </moduleSets>
  <fileSets>
    <fileSet>
      <directory>../</directory>

      <excludes>
        <exclude>sentry-binding/**</exclude>
        <exclude>sentry-core/**</exclude>
        <exclude>sentry-dist/**</exclude>
        <exclude>sentry-provider/**</exclude>
        <exclude>sentry-test/**</exclude>
        <exclude>**/target/**</exclude>
        <exclude>**/.classpath</exclude>
        <exclude>**/.project</exclude>
        <exclude>**/.settings/**</exclude>
        <exclude>lib/**</exclude>
      </excludes>

      <includes>
        <include>.gitignore</include>
        <include>bin/**</include>
        <include>conf/**</include>
        <include>pom.xml</include>
        <include>LICENSE.txt</include>
        <include>NOTICE</include>
      </includes>
    </fileSet>
  </fileSets>

</assembly>

