#
# 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: # `header` section is configurations for source codes license header.
  license:
    spdx-id: Apache-2.0 # the spdx id of the license, it's convenient when your license is standard SPDX license.
    copyright-owner: Apache Software Foundation # the copyright owner to replace the [owner] in the `spdx-id` template.
    content: | # `license` will be used as the content when `fix` command needs to insert a license header.
      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.
    # `pattern` is optional regexp if all the file headers are the same as `license` or the license of `spdx-id` and `copyright-owner`.
    pattern: |
      Licensed to the Apache Software Foundation under one or more contributor
      license agreements. See the NOTICE file distributed with
      this work for additional information regarding copyright
      ownership. The Apache Software Foundation 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.
  paths: # `paths` are the path list that will be checked (and fixed) by license-eye, default is ['**'].
    - '**'

  paths-ignore: # `paths-ignore` are the path list that will be ignored by license-eye.
    - '.gitignore'
    - 'LICENSE'
    - 'NOTICE'
    - 'DISCLAIMER'
    - '**/*.md'
    - '**/*.versionsBackup'
    - '**/*.log'
    - '**/*.conf'
    - '**/*.txt'
    - '**/*.csv'
    - '**/*.json'
    - '**/*.svg'
    - '**/*.gitattributes'
    - '**/.flattened-pom.xml'
    - '**/.prettierrc'
    - '**/*.MF'
    - '**/.stylelintrc'
    - 'assembly/**'
    - '.github/**/*'
    - '**/target/*'
    - '**/util/StringEncoding.java'
    - '**/go.mod'
    - '**/go.sum'
  comment: on-failure # on what condition license-eye will comment on the pull request, `on-failure`, `always`, `never`.

  # license-location-threshold specifies the index threshold where the license header can be located,
  # after all, a "header" cannot be TOO far from the file start.
  license-location-threshold: 80
