# 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

# apache/openwhisk: exclude empty test (empty.js), and symbolic links (wskadmin, wskdev)
bin/wskadmin
bin/wskdev
tests/dat/actions/empty.js

# apache/openwhisk-apigateway: test dependency exclusions
tests/fakengx.lua
tests/fakeredis.lua

# apache/openwhisk-client-go, apache/openwhisk-wskdeploy Go Lang. autogenerated i18n files
specification/images
wski18n/i18n_resources.go

# apache/openwhisk-runtime-nodejs
node_modules

# Exclude scancode tests that test for bad license headers AND
# Exclude compat.py, gitwildmatch.py, pathspec.py, pattern.py and util.py are mozilla licensed files
scancode/tests/exclude
scancode/lib/compat.py
scancode/lib/gitwildmatch.py
scancode/lib/pathspec.py
scancode/lib/pattern.py
scancode/lib/util.py

[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]
