#
# 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.
#
header:
  license:
    spdx-id: Apache-2.0
    copyright-owner: Apache Software Foundation

  paths-ignore:
    - '.github/ISSUE_TEMPLATE'
    - '.github/PULL_REQUEST_TEMPLATE'
    - '**/.gitignore'
    - '.gitmodules'
    - '.lift'
    - '.mvn'
    - 'apm-protocol/apm-network/src/main/proto/.gitignore'
    - 'codeStyle.xml'
    - 'docker/.env'
    - 'dist'
    - 'licenses'
    - 'dist-material/release-docs'
    - '**/*.md'
    - '**/*.json'
    - '**/*.ftl'
    - '**/target/**'
    - '**/*.iml'
    - '**/*.ini'
    - '**/*.crt'
    - '**/*.pem'
    - '**/*.txt'
    - 'LICENSE'
    - 'NOTICE'
    - 'skywalking-ui/dist'
    - 'skywalking-ui/node_modules'
    - 'skywalking-ui/node'
    - 'skywalking-ui/.browserslistrc'
    - 'skywalking-ui/.prettierrc'
    - 'skywalking-ui/src/types/auto-imports.d.ts'
    - 'skywalking-ui/src/types/components.d.ts'
    - '**/src/main/fbs/istio/**'
    - '**/src/main/proto/envoy/**'
    - '**/src/main/proto/udpa/**'
    - '**/src/main/proto/google/**'
    - '**/src/main/proto/istio/**'
    - '**/src/main/proto/jaeger/**'
    - '**/src/main/proto/mixer/**'
    - '**/src/main/proto/policy/**'
    - '**/src/main/proto/prometheus/client_model/metrics.proto'
    - '**/src/main/proto/protoc-gen-swagger/**'
    - '**/src/main/proto/validate/validate.proto'
    - '**/src/main/proto/opentelemetry/**'
    - 'oap-server/server-starter/src/main/resources/version.properties'
    - '**/mockito-extensions/**'

  comment: on-failure

dependency:
  files:
    - pom.xml
    - skywalking-ui/package.json
  excludes:
    - name: org.openjdk.jmh:jmh-core # We don't distribute the dependencies, they are just for the build process
      recursive: true
    - name: org.apache.skywalking:* # Exclude self dependencies
    - name: org.apache.skywalking:microbench
      recursive: true
  licenses:
    - name: org.slf4j:slf4j-api
      version: 1.7.30,1.7.32
      license: Apache-2.0
    - name: com.squareup.okhttp3:okhttp
      version: 3.14.9,3.12.2
      license: Apache-2.0
    - name: com.google.guava:listenablefuture
      version: 9999.0-empty-to-avoid-conflict-with-guava
      license: Apache-2.0
    - name: io.swagger:swagger-annotations
      version: 1.6.9
      license: Apache-2.0
    - name: com.squareup.okio:okio
      version: 1.15.0,1.17.2
      license: Apache-2.0
    - name: com.squareup.retrofit2:retrofit
      version: 2.3.0,2.5.0
      license: Apache-2.0
    - name: com.squareup.retrofit2:converter-jackson
      version: 2.3.0,2.5.0
      license: Apache-2.0
    - name: com.fasterxml.jackson.module:jackson-module-kotlin
      version: 2.13.4
      license: Apache-2.0
    - name: com.fasterxml.jackson.datatype:jackson-datatype-jsr310
      version: 2.16.1
      license: Apache-2.0
    - name: com.fasterxml.jackson.datatype:jackson-datatype-jdk8
      version: 2.16.1
      license: Apache-2.0
    - name: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml
      version: 2.15.2
      license: Apache-2.0
    - name: com.graphql-java:graphql-java-extended-scalars
      version: 18.1
      license: MIT
    - name: com.graphql-java:graphql-java
      version: 21.0
      license: MIT
    - name: com.github.luben:zstd-jni
      version: 1.4.3-1
      license: BSD-2-Clause
    - name: com.h2database:h2
      version: 2.1.212
      license: MPL-2.0
    - name: org.antlr:antlr4-runtime
      version: 4.11.1
      license: BSD-3-Clause
    - name: com.google.flatbuffers:flatbuffers-java
      version: 1.12.0
      license: Apache-2.0
    - name: build.buf.protoc-gen-validate:pgv-java-stub
      version: 0.6.13
      license: Apache-2.0
    - name: build.buf.protoc-gen-validate:protoc-gen-validate
      version: 0.6.13
      license: Apache-2.0
    - name: com.aayushatharva.brotli4j:service
      version: 1.15.0
      license: Apache-2.0
    - name: io.vertx:vertx-grpc
      version: 4.5.1
      license: EPL-2.0

