#
# 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:
    # Exclude license copies
    - 'licenses/**'

    # Exclude generated content
    - 'LICENSE'
    - 'NOTICE'
    - 'codestyle/**'

    # Documents
    - '**/*.md'
    - '**/*.MD'
    - '**/*.txt'
    - '**/*.key'
    - '**/*.crt'
    - '**/*.pem'
    - '**/*.json'
    - '**/*.csv'
    - '**/*.log'
    - '**/logs/**'
    - '**/docs/**'

    # Web configure files
    - '**/.env'
    - '**/.env.production'
    - '**/.eslintignore'
    - '**/.eslintrc'
    - '**/.headerignore'
    - '**/.prettierrc'
    - '**/.stylelintrc'
    - '**/build/**'
    - '**/node_modules/**'

    # Git files
    - '**/.gitignore'
    - '**/.gitmodules'
    - '**/.git/**'

    # GitHub
    - '**/.github/**'

    # Intellij IDEA
    - '**/*.iml'
    - '**/.idea/**'

    # Build targets
    - '**/target/**'
    - '**/out/**'
    - '**/dist/**'

    # Test case: certificates used in test cases
    - '**/tubemq-core/src/test/resources/*.keystore'

    # Test case: temporary data for test cases
    - '**/AgentBaseTestsHelper/**'

    # Test case: flink sql comments statement support limit for end2end test cases
    - '**/resources/flinkSql/**'

    # Referenced 3rd codes
    - '**/resources/assets/lib/**'
    - '**/resources/assets/public/**'
    - '**/tubemq-client-cpp/src/any.h'
    - '**/tubemq-client-cpp/src/buffer.h'
    - '**/tubemq-client-cpp/third_party/**'

    # Go mod
    - '**/tubemq-client-go/go.mod'

    # Go sum
    - '**/tubemq-client-go/go.sum'

  comment: on-failure
