<!--
  ~ 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/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
    <id>source-release</id>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>
    <baseDirectory>${project.build.finalName}-source-release</baseDirectory>

    <fileSets>
        <fileSet>
            <directory>../</directory>
            <useDefaultExcludes>true</useDefaultExcludes>
            <includes>
                <include>**/*</include>
            </includes>
            <excludes>
                <exclude>**/target/**</exclude>
                <exclude>**/eclipse-classes/**</exclude>
                <exclude>**/dubbo-governance.log*</exclude>
                <exclude>dubbo-admin-server/src/main/resources/public/**</exclude>
                <exclude>**/.gitrepo</exclude>
                <exclude>**/.gitkeep</exclude>
                <exclude>*.enc</exclude>
                <exclude>*.gpg</exclude>
                <exclude>**/node_modules/**</exclude>
                <exclude>**/node/**</exclude>
                <exclude>**/etc/**</exclude>
                <exclude>**/package-lock.json</exclude>
                <exclude>**/dist/**</exclude>
                <exclude>**/surefire*</exclude>
                <exclude>**/svn-commit*</exclude>
                <exclude>**/.idea/**</exclude>
                <exclude>**/*.iml</exclude>
                <exclude>**/.settings/**</exclude>
                <exclude>**/*.ipr</exclude>
                <exclude>**/*.iws</exclude>
                <exclude>**/cobertura.ser</exclude>
                <exclude>**/*.log</exclude>
                <exclude>release.properties</exclude>
                <exclude>**/*.xml.*</exclude>
                <exclude>**/*.patch</exclude>
                <exclude>**/.mvn/**</exclude>
                <exclude>**/*.jar</exclude>
                <exclude>**/mvnw*</exclude>
            </excludes>
        </fileSet>
    </fileSets>
</assembly>
