<?xml version="1.0" encoding="UTF-8"?>
<!--

    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>jclouds-cli</id>

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

    <fileSets>
        <!-- Strip the Karaf distribution -->
        <fileSet>
            <directory>target/dependencies/unix/apache-karaf-${karaf.version}</directory>
            <outputDirectory>/</outputDirectory>
            <excludes>
                <exclude>**/demos/**</exclude>
                <exclude>lib/karaf-version.jar</exclude>
                <exclude>bin/**</exclude>
                <exclude>etc/org.apache.karaf.features.cfg</exclude>
                <exclude>etc/org.apache.karaf.features.repos.cfg</exclude>
                <exclude>etc/users.properties</exclude>
                <exclude>etc/custom.properties</exclude>
                <exclude>etc/startup.properties</exclude>
                <exclude>etc/shell.init.script</exclude>
                <exclude>etc/org.apache.karaf.management.cfg</exclude>
                <exclude>etc/org.apache.karaf.shell.cfg</exclude>
                <exclude>etc/org.apache.karaf.jaas.cfg</exclude>
                <exclude>readme.txt</exclude>
                <exclude>LICENSE</exclude>
                <exclude>NOTICE</exclude>
                <exclude>README</exclude>
                <exclude>RELEASE-NOTES</exclude>
                <exclude>karaf-manual*</exclude>
                <!-- further exclude bundles -->
                <exclude>system/org/apache/karaf/diagnostic/**</exclude>
                <exclude>system/org/apache/karaf/management/**</exclude>
                <exclude>system/org/apache/aries/jmx/**</exclude>
                <exclude>system/org/eclipse/**</exclude>
            </excludes>
        </fileSet>

        <!-- Copy over bin/* scripts separately to get the correct file mode -->
        <fileSet>
            <directory>target/dependencies/unix/apache-karaf-${karaf.version}</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>bin/*</include>
            </includes>
            <excludes>
                <exclude>bin/shell</exclude>
                <exclude>bin/karaf</exclude>
                <exclude>bin/start</exclude>
                <exclude>bin/stop</exclude>
                <exclude>bin/admin</exclude>
            </excludes>
            <fileMode>0755</fileMode>
        </fileSet>


        <!-- Copy over license and the like -->
        <fileSet>
            <directory>target/classes/META-INF</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>DEPENDENCIES</include>
                <include>LICENSE</include>
                <include>NOTICE</include>
            </includes>
            <lineEnding>unix</lineEnding>
            <fileMode>0644</fileMode>
        </fileSet>

        <!-- Copy over resources -->
        <fileSet>
            <directory>target/classes/etc</directory>
            <outputDirectory>/etc/</outputDirectory>
            <includes>
                <include>*.*</include>
            </includes>
            <lineEnding>unix</lineEnding>
            <fileMode>0644</fileMode>
        </fileSet>

        <!-- Copy over resources -->
        <fileSet>
            <directory>target/classes/unix/bin</directory>
            <outputDirectory>/bin/</outputDirectory>
            <includes>
                <include>**</include>
            </includes>
            <lineEnding>unix</lineEnding>
            <fileMode>0755</fileMode>
        </fileSet>

        <!-- Add jclouds features to system repository -->
        <fileSet>
            <outputDirectory>system</outputDirectory>
            <directory>target/features-repo</directory>
        </fileSet>
    </fileSets>

    <files>
        <file>
            <source>${basedir}/target/dependencies/unix/apache-karaf-${karaf.version}/bin/karaf</source>
            <outputDirectory>/bin/</outputDirectory>
            <destName>jclouds-cli</destName>
            <fileMode>0755</fileMode>
            <lineEnding>unix</lineEnding>
        </file>
        <file>
            <source>${basedir}/../DISCLAIMER</source>
            <outputDirectory>/</outputDirectory>
            <destName>DISCLAIMER</destName>
            <lineEnding>dos</lineEnding>
            <fileMode>0644</fileMode>
        </file>
    </files>

    <dependencySets>
        <dependencySet>
            <outputDirectory>/lib</outputDirectory>
            <outputFileNameMapping>jclouds-version.jar</outputFileNameMapping>
            <fileMode>0644</fileMode>
            <includes>
                <include>org.apache.jclouds.cli:branding</include>
            </includes>
            <useTransitiveDependencies>false</useTransitiveDependencies>
        </dependencySet>
        <dependencySet>
            <outputDirectory>/system/org/apache/jclouds/cli/runner/${project.version}/</outputDirectory>
            <fileMode>0644</fileMode>
            <includes>
                <include>org.apache.jclouds.cli:runner</include>
            </includes>
        </dependencySet>
        <dependencySet>
            <outputDirectory>lib/other/</outputDirectory>
            <fileMode>0644</fileMode>
            <includes>
                <include>org.slf4j:slf4j-api</include>
                <include>org.slf4j:slf4j-log4j12</include>
                <include>log4j:log4j</include>
            </includes>
        </dependencySet>
    </dependencySets>

</assembly>
