#
# 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'
    - '.gitattributes'
    - 'LICENSE'
    - 'NOTICE'
    - 'DISCLAIMER'
    - '**/*.versionsBackup'
    - '**/*.versionsBackup'
    - '**/*.proto'
    - '**/*.log'
    - '**/*.txt'
    - '**/*.json'
    - '**/*.conf'
    - '**/*.map'
    - '**/*.properties'
    - '**/RaftRequests.java'
    - 'dist/**/*'
    - 'hugegraph-dist'
    - '**/assembly/static/bin/hugegraph.service'
    - 'scripts/dev/reviewers'
    - 'scripts/dev/reviewers'
    - '**/*.md'
    - '**/dependency-reduced-pom.xml'
    - '**/logs/*.log'
    - '**/META-INF/**/*'
    - '**/target/*'
    - 'style/*'
    - 'ChangeLog'
    - 'CONFIG.ini'
    - 'GROUPS'
    - 'OWNERS'
    - '.github/**/*'
    - '**/*.iml'
    - '**/*.iws'
    - '**/*.ipr'
    - '**/META-INF/MANIFEST.MF'
    - '.repository/**'
    - '**/.flattened-pom.xml'
    - 'hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/SnowflakeIdGenerator.java'
    - '**/optimize/HugeScriptTraversal.java'
    - '**/type/Nameable.java'
    - '**/define/Cardinality.java'
    - '**/util/StringEncoding.java'
    - 'hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherOpProcessor.java'
    - 'hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherPlugin.java'
    - 'hugegraph-dist/src/assembly/static/bin/wait-storage.sh'
  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
