# Licensed to the Apache Software Foundation (ASF) under one or more contributor
# license agreements; and to You under the Apache License, Version 2.0.

# scanCode.py configuration file

# List of filenames containing the text of valid license (headers)
# These files SHOULD be in the same directory path where scanCode.py
# resides.
[Licenses]
ASFLicenseHeader.txt
ASFLicenseHeaderBash.txt
ASFLicenseHeaderHash.txt
ASFLicenseHeaderLua.txt

# Filters (path/filename) with wildcards and associated scan checks
# that are to be run against them.  The checks are actual valid
# function names found in scanCode.py.
[Includes]
*=is_not_symlink, regex_check
*.conf=has_block_license, no_trailing_spaces, eol_at_eof, regex_check
*.go=has_block_license, no_trailing_spaces, eol_at_eof, regex_check
*.gradle=has_block_license, no_trailing_spaces, eol_at_eof, regex_check
*.groovy=has_block_license, no_trailing_spaces, eol_at_eof, regex_check
*.html=has_block_license, no_trailing_spaces, eol_at_eof, regex_check
*.java=no_tabs, has_block_license, no_trailing_spaces, eol_at_eof, regex_check
*.js=no_tabs, has_block_license, no_trailing_spaces, eol_at_eof, regex_check
*.lua=has_block_license, no_trailing_spaces, eol_at_eof, regex_check
*.md=no_tabs, has_block_license, no_trailing_spaces, eol_at_eof, regex_check
*.properties=no_tabs, has_block_license, no_trailing_spaces, eol_at_eof, regex_check
*.py=no_tabs, has_block_license, no_trailing_spaces, eol_at_eof, regex_check
*.scala=has_block_license, no_tabs, no_trailing_spaces, eol_at_eof, regex_check
*.sh=has_block_license, no_trailing_spaces, eol_at_eof, regex_check
*.swift=no_tabs, has_block_license, no_trailing_spaces, eol_at_eof, regex_check
*.yaml=has_block_license, no_trailing_spaces, eol_at_eof, regex_check
*.yml=has_block_license, no_trailing_spaces, eol_at_eof, regex_check
*Dockerfile*=has_block_license, no_trailing_spaces

# Sanity check files not required to have ASF headers because either they
# are excluded or are not packaged with the Apache source release.
*.cfg=regex_check
*.ini=regex_check
*.j2=regex_check
*.json=regex_check
*.txt=regex_check
*.xml=regex_check

# List of paths (inclusive of subdirectories) to exclude from code scanning
[Excludes]

# General tooling & binary file exclusions
.bin
.dockerignore
.eslintrc.*
.git
.gitattributes
.github
.gitignore
.gradle
.idea
.jshintrc
.profiling.*
.pydevproject
.rat-excludes
.tox

# Exclude Apache standard legal files
CREDITS.txt
DISCLAIMER.txt
LICENSE*.txt
NOTICE.txt

# Exclude cache and 'vendor' directories created by the `gogradle` build tool
.gogradle
vendor

# Exclude from incubator-openwhisk
# Jenkins/test generated reports
# Test data.
# Generated binary artifacts
tests/build/reports
tests/dat/actions
docs/images
bin

# incubator-openwhisk-apigateway test dependency exclusions
lua_install
tests/lua_modules

# incubator-openwhisk-client-go, incubator-openwhisk-wskdeploy autogenerated Go files
# NOTE: we SHOULD make this more granular, there are many .go files that can have
# ASF license headers
incubator-openwhisk-wskdeploy/specification/images
wski18n

# Exclude scancode tests that test for bad license headers
incubator-openwhisk-utilities/scancode/tests/exclude

[Options]
# Not all code files allow licenses to appear starting at the first character
# of the file. This option tells the scan to allow licenses to appear starting
# within the first 'x' characters of each code file (as provided by this option's
# value).
LICENSE_SLACK_LENGTH=500

# List of regular expressions for forbidden strings, e.g. \w+@company.com
[Regex]
