# 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
ASFLicenseHeaderMarkdown.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, eol_at_eof, regex_check
*.go=has_block_license, eol_at_eof, regex_check
*.gradle=has_block_license, eol_at_eof, regex_check
*.groovy=has_block_license, eol_at_eof, regex_check
*.html=has_block_license, regex_check
*.java=no_tabs, has_block_license, eol_at_eof, regex_check
*.js=has_block_license, regex_check
*.md=no_tabs, has_block_license, eol_at_eof, regex_check
*.properties=no_tabs, has_block_license, eol_at_eof, regex_check
*.py=no_tabs, has_block_license, eol_at_eof, regex_check
*.scala=has_block_license, no_tabs, eol_at_eof, regex_check
*.sh=has_block_license, eol_at_eof, regex_check
*.swift=no_tabs, has_block_license, eol_at_eof, regex_check
*.yaml=has_block_license, eol_at_eof, regex_check
*.yml=has_block_license, eol_at_eof, regex_check
*.css=has_block_license, eol_at_eof, regex_check
*.tsx=has_block_license, eol_at_eof, regex_check
*.ts=has_block_license, eol_at_eof, regex_check
*.less=has_block_license, eol_at_eof, regex_check
*.toml=has_block_license, eol_at_eof, regex_check
*Dockerfile*=has_block_license
*.lua=has_block_license

# 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
.pydevproject
.rat-excludes
.tox

# Skip files containing MIT License
web/scripts/verifyCommit.js
web/src/components/HeaderDropdown/index.less
web/src/components/HeaderDropdown/index.tsx
web/src/components/NoticeIcon
web/src/components/PageLoading/index.tsx
web/src/components/RightContent
web/src/e2e/__mocks__/antd-pro-merge-less.js
web/src/e2e/baseLayout.e2e.js
web/src/pages/404.tsx
web/src/libs/iconfont.js
api/build-tools/json.lua

# Skip files containing Apache 2.0 License
api/internal/core/store/query.go
api/internal/core/store/selector.go
api/internal/core/store/selector_test.go

# Skip temporarily for CI -- TODO: fix license issue
api/internal/core/store/validate_mock.go
api/internal/core/storage/storage_mock.go

# Skip other necessary files
netlify.toml


# Skip the "build.sh" file. Because "license" is not at the beginning of the file
api/build.sh

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

conf
.actions/openwhisk-utilities

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